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