@cynodia/axiom-server 0.6.0-alpha.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,783 @@
1
+ {
2
+ "conformance": "axiom.conformance.v1",
3
+ "name": "argument-validation",
4
+ "covers": [
5
+ "argument validation"
6
+ ],
7
+ "description": "Untrusted arguments are checked against declared parameter types.",
8
+ "principals": {
9
+ "clerk": {
10
+ "field_user_id": "u1",
11
+ "field_user_role": "clerk"
12
+ },
13
+ "admin": {
14
+ "field_user_id": "u2",
15
+ "field_user_role": "admin"
16
+ }
17
+ },
18
+ "serverIR": {
19
+ "contract": "axiom.server.v1",
20
+ "id": "conformance",
21
+ "name": "Conformance",
22
+ "version": "0.6.0",
23
+ "entities": [
24
+ {
25
+ "id": "entity_user",
26
+ "kind": "entity",
27
+ "identityFieldId": "field_user_id",
28
+ "fields": [
29
+ {
30
+ "id": "field_user_id",
31
+ "valueType": {
32
+ "kind": "primitive",
33
+ "primitive": "string"
34
+ },
35
+ "required": true
36
+ },
37
+ {
38
+ "id": "field_user_role",
39
+ "valueType": {
40
+ "kind": "primitive",
41
+ "primitive": "string"
42
+ },
43
+ "required": true
44
+ }
45
+ ]
46
+ },
47
+ {
48
+ "id": "entity_part",
49
+ "kind": "entity",
50
+ "identityFieldId": "field_part_id",
51
+ "fields": [
52
+ {
53
+ "id": "field_part_id",
54
+ "valueType": {
55
+ "kind": "primitive",
56
+ "primitive": "string"
57
+ },
58
+ "required": true
59
+ },
60
+ {
61
+ "id": "field_part_stock",
62
+ "valueType": {
63
+ "kind": "primitive",
64
+ "primitive": "number"
65
+ },
66
+ "required": true
67
+ }
68
+ ]
69
+ },
70
+ {
71
+ "id": "entity_line",
72
+ "kind": "entity",
73
+ "identityFieldId": "field_line_id",
74
+ "fields": [
75
+ {
76
+ "id": "field_line_id",
77
+ "valueType": {
78
+ "kind": "primitive",
79
+ "primitive": "string"
80
+ },
81
+ "required": true
82
+ },
83
+ {
84
+ "id": "field_line_part",
85
+ "valueType": {
86
+ "kind": "primitive",
87
+ "primitive": "string"
88
+ },
89
+ "required": true
90
+ },
91
+ {
92
+ "id": "field_line_qty",
93
+ "valueType": {
94
+ "kind": "primitive",
95
+ "primitive": "number"
96
+ },
97
+ "required": true
98
+ }
99
+ ]
100
+ }
101
+ ],
102
+ "fields": {
103
+ "field_user_id": {
104
+ "entityId": "entity_user",
105
+ "field": {
106
+ "id": "field_user_id",
107
+ "valueType": {
108
+ "kind": "primitive",
109
+ "primitive": "string"
110
+ },
111
+ "required": true
112
+ }
113
+ },
114
+ "field_user_role": {
115
+ "entityId": "entity_user",
116
+ "field": {
117
+ "id": "field_user_role",
118
+ "valueType": {
119
+ "kind": "primitive",
120
+ "primitive": "string"
121
+ },
122
+ "required": true
123
+ }
124
+ },
125
+ "field_part_id": {
126
+ "entityId": "entity_part",
127
+ "field": {
128
+ "id": "field_part_id",
129
+ "valueType": {
130
+ "kind": "primitive",
131
+ "primitive": "string"
132
+ },
133
+ "required": true
134
+ }
135
+ },
136
+ "field_part_stock": {
137
+ "entityId": "entity_part",
138
+ "field": {
139
+ "id": "field_part_stock",
140
+ "valueType": {
141
+ "kind": "primitive",
142
+ "primitive": "number"
143
+ },
144
+ "required": true
145
+ }
146
+ },
147
+ "field_line_id": {
148
+ "entityId": "entity_line",
149
+ "field": {
150
+ "id": "field_line_id",
151
+ "valueType": {
152
+ "kind": "primitive",
153
+ "primitive": "string"
154
+ },
155
+ "required": true
156
+ }
157
+ },
158
+ "field_line_part": {
159
+ "entityId": "entity_line",
160
+ "field": {
161
+ "id": "field_line_part",
162
+ "valueType": {
163
+ "kind": "primitive",
164
+ "primitive": "string"
165
+ },
166
+ "required": true
167
+ }
168
+ },
169
+ "field_line_qty": {
170
+ "entityId": "entity_line",
171
+ "field": {
172
+ "id": "field_line_qty",
173
+ "valueType": {
174
+ "kind": "primitive",
175
+ "primitive": "number"
176
+ },
177
+ "required": true
178
+ }
179
+ }
180
+ },
181
+ "states": [
182
+ {
183
+ "id": "state_parts",
184
+ "kind": "state",
185
+ "name": "parts",
186
+ "authority": "server",
187
+ "valueType": {
188
+ "kind": "collection",
189
+ "itemType": {
190
+ "kind": "entity",
191
+ "entityId": "entity_part"
192
+ }
193
+ },
194
+ "initialValue": [
195
+ {
196
+ "field_part_id": "bolt",
197
+ "field_part_stock": 10
198
+ },
199
+ {
200
+ "field_part_id": "nut",
201
+ "field_part_stock": 5
202
+ }
203
+ ]
204
+ },
205
+ {
206
+ "id": "state_ledger",
207
+ "kind": "state",
208
+ "name": "ledger",
209
+ "authority": "server",
210
+ "valueType": {
211
+ "kind": "collection",
212
+ "itemType": {
213
+ "kind": "primitive",
214
+ "primitive": "number"
215
+ }
216
+ },
217
+ "initialValue": []
218
+ },
219
+ {
220
+ "id": "state_total",
221
+ "kind": "state",
222
+ "name": "total",
223
+ "authority": "server",
224
+ "valueType": {
225
+ "kind": "primitive",
226
+ "primitive": "number"
227
+ },
228
+ "derivation": {
229
+ "kind": "call",
230
+ "function": "sum",
231
+ "arguments": [
232
+ {
233
+ "kind": "map",
234
+ "source": {
235
+ "kind": "ref",
236
+ "targetId": "state_parts"
237
+ },
238
+ "scopeId": "scope_total",
239
+ "projection": {
240
+ "kind": "field",
241
+ "source": {
242
+ "kind": "ref",
243
+ "targetId": "scope_total"
244
+ },
245
+ "fieldId": "field_part_stock"
246
+ }
247
+ }
248
+ ]
249
+ }
250
+ }
251
+ ],
252
+ "actions": {
253
+ "action_take": {
254
+ "id": "action_take",
255
+ "kind": "action",
256
+ "name": "take",
257
+ "parameters": [
258
+ {
259
+ "id": "param_part",
260
+ "valueType": {
261
+ "kind": "primitive",
262
+ "primitive": "string"
263
+ },
264
+ "required": true
265
+ },
266
+ {
267
+ "id": "param_qty",
268
+ "valueType": {
269
+ "kind": "primitive",
270
+ "primitive": "number"
271
+ },
272
+ "required": true
273
+ }
274
+ ],
275
+ "guards": [
276
+ {
277
+ "condition": {
278
+ "kind": "binary",
279
+ "operator": "gt",
280
+ "left": {
281
+ "kind": "ref",
282
+ "targetId": "param_qty"
283
+ },
284
+ "right": {
285
+ "kind": "literal",
286
+ "value": 0
287
+ }
288
+ },
289
+ "failureMode": {
290
+ "code": "invalid-quantity",
291
+ "message": "A quantity must be above zero."
292
+ }
293
+ },
294
+ {
295
+ "condition": {
296
+ "kind": "binary",
297
+ "operator": "gte",
298
+ "left": {
299
+ "kind": "field",
300
+ "source": {
301
+ "kind": "find",
302
+ "source": {
303
+ "kind": "ref",
304
+ "targetId": "state_parts"
305
+ },
306
+ "scopeId": "scope_part",
307
+ "predicate": {
308
+ "kind": "binary",
309
+ "operator": "eq",
310
+ "left": {
311
+ "kind": "field",
312
+ "source": {
313
+ "kind": "ref",
314
+ "targetId": "scope_part"
315
+ },
316
+ "fieldId": "field_part_id"
317
+ },
318
+ "right": {
319
+ "kind": "ref",
320
+ "targetId": "param_part"
321
+ }
322
+ }
323
+ },
324
+ "fieldId": "field_part_stock"
325
+ },
326
+ "right": {
327
+ "kind": "ref",
328
+ "targetId": "param_qty"
329
+ }
330
+ },
331
+ "failureMode": {
332
+ "code": "insufficient-stock",
333
+ "message": "Not enough stock."
334
+ }
335
+ }
336
+ ],
337
+ "operations": [
338
+ {
339
+ "kind": "set",
340
+ "target": {
341
+ "kind": "field",
342
+ "target": {
343
+ "kind": "collection-item",
344
+ "collection": {
345
+ "kind": "state",
346
+ "stateId": "state_parts"
347
+ },
348
+ "selector": {
349
+ "kind": "identity",
350
+ "fieldId": "field_part_id",
351
+ "value": {
352
+ "kind": "ref",
353
+ "targetId": "param_part"
354
+ }
355
+ }
356
+ },
357
+ "fieldId": "field_part_stock"
358
+ },
359
+ "value": {
360
+ "kind": "binary",
361
+ "operator": "subtract",
362
+ "left": {
363
+ "kind": "field",
364
+ "source": {
365
+ "kind": "find",
366
+ "source": {
367
+ "kind": "ref",
368
+ "targetId": "state_parts"
369
+ },
370
+ "scopeId": "scope_part",
371
+ "predicate": {
372
+ "kind": "binary",
373
+ "operator": "eq",
374
+ "left": {
375
+ "kind": "field",
376
+ "source": {
377
+ "kind": "ref",
378
+ "targetId": "scope_part"
379
+ },
380
+ "fieldId": "field_part_id"
381
+ },
382
+ "right": {
383
+ "kind": "ref",
384
+ "targetId": "param_part"
385
+ }
386
+ }
387
+ },
388
+ "fieldId": "field_part_stock"
389
+ },
390
+ "right": {
391
+ "kind": "ref",
392
+ "targetId": "param_qty"
393
+ }
394
+ }
395
+ },
396
+ {
397
+ "kind": "insert",
398
+ "target": {
399
+ "kind": "state",
400
+ "stateId": "state_ledger"
401
+ },
402
+ "value": {
403
+ "kind": "ref",
404
+ "targetId": "param_qty"
405
+ }
406
+ }
407
+ ],
408
+ "preconditions": [
409
+ {
410
+ "kind": "binary",
411
+ "operator": "gt",
412
+ "left": {
413
+ "kind": "ref",
414
+ "targetId": "param_qty"
415
+ },
416
+ "right": {
417
+ "kind": "literal",
418
+ "value": 0
419
+ }
420
+ },
421
+ {
422
+ "kind": "binary",
423
+ "operator": "gte",
424
+ "left": {
425
+ "kind": "field",
426
+ "source": {
427
+ "kind": "find",
428
+ "source": {
429
+ "kind": "ref",
430
+ "targetId": "state_parts"
431
+ },
432
+ "scopeId": "scope_part",
433
+ "predicate": {
434
+ "kind": "binary",
435
+ "operator": "eq",
436
+ "left": {
437
+ "kind": "field",
438
+ "source": {
439
+ "kind": "ref",
440
+ "targetId": "scope_part"
441
+ },
442
+ "fieldId": "field_part_id"
443
+ },
444
+ "right": {
445
+ "kind": "ref",
446
+ "targetId": "param_part"
447
+ }
448
+ }
449
+ },
450
+ "fieldId": "field_part_stock"
451
+ },
452
+ "right": {
453
+ "kind": "ref",
454
+ "targetId": "param_qty"
455
+ }
456
+ }
457
+ ],
458
+ "failureModes": [
459
+ {
460
+ "code": "invalid-quantity",
461
+ "message": "A quantity must be above zero."
462
+ },
463
+ {
464
+ "code": "insufficient-stock",
465
+ "message": "Not enough stock."
466
+ }
467
+ ]
468
+ },
469
+ "action_take_many": {
470
+ "id": "action_take_many",
471
+ "kind": "action",
472
+ "name": "takeMany",
473
+ "parameters": [
474
+ {
475
+ "id": "param_lines",
476
+ "valueType": {
477
+ "kind": "collection",
478
+ "itemType": {
479
+ "kind": "entity",
480
+ "entityId": "entity_line"
481
+ }
482
+ },
483
+ "required": true
484
+ }
485
+ ],
486
+ "operations": [
487
+ {
488
+ "kind": "for-each",
489
+ "collection": {
490
+ "kind": "ref",
491
+ "targetId": "param_lines"
492
+ },
493
+ "scopeId": "scope_line",
494
+ "operations": [
495
+ {
496
+ "kind": "set",
497
+ "target": {
498
+ "kind": "field",
499
+ "target": {
500
+ "kind": "collection-item",
501
+ "collection": {
502
+ "kind": "state",
503
+ "stateId": "state_parts"
504
+ },
505
+ "selector": {
506
+ "kind": "identity",
507
+ "fieldId": "field_part_id",
508
+ "value": {
509
+ "kind": "field",
510
+ "source": {
511
+ "kind": "ref",
512
+ "targetId": "scope_line"
513
+ },
514
+ "fieldId": "field_line_part"
515
+ }
516
+ }
517
+ },
518
+ "fieldId": "field_part_stock"
519
+ },
520
+ "value": {
521
+ "kind": "binary",
522
+ "operator": "subtract",
523
+ "left": {
524
+ "kind": "field",
525
+ "source": {
526
+ "kind": "find",
527
+ "source": {
528
+ "kind": "ref",
529
+ "targetId": "state_parts"
530
+ },
531
+ "scopeId": "scope_part",
532
+ "predicate": {
533
+ "kind": "binary",
534
+ "operator": "eq",
535
+ "left": {
536
+ "kind": "field",
537
+ "source": {
538
+ "kind": "ref",
539
+ "targetId": "scope_part"
540
+ },
541
+ "fieldId": "field_part_id"
542
+ },
543
+ "right": {
544
+ "kind": "field",
545
+ "source": {
546
+ "kind": "ref",
547
+ "targetId": "scope_line"
548
+ },
549
+ "fieldId": "field_line_part"
550
+ }
551
+ }
552
+ },
553
+ "fieldId": "field_part_stock"
554
+ },
555
+ "right": {
556
+ "kind": "field",
557
+ "source": {
558
+ "kind": "ref",
559
+ "targetId": "scope_line"
560
+ },
561
+ "fieldId": "field_line_qty"
562
+ }
563
+ }
564
+ }
565
+ ]
566
+ }
567
+ ],
568
+ "preconditions": [],
569
+ "failureModes": []
570
+ },
571
+ "action_set_stock": {
572
+ "id": "action_set_stock",
573
+ "kind": "action",
574
+ "name": "setStock",
575
+ "authorization": {
576
+ "kind": "binary",
577
+ "operator": "eq",
578
+ "left": {
579
+ "kind": "field",
580
+ "source": {
581
+ "kind": "ref",
582
+ "targetId": "axiom_principal"
583
+ },
584
+ "fieldId": "field_user_role"
585
+ },
586
+ "right": {
587
+ "kind": "literal",
588
+ "value": "admin"
589
+ }
590
+ },
591
+ "parameters": [
592
+ {
593
+ "id": "param_part",
594
+ "valueType": {
595
+ "kind": "primitive",
596
+ "primitive": "string"
597
+ },
598
+ "required": true
599
+ },
600
+ {
601
+ "id": "param_stock",
602
+ "valueType": {
603
+ "kind": "primitive",
604
+ "primitive": "number"
605
+ },
606
+ "required": true
607
+ }
608
+ ],
609
+ "operations": [
610
+ {
611
+ "kind": "set",
612
+ "target": {
613
+ "kind": "field",
614
+ "target": {
615
+ "kind": "collection-item",
616
+ "collection": {
617
+ "kind": "state",
618
+ "stateId": "state_parts"
619
+ },
620
+ "selector": {
621
+ "kind": "identity",
622
+ "fieldId": "field_part_id",
623
+ "value": {
624
+ "kind": "ref",
625
+ "targetId": "param_part"
626
+ }
627
+ }
628
+ },
629
+ "fieldId": "field_part_stock"
630
+ },
631
+ "value": {
632
+ "kind": "ref",
633
+ "targetId": "param_stock"
634
+ }
635
+ }
636
+ ],
637
+ "preconditions": [],
638
+ "failureModes": []
639
+ }
640
+ },
641
+ "constraints": [
642
+ {
643
+ "id": "constraint_stock",
644
+ "kind": "constraint",
645
+ "name": "Stock is never negative",
646
+ "entityId": "entity_part",
647
+ "message": "Stock can never fall below zero.",
648
+ "expression": {
649
+ "kind": "binary",
650
+ "operator": "gte",
651
+ "left": {
652
+ "kind": "field",
653
+ "source": {
654
+ "kind": "ref",
655
+ "targetId": "entity_part"
656
+ },
657
+ "fieldId": "field_part_stock"
658
+ },
659
+ "right": {
660
+ "kind": "literal",
661
+ "value": 0
662
+ }
663
+ }
664
+ }
665
+ ],
666
+ "transitionConstraints": [
667
+ {
668
+ "id": "transition_falls",
669
+ "kind": "transition-constraint",
670
+ "name": "Stock only falls",
671
+ "entityId": "entity_part",
672
+ "previousScopeId": "scope_previous",
673
+ "proposedScopeId": "scope_proposed",
674
+ "message": "Stock may not be raised.",
675
+ "expression": {
676
+ "kind": "binary",
677
+ "operator": "lte",
678
+ "left": {
679
+ "kind": "field",
680
+ "source": {
681
+ "kind": "ref",
682
+ "targetId": "scope_proposed"
683
+ },
684
+ "fieldId": "field_part_stock"
685
+ },
686
+ "right": {
687
+ "kind": "field",
688
+ "source": {
689
+ "kind": "ref",
690
+ "targetId": "scope_previous"
691
+ },
692
+ "fieldId": "field_part_stock"
693
+ }
694
+ }
695
+ }
696
+ ],
697
+ "principalEntityId": "entity_user",
698
+ "observableStateIds": [
699
+ "state_parts",
700
+ "state_ledger",
701
+ "state_total"
702
+ ]
703
+ },
704
+ "initialState": [
705
+ {
706
+ "stateId": "state_parts",
707
+ "value": [
708
+ {
709
+ "field_part_id": "bolt",
710
+ "field_part_stock": 10
711
+ },
712
+ {
713
+ "field_part_id": "nut",
714
+ "field_part_stock": 5
715
+ }
716
+ ],
717
+ "revision": 1
718
+ }
719
+ ],
720
+ "invocations": [
721
+ {
722
+ "actionId": "action_take",
723
+ "arguments": {
724
+ "param_part": "bolt",
725
+ "param_qty": "three"
726
+ },
727
+ "expect": {
728
+ "ok": false,
729
+ "diagnosticCodes": [
730
+ "ARGUMENT_TYPE_MISMATCH"
731
+ ]
732
+ }
733
+ },
734
+ {
735
+ "actionId": "action_take",
736
+ "arguments": {
737
+ "param_part": "bolt"
738
+ },
739
+ "expect": {
740
+ "ok": false,
741
+ "diagnosticCodes": [
742
+ "ARGUMENT_TYPE_MISMATCH"
743
+ ]
744
+ }
745
+ },
746
+ {
747
+ "actionId": "action_take",
748
+ "arguments": {
749
+ "param_part": "bolt",
750
+ "param_qty": 1,
751
+ "extra": true
752
+ },
753
+ "expect": {
754
+ "ok": false,
755
+ "diagnosticCodes": [
756
+ "ARGUMENT_TYPE_MISMATCH"
757
+ ]
758
+ }
759
+ },
760
+ {
761
+ "actionId": "action_not_here",
762
+ "arguments": {},
763
+ "expect": {
764
+ "ok": false,
765
+ "diagnosticCodes": [
766
+ "UNKNOWN_SERVER_ACTION"
767
+ ]
768
+ }
769
+ }
770
+ ],
771
+ "expectedState": {
772
+ "state_parts": [
773
+ {
774
+ "field_part_id": "bolt",
775
+ "field_part_stock": 10
776
+ },
777
+ {
778
+ "field_part_id": "nut",
779
+ "field_part_stock": 5
780
+ }
781
+ ]
782
+ }
783
+ }