@twin.org/auditable-item-graph-service 0.0.3-next.2 → 0.0.3-next.21

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.
Files changed (38) hide show
  1. package/README.md +3 -1
  2. package/dist/es/auditableItemGraphRoutes.js +609 -44
  3. package/dist/es/auditableItemGraphRoutes.js.map +1 -1
  4. package/dist/es/auditableItemGraphService.js +714 -159
  5. package/dist/es/auditableItemGraphService.js.map +1 -1
  6. package/dist/es/entities/auditableItemGraphAlias.js +8 -0
  7. package/dist/es/entities/auditableItemGraphAlias.js.map +1 -1
  8. package/dist/es/entities/auditableItemGraphChangeset.js +8 -0
  9. package/dist/es/entities/auditableItemGraphChangeset.js.map +1 -1
  10. package/dist/es/entities/auditableItemGraphVertex.js +8 -0
  11. package/dist/es/entities/auditableItemGraphVertex.js.map +1 -1
  12. package/dist/es/models/IAuditableItemGraphServiceConstructorOptions.js.map +1 -1
  13. package/dist/types/auditableItemGraphRoutes.d.ts +42 -2
  14. package/dist/types/auditableItemGraphService.d.ts +81 -55
  15. package/dist/types/entities/auditableItemGraphAlias.d.ts +4 -0
  16. package/dist/types/entities/auditableItemGraphChangeset.d.ts +4 -0
  17. package/dist/types/entities/auditableItemGraphVertex.d.ts +4 -0
  18. package/dist/types/models/IAuditableItemGraphServiceConstructorOptions.d.ts +4 -0
  19. package/docs/changelog.md +370 -71
  20. package/docs/examples.md +241 -1
  21. package/docs/open-api/spec.json +1218 -220
  22. package/docs/reference/classes/AuditableItemGraphAlias.md +18 -10
  23. package/docs/reference/classes/AuditableItemGraphChangeset.md +16 -8
  24. package/docs/reference/classes/AuditableItemGraphEdge.md +10 -10
  25. package/docs/reference/classes/AuditableItemGraphPatch.md +6 -6
  26. package/docs/reference/classes/AuditableItemGraphResource.md +9 -9
  27. package/docs/reference/classes/AuditableItemGraphService.md +221 -59
  28. package/docs/reference/classes/AuditableItemGraphVertex.md +26 -18
  29. package/docs/reference/functions/auditableItemGraphChangesetGet.md +31 -0
  30. package/docs/reference/functions/auditableItemGraphChangesetList.md +31 -0
  31. package/docs/reference/functions/auditableItemGraphUpdate.md +1 -1
  32. package/docs/reference/functions/auditableItemGraphUpdatePartial.md +31 -0
  33. package/docs/reference/functions/auditableItemGraphVersionGet.md +31 -0
  34. package/docs/reference/functions/auditableItemGraphVersionList.md +31 -0
  35. package/docs/reference/index.md +5 -0
  36. package/docs/reference/interfaces/IAuditableItemGraphServiceConstructorOptions.md +18 -10
  37. package/locales/en.json +7 -2
  38. package/package.json +6 -6
@@ -2,9 +2,9 @@
2
2
  // SPDX-License-Identifier: Apache-2.0.
3
3
  import { HttpParameterHelper } from "@twin.org/api-models";
4
4
  import { AuditableItemGraphContexts, AuditableItemGraphTypes } from "@twin.org/auditable-item-graph-models";
5
- import { Coerce, ComponentFactory, Guards } from "@twin.org/core";
5
+ import { Coerce, ComponentFactory, Guards, Is } from "@twin.org/core";
6
6
  import { SchemaOrgContexts, SchemaOrgTypes } from "@twin.org/standards-schema-org";
7
- import { HeaderTypes, HttpStatusCode, MimeTypes } from "@twin.org/web";
7
+ import { HeaderHelper, HeaderTypes, HttpStatusCode, MimeTypes } from "@twin.org/web";
8
8
  /**
9
9
  * The source used when communicating about these routes.
10
10
  */
@@ -39,6 +39,11 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
39
39
  id: "auditableItemGraphCreateRequestExample",
40
40
  request: {
41
41
  body: {
42
+ "@context": [
43
+ AuditableItemGraphContexts.Context,
44
+ AuditableItemGraphContexts.ContextCommon
45
+ ],
46
+ type: AuditableItemGraphTypes.Vertex,
42
47
  annotationObject: {
43
48
  "@context": "https://schema.org",
44
49
  "@type": "Note",
@@ -46,6 +51,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
46
51
  },
47
52
  aliases: [
48
53
  {
54
+ type: AuditableItemGraphTypes.Alias,
49
55
  id: "bar456",
50
56
  annotationObject: {
51
57
  "@context": "https://schema.org",
@@ -54,6 +60,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
54
60
  }
55
61
  },
56
62
  {
63
+ type: AuditableItemGraphTypes.Alias,
57
64
  id: "foo321",
58
65
  annotationObject: {
59
66
  "@context": "https://schema.org",
@@ -64,6 +71,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
64
71
  ],
65
72
  resources: [
66
73
  {
74
+ type: AuditableItemGraphTypes.Resource,
67
75
  id: "resource1",
68
76
  resourceObject: {
69
77
  "@context": "https://schema.org",
@@ -72,6 +80,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
72
80
  }
73
81
  },
74
82
  {
83
+ type: AuditableItemGraphTypes.Resource,
75
84
  id: "resource2",
76
85
  resourceObject: {
77
86
  "@context": "https://schema.org",
@@ -82,6 +91,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
82
91
  ],
83
92
  edges: [
84
93
  {
94
+ type: AuditableItemGraphTypes.Edge,
85
95
  targetId: "aig:1234567890",
86
96
  edgeRelationships: ["frenemy"],
87
97
  annotationObject: {
@@ -91,6 +101,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
91
101
  }
92
102
  },
93
103
  {
104
+ type: AuditableItemGraphTypes.Edge,
94
105
  targetId: "aig:45678901234",
95
106
  edgeRelationships: ["end"],
96
107
  annotationObject: {
@@ -115,7 +126,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
115
126
  response: {
116
127
  statusCode: HttpStatusCode.created,
117
128
  headers: {
118
- [HeaderTypes.Location]: "aig:1234567890"
129
+ [HeaderTypes.Location]: "aig%3A1234567890"
119
130
  }
120
131
  }
121
132
  }
@@ -155,9 +166,9 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
155
166
  response: {
156
167
  body: {
157
168
  "@context": [
158
- AuditableItemGraphContexts.Namespace,
159
- AuditableItemGraphContexts.NamespaceCommon,
160
- SchemaOrgContexts.Namespace
169
+ AuditableItemGraphContexts.Context,
170
+ AuditableItemGraphContexts.ContextCommon,
171
+ SchemaOrgContexts.Context
161
172
  ],
162
173
  type: AuditableItemGraphTypes.Vertex,
163
174
  id: "aig:1234567890",
@@ -171,9 +182,9 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
171
182
  aliases: [
172
183
  {
173
184
  "@context": [
174
- AuditableItemGraphContexts.Namespace,
175
- AuditableItemGraphContexts.NamespaceCommon,
176
- SchemaOrgContexts.Namespace
185
+ AuditableItemGraphContexts.Context,
186
+ AuditableItemGraphContexts.ContextCommon,
187
+ SchemaOrgContexts.Context
177
188
  ],
178
189
  type: AuditableItemGraphTypes.Alias,
179
190
  id: "tst:1234567890",
@@ -197,9 +208,9 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
197
208
  },
198
209
  body: {
199
210
  "@context": [
200
- AuditableItemGraphContexts.Namespace,
201
- AuditableItemGraphContexts.NamespaceCommon,
202
- SchemaOrgContexts.Namespace
211
+ AuditableItemGraphContexts.Context,
212
+ AuditableItemGraphContexts.ContextCommon,
213
+ SchemaOrgContexts.Context
203
214
  ],
204
215
  type: AuditableItemGraphTypes.Vertex,
205
216
  id: "aig:1234567890",
@@ -213,9 +224,9 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
213
224
  aliases: [
214
225
  {
215
226
  "@context": [
216
- AuditableItemGraphContexts.Namespace,
217
- AuditableItemGraphContexts.NamespaceCommon,
218
- SchemaOrgContexts.Namespace
227
+ AuditableItemGraphContexts.Context,
228
+ AuditableItemGraphContexts.ContextCommon,
229
+ SchemaOrgContexts.Context
219
230
  ],
220
231
  type: AuditableItemGraphTypes.Alias,
221
232
  dateCreated: "2024-08-22T11:55:16.271Z",
@@ -229,6 +240,377 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
229
240
  }
230
241
  ]
231
242
  };
243
+ const getChangesetRoute = {
244
+ operationId: "auditableItemGraphChangesetGet",
245
+ summary: "Get a graph vertex changeset",
246
+ tag: tagsAuditableItemGraph[0].name,
247
+ method: "GET",
248
+ path: `${baseRouteName}/:id/changesets/:changesetId`,
249
+ handler: async (httpRequestContext, request) => auditableItemGraphChangesetGet(httpRequestContext, componentName, request),
250
+ requestType: {
251
+ type: "IAuditableItemGraphChangesetGetRequest",
252
+ examples: [
253
+ {
254
+ id: "auditableItemGraphChangesetGetRequestExample",
255
+ request: {
256
+ headers: {
257
+ [HeaderTypes.Accept]: MimeTypes.Json
258
+ },
259
+ pathParams: {
260
+ id: "aig:1234567890",
261
+ changesetId: "changeset:1234567890"
262
+ }
263
+ }
264
+ }
265
+ ]
266
+ },
267
+ responseType: [
268
+ {
269
+ type: "IAuditableItemGraphChangesetGetResponse",
270
+ examples: [
271
+ {
272
+ id: "auditableItemGraphChangesetGetResponseExample",
273
+ response: {
274
+ body: {
275
+ "@context": [
276
+ AuditableItemGraphContexts.Context,
277
+ AuditableItemGraphContexts.ContextCommon
278
+ ],
279
+ type: AuditableItemGraphTypes.Changeset,
280
+ id: "aig:1234567890",
281
+ dateCreated: "2024-08-22T11:55:16.271Z",
282
+ patches: [
283
+ {
284
+ type: "AuditableItemGraphPatchOperation",
285
+ patchOperation: "add",
286
+ patchPath: "/annotationObject",
287
+ patchValue: {
288
+ "@context": "https://www.w3.org/ns/activitystreams",
289
+ type: "Create",
290
+ actor: { type: "Person", id: "acct:person@example.org", name: "Person" },
291
+ object: { type: "Note", content: "This is a simple note" },
292
+ published: "2015-01-25T12:34:56Z"
293
+ }
294
+ },
295
+ {
296
+ type: "AuditableItemGraphPatchOperation",
297
+ patchOperation: "add",
298
+ patchPath: "/aliases",
299
+ patchValue: [
300
+ { id: "foo123", dateCreated: "2015-01-25T12:34:56Z" },
301
+ { id: "bar456", dateCreated: "2015-01-25T12:34:56Z" }
302
+ ]
303
+ }
304
+ ],
305
+ verification: {
306
+ "@context": "https://schema.twindev.org/immutable-proof/",
307
+ type: "ImmutableProofVerification",
308
+ verified: true
309
+ }
310
+ }
311
+ }
312
+ }
313
+ ]
314
+ },
315
+ {
316
+ type: "IAuditableItemGraphChangesetGetResponse",
317
+ mimeType: MimeTypes.JsonLd,
318
+ examples: [
319
+ {
320
+ id: "auditableItemGraphChangesetJsonLdGetResponseExample",
321
+ response: {
322
+ headers: {
323
+ [HeaderTypes.ContentType]: MimeTypes.JsonLd
324
+ },
325
+ body: {
326
+ "@context": [
327
+ AuditableItemGraphContexts.Context,
328
+ AuditableItemGraphContexts.ContextCommon,
329
+ SchemaOrgContexts.Context
330
+ ],
331
+ type: AuditableItemGraphTypes.Changeset,
332
+ id: "aig:1234567890",
333
+ dateCreated: "2024-08-22T11:55:16.271Z",
334
+ patches: [
335
+ {
336
+ type: "AuditableItemGraphPatchOperation",
337
+ patchOperation: "add",
338
+ patchPath: "/annotationObject",
339
+ patchValue: {
340
+ "@context": "https://www.w3.org/ns/activitystreams",
341
+ type: "Create",
342
+ actor: { type: "Person", id: "acct:person@example.org", name: "Person" },
343
+ object: { type: "Note", content: "This is a simple note" },
344
+ published: "2015-01-25T12:34:56Z"
345
+ }
346
+ },
347
+ {
348
+ type: "AuditableItemGraphPatchOperation",
349
+ patchOperation: "add",
350
+ patchPath: "/aliases",
351
+ patchValue: [
352
+ { id: "foo123", dateCreated: "2015-01-25T12:34:56Z" },
353
+ { id: "bar456", dateCreated: "2015-01-25T12:34:56Z" }
354
+ ]
355
+ }
356
+ ],
357
+ verification: {
358
+ "@context": "https://schema.twindev.org/immutable-proof/",
359
+ type: "ImmutableProofVerification",
360
+ verified: true
361
+ }
362
+ }
363
+ }
364
+ }
365
+ ]
366
+ }
367
+ ]
368
+ };
369
+ const getChangesetListRoute = {
370
+ operationId: "auditableItemGraphChangesetList",
371
+ summary: "Get a list of graph vertex changesets",
372
+ tag: tagsAuditableItemGraph[0].name,
373
+ method: "GET",
374
+ path: `${baseRouteName}/:id/changesets`,
375
+ handler: async (httpRequestContext, request) => auditableItemGraphChangesetList(httpRequestContext, componentName, request),
376
+ requestType: {
377
+ type: "IAuditableItemGraphChangesetListRequest",
378
+ examples: [
379
+ {
380
+ id: "auditableItemGraphChangesetListRequestExample",
381
+ request: {
382
+ headers: {
383
+ [HeaderTypes.Accept]: MimeTypes.Json
384
+ },
385
+ pathParams: {
386
+ id: "aig:1234567890"
387
+ }
388
+ }
389
+ }
390
+ ]
391
+ },
392
+ responseType: [
393
+ {
394
+ type: "IAuditableItemGraphChangesetListResponse",
395
+ examples: [
396
+ {
397
+ id: "auditableItemGraphChangesetListResponseExample",
398
+ response: {
399
+ body: {
400
+ "@context": [
401
+ SchemaOrgContexts.Context,
402
+ AuditableItemGraphContexts.Context,
403
+ AuditableItemGraphContexts.ContextCommon
404
+ ],
405
+ type: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.ChangesetList],
406
+ [SchemaOrgTypes.ItemListElement]: [
407
+ {
408
+ type: AuditableItemGraphTypes.Changeset,
409
+ id: "aig:1234567890",
410
+ dateCreated: "2024-08-22T11:55:16.271Z",
411
+ patches: [
412
+ {
413
+ type: "AuditableItemGraphPatchOperation",
414
+ patchOperation: "add",
415
+ patchPath: "/annotationObject",
416
+ patchValue: {
417
+ "@context": "https://www.w3.org/ns/activitystreams",
418
+ type: "Create",
419
+ actor: { type: "Person", id: "acct:person@example.org", name: "Person" },
420
+ object: { type: "Note", content: "This is a simple note" },
421
+ published: "2015-01-25T12:34:56Z"
422
+ }
423
+ },
424
+ {
425
+ type: "AuditableItemGraphPatchOperation",
426
+ patchOperation: "add",
427
+ patchPath: "/aliases",
428
+ patchValue: [
429
+ { id: "foo123", dateCreated: "2015-01-25T12:34:56Z" },
430
+ { id: "bar456", dateCreated: "2015-01-25T12:34:56Z" }
431
+ ]
432
+ }
433
+ ],
434
+ verification: {
435
+ "@context": "https://schema.twindev.org/immutable-proof/",
436
+ type: "ImmutableProofVerification",
437
+ verified: true
438
+ }
439
+ }
440
+ ]
441
+ }
442
+ }
443
+ }
444
+ ]
445
+ },
446
+ {
447
+ type: "IAuditableItemGraphChangesetGetResponse",
448
+ mimeType: MimeTypes.JsonLd,
449
+ examples: [
450
+ {
451
+ id: "auditableItemGraphChangesetJsonLdGetResponseExample",
452
+ response: {
453
+ headers: {
454
+ [HeaderTypes.ContentType]: MimeTypes.JsonLd
455
+ },
456
+ body: {
457
+ "@context": [
458
+ SchemaOrgContexts.Context,
459
+ AuditableItemGraphContexts.Context,
460
+ AuditableItemGraphContexts.ContextCommon,
461
+ SchemaOrgContexts.Context
462
+ ],
463
+ type: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.ChangesetList],
464
+ [SchemaOrgTypes.ItemListElement]: [
465
+ {
466
+ type: AuditableItemGraphTypes.Changeset,
467
+ id: "aig:1234567890",
468
+ dateCreated: "2024-08-22T11:55:16.271Z",
469
+ patches: [
470
+ {
471
+ type: "AuditableItemGraphPatchOperation",
472
+ patchOperation: "add",
473
+ patchPath: "/annotationObject",
474
+ patchValue: {
475
+ "@context": "https://www.w3.org/ns/activitystreams",
476
+ type: "Create",
477
+ actor: { type: "Person", id: "acct:person@example.org", name: "Person" },
478
+ object: { type: "Note", content: "This is a simple note" },
479
+ published: "2015-01-25T12:34:56Z"
480
+ }
481
+ },
482
+ {
483
+ type: "AuditableItemGraphPatchOperation",
484
+ patchOperation: "add",
485
+ patchPath: "/aliases",
486
+ patchValue: [
487
+ { id: "foo123", dateCreated: "2015-01-25T12:34:56Z" },
488
+ { id: "bar456", dateCreated: "2015-01-25T12:34:56Z" }
489
+ ]
490
+ }
491
+ ],
492
+ verification: {
493
+ "@context": "https://schema.twindev.org/immutable-proof/",
494
+ type: "ImmutableProofVerification",
495
+ verified: true
496
+ }
497
+ }
498
+ ]
499
+ }
500
+ }
501
+ }
502
+ ]
503
+ }
504
+ ]
505
+ };
506
+ const getVersionRoute = {
507
+ operationId: "auditableItemGraphVersionGet",
508
+ summary: "Get a graph vertex at a specific version",
509
+ tag: tagsAuditableItemGraph[0].name,
510
+ method: "GET",
511
+ path: `${baseRouteName}/:id/versions/:version`,
512
+ handler: async (httpRequestContext, request) => auditableItemGraphVersionGet(httpRequestContext, componentName, request),
513
+ requestType: {
514
+ type: "IAuditableItemGraphVersionGetRequest",
515
+ examples: [
516
+ {
517
+ id: "auditableItemGraphVersionGetRequestExample",
518
+ request: {
519
+ headers: {
520
+ [HeaderTypes.Accept]: MimeTypes.Json
521
+ },
522
+ pathParams: {
523
+ id: "aig:1234567890",
524
+ version: "1"
525
+ }
526
+ }
527
+ }
528
+ ]
529
+ },
530
+ responseType: [
531
+ {
532
+ type: "IAuditableItemGraphVersionGetResponse",
533
+ examples: [
534
+ {
535
+ id: "auditableItemGraphVersionGetResponseExample",
536
+ response: {
537
+ body: {
538
+ "@context": [
539
+ AuditableItemGraphContexts.Context,
540
+ AuditableItemGraphContexts.ContextCommon,
541
+ SchemaOrgContexts.Context
542
+ ],
543
+ type: AuditableItemGraphTypes.Vertex,
544
+ id: "aig:1234567890",
545
+ dateCreated: "2024-08-22T11:55:16.271Z",
546
+ version: 1
547
+ }
548
+ }
549
+ }
550
+ ]
551
+ }
552
+ ]
553
+ };
554
+ const getVersionListRoute = {
555
+ operationId: "auditableItemGraphVersionList",
556
+ summary: "Get all versions of a graph vertex",
557
+ tag: tagsAuditableItemGraph[0].name,
558
+ method: "GET",
559
+ path: `${baseRouteName}/:id/versions`,
560
+ handler: async (httpRequestContext, request) => auditableItemGraphVersionList(httpRequestContext, componentName, request),
561
+ requestType: {
562
+ type: "IAuditableItemGraphVersionListRequest",
563
+ examples: [
564
+ {
565
+ id: "auditableItemGraphVersionListRequestExample",
566
+ request: {
567
+ headers: {
568
+ [HeaderTypes.Accept]: MimeTypes.Json
569
+ },
570
+ pathParams: {
571
+ id: "aig:1234567890"
572
+ }
573
+ }
574
+ },
575
+ {
576
+ id: "auditableItemGraphVersionListAfterRequestExample",
577
+ request: {
578
+ pathParams: {
579
+ id: "aig:1234567890"
580
+ },
581
+ query: {
582
+ after: "2026-04-03T12:00:00Z"
583
+ }
584
+ }
585
+ }
586
+ ]
587
+ },
588
+ responseType: [
589
+ {
590
+ type: "IAuditableItemGraphVersionListResponse",
591
+ examples: [
592
+ {
593
+ id: "auditableItemGraphVersionListResponseExample",
594
+ response: {
595
+ body: {
596
+ "@context": [
597
+ SchemaOrgContexts.Context,
598
+ AuditableItemGraphContexts.Context,
599
+ AuditableItemGraphContexts.ContextCommon
600
+ ],
601
+ type: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexVersionList],
602
+ [SchemaOrgTypes.ItemListElement]: [
603
+ { version: 0, dateCreated: "2024-08-22T11:55:16.271Z" },
604
+ { version: 1, dateCreated: "2024-08-22T11:56:00.000Z" },
605
+ { version: 2, dateCreated: "2024-08-22T11:57:00.000Z" }
606
+ ]
607
+ }
608
+ }
609
+ }
610
+ ]
611
+ }
612
+ ]
613
+ };
232
614
  const updateRoute = {
233
615
  operationId: "auditableItemGraphUpdate",
234
616
  summary: "Update a graph vertex",
@@ -246,6 +628,11 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
246
628
  id: "aig:1234567890"
247
629
  },
248
630
  body: {
631
+ "@context": [
632
+ AuditableItemGraphContexts.Context,
633
+ AuditableItemGraphContexts.ContextCommon
634
+ ],
635
+ type: AuditableItemGraphTypes.Vertex,
249
636
  annotationObject: {
250
637
  "@context": "https://schema.org",
251
638
  "@type": "Note",
@@ -253,6 +640,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
253
640
  },
254
641
  aliases: [
255
642
  {
643
+ type: AuditableItemGraphTypes.Alias,
256
644
  id: "bar456",
257
645
  annotationObject: {
258
646
  "@context": "https://schema.org",
@@ -261,6 +649,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
261
649
  }
262
650
  },
263
651
  {
652
+ type: AuditableItemGraphTypes.Alias,
264
653
  id: "foo321",
265
654
  annotationObject: {
266
655
  "@context": "https://schema.org",
@@ -271,6 +660,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
271
660
  ],
272
661
  resources: [
273
662
  {
663
+ type: AuditableItemGraphTypes.Resource,
274
664
  id: "resource1",
275
665
  resourceObject: {
276
666
  "@context": "https://schema.org",
@@ -279,6 +669,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
279
669
  }
280
670
  },
281
671
  {
672
+ type: AuditableItemGraphTypes.Resource,
282
673
  id: "resource2",
283
674
  resourceObject: {
284
675
  "@context": "https://schema.org",
@@ -289,6 +680,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
289
680
  ],
290
681
  edges: [
291
682
  {
683
+ type: AuditableItemGraphTypes.Edge,
292
684
  id: "edge1",
293
685
  targetId: "aig:1234567890",
294
686
  edgeRelationships: ["frenemy"],
@@ -299,6 +691,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
299
691
  }
300
692
  },
301
693
  {
694
+ type: AuditableItemGraphTypes.Edge,
302
695
  id: "edge2",
303
696
  targetId: "aig:45678901234",
304
697
  edgeRelationships: ["end"],
@@ -320,6 +713,47 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
320
713
  }
321
714
  ]
322
715
  };
716
+ const updatePartialRoute = {
717
+ operationId: "auditableItemGraphUpdatePartial",
718
+ summary: "Partially update a graph vertex",
719
+ tag: tagsAuditableItemGraph[0].name,
720
+ method: "PATCH",
721
+ path: `${baseRouteName}/:id`,
722
+ handler: async (httpRequestContext, request) => auditableItemGraphUpdatePartial(httpRequestContext, componentName, request),
723
+ requestType: {
724
+ type: "IAuditableItemGraphUpdatePartialRequest",
725
+ examples: [
726
+ {
727
+ id: "auditableItemGraphUpdatePartialRequestExample",
728
+ request: {
729
+ pathParams: {
730
+ id: "aig:1234567890"
731
+ },
732
+ body: {
733
+ "@context": [
734
+ AuditableItemGraphContexts.Context,
735
+ AuditableItemGraphContexts.ContextCommon
736
+ ],
737
+ edgePatches: {
738
+ add: [
739
+ {
740
+ type: AuditableItemGraphTypes.Edge,
741
+ targetId: "aig:45678901234",
742
+ edgeRelationships: ["document"]
743
+ }
744
+ ]
745
+ }
746
+ }
747
+ }
748
+ }
749
+ ]
750
+ },
751
+ responseType: [
752
+ {
753
+ type: "INoContentResponse"
754
+ }
755
+ ]
756
+ };
323
757
  const listRoute = {
324
758
  operationId: "auditableItemGraphList",
325
759
  summary: "Query graph vertices by id or alias",
@@ -353,17 +787,17 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
353
787
  response: {
354
788
  body: {
355
789
  "@context": [
356
- SchemaOrgContexts.Namespace,
357
- AuditableItemGraphContexts.Namespace,
358
- AuditableItemGraphContexts.NamespaceCommon
790
+ SchemaOrgContexts.Context,
791
+ AuditableItemGraphContexts.Context,
792
+ AuditableItemGraphContexts.ContextCommon
359
793
  ],
360
794
  type: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexList],
361
795
  [SchemaOrgTypes.ItemListElement]: [
362
796
  {
363
797
  "@context": [
364
- AuditableItemGraphContexts.Namespace,
365
- AuditableItemGraphContexts.NamespaceCommon,
366
- SchemaOrgContexts.Namespace
798
+ AuditableItemGraphContexts.Context,
799
+ AuditableItemGraphContexts.ContextCommon,
800
+ SchemaOrgContexts.Context
367
801
  ],
368
802
  type: AuditableItemGraphTypes.Vertex,
369
803
  id: "0101010101010101010101010101010101010101010101010101010101010101",
@@ -371,9 +805,9 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
371
805
  aliases: [
372
806
  {
373
807
  "@context": [
374
- AuditableItemGraphContexts.Namespace,
375
- AuditableItemGraphContexts.NamespaceCommon,
376
- SchemaOrgContexts.Namespace
808
+ AuditableItemGraphContexts.Context,
809
+ AuditableItemGraphContexts.ContextCommon,
810
+ SchemaOrgContexts.Context
377
811
  ],
378
812
  type: AuditableItemGraphTypes.Alias,
379
813
  id: "foo4",
@@ -381,8 +815,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
381
815
  }
382
816
  ]
383
817
  }
384
- ],
385
- [SchemaOrgTypes.NextItem]: "1"
818
+ ]
386
819
  }
387
820
  }
388
821
  }
@@ -400,17 +833,17 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
400
833
  },
401
834
  body: {
402
835
  "@context": [
403
- SchemaOrgContexts.Namespace,
404
- AuditableItemGraphContexts.Namespace,
405
- AuditableItemGraphContexts.NamespaceCommon
836
+ SchemaOrgContexts.Context,
837
+ AuditableItemGraphContexts.Context,
838
+ AuditableItemGraphContexts.ContextCommon
406
839
  ],
407
840
  type: [SchemaOrgTypes.ItemList, AuditableItemGraphTypes.VertexList],
408
841
  [SchemaOrgTypes.ItemListElement]: [
409
842
  {
410
843
  "@context": [
411
- AuditableItemGraphContexts.Namespace,
412
- AuditableItemGraphContexts.NamespaceCommon,
413
- SchemaOrgContexts.Namespace
844
+ AuditableItemGraphContexts.Context,
845
+ AuditableItemGraphContexts.ContextCommon,
846
+ SchemaOrgContexts.Context
414
847
  ],
415
848
  type: AuditableItemGraphTypes.Vertex,
416
849
  id: "0101010101010101010101010101010101010101010101010101010101010101",
@@ -418,9 +851,9 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
418
851
  aliases: [
419
852
  {
420
853
  "@context": [
421
- AuditableItemGraphContexts.Namespace,
422
- AuditableItemGraphContexts.NamespaceCommon,
423
- SchemaOrgContexts.Namespace
854
+ AuditableItemGraphContexts.Context,
855
+ AuditableItemGraphContexts.ContextCommon,
856
+ SchemaOrgContexts.Context
424
857
  ],
425
858
  type: AuditableItemGraphTypes.Alias,
426
859
  id: "foo4",
@@ -428,8 +861,7 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
428
861
  }
429
862
  ]
430
863
  }
431
- ],
432
- [SchemaOrgTypes.NextItem]: "1"
864
+ ]
433
865
  }
434
866
  }
435
867
  }
@@ -437,7 +869,17 @@ export function generateRestRoutesAuditableItemGraph(baseRouteName, componentNam
437
869
  }
438
870
  ]
439
871
  };
440
- return [createRoute, getRoute, updateRoute, listRoute];
872
+ return [
873
+ createRoute,
874
+ getRoute,
875
+ getVersionRoute,
876
+ getVersionListRoute,
877
+ getChangesetRoute,
878
+ getChangesetListRoute,
879
+ updateRoute,
880
+ updatePartialRoute,
881
+ listRoute
882
+ ];
441
883
  }
442
884
  /**
443
885
  * Create the graph vertex.
@@ -469,22 +911,74 @@ export async function auditableItemGraphGet(httpRequestContext, componentName, r
469
911
  Guards.object(ROUTES_SOURCE, "request", request);
470
912
  Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
471
913
  Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
472
- const mimeType = request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? "jsonld" : "json";
473
914
  const component = ComponentFactory.get(componentName);
474
915
  const result = await component.get(request.pathParams.id, {
475
916
  includeDeleted: Coerce.boolean(request.query?.includeDeleted),
476
- includeChangesets: Coerce.boolean(request.query?.includeChangesets),
477
917
  verifySignatureDepth: request.query?.verifySignatureDepth
478
918
  });
479
919
  return {
480
920
  headers: {
481
- [HeaderTypes.ContentType]: mimeType === "json" ? MimeTypes.Json : MimeTypes.JsonLd
921
+ [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd
922
+ ? MimeTypes.JsonLd
923
+ : MimeTypes.Json
924
+ },
925
+ body: result
926
+ };
927
+ }
928
+ /**
929
+ * Get the graph vertex changeset list.
930
+ * @param httpRequestContext The request context for the API.
931
+ * @param componentName The name of the component to use in the routes.
932
+ * @param request The request.
933
+ * @returns The response object with additional http response properties.
934
+ */
935
+ export async function auditableItemGraphChangesetList(httpRequestContext, componentName, request) {
936
+ Guards.object(ROUTES_SOURCE, "request", request);
937
+ Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
938
+ Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
939
+ const component = ComponentFactory.get(componentName);
940
+ const result = await component.getChangesets(request.pathParams.id, request.query?.cursor, Coerce.integer(request.query?.limit), {
941
+ verifySignatureDepth: request.query?.verifySignatureDepth
942
+ });
943
+ const headers = {
944
+ [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json
945
+ };
946
+ const hostingComponent = ComponentFactory.get(httpRequestContext.hostingComponentType ?? "hosting");
947
+ if (Is.stringValue(result.cursor)) {
948
+ headers[HeaderTypes.Link] = HeaderHelper.createLinkHeader(await hostingComponent.buildPublicUrl(httpRequestContext.serverRequest.url), { cursor: result.cursor }, "next");
949
+ }
950
+ return {
951
+ headers,
952
+ body: result.changesets
953
+ };
954
+ }
955
+ /**
956
+ * Get the graph vertex changeset.
957
+ * @param httpRequestContext The request context for the API.
958
+ * @param componentName The name of the component to use in the routes.
959
+ * @param request The request.
960
+ * @returns The response object with additional http response properties.
961
+ */
962
+ export async function auditableItemGraphChangesetGet(httpRequestContext, componentName, request) {
963
+ Guards.object(ROUTES_SOURCE, "request", request);
964
+ Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
965
+ Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
966
+ const component = ComponentFactory.get(componentName);
967
+ const changesetUrn = `${request.pathParams.id}:changeset:${request.pathParams.changesetId}`;
968
+ const result = await component.getChangeset(changesetUrn, {
969
+ verifySignatureDepth: request.query?.verifySignatureDepth
970
+ });
971
+ return {
972
+ headers: {
973
+ [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd
974
+ ? MimeTypes.JsonLd
975
+ : MimeTypes.Json
482
976
  },
483
977
  body: result
484
978
  };
485
979
  }
486
980
  /**
487
- * Update the graph vertex.
981
+ * Update the graph vertex (PUT — full replacement of vertex state).
488
982
  * @param httpRequestContext The request context for the API.
489
983
  * @param componentName The name of the component to use in the routes.
490
984
  * @param request The request.
@@ -501,6 +995,24 @@ export async function auditableItemGraphUpdate(httpRequestContext, componentName
501
995
  statusCode: HttpStatusCode.noContent
502
996
  };
503
997
  }
998
+ /**
999
+ * Partially update the graph vertex (PATCH — optional scalars; list fields use `{ add, remove }`).
1000
+ * @param httpRequestContext The request context for the API.
1001
+ * @param componentName The name of the component to use in the routes.
1002
+ * @param request The request.
1003
+ * @returns The response object with additional http response properties.
1004
+ */
1005
+ export async function auditableItemGraphUpdatePartial(httpRequestContext, componentName, request) {
1006
+ Guards.object(ROUTES_SOURCE, "request", request);
1007
+ Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
1008
+ Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
1009
+ Guards.object(ROUTES_SOURCE, "request.body", request.body);
1010
+ const component = ComponentFactory.get(componentName);
1011
+ await component.updatePartial({ ...request.body, id: request.pathParams.id });
1012
+ return {
1013
+ statusCode: HttpStatusCode.noContent
1014
+ };
1015
+ }
504
1016
  /**
505
1017
  * Query the graph vertices.
506
1018
  * @param httpRequestContext The request context for the API.
@@ -511,7 +1023,7 @@ export async function auditableItemGraphUpdate(httpRequestContext, componentName
511
1023
  export async function auditableItemGraphList(httpRequestContext, componentName, request) {
512
1024
  Guards.object(ROUTES_SOURCE, "request", request);
513
1025
  Guards.object(ROUTES_SOURCE, "request.query", request.query);
514
- const mimeType = request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? "jsonld" : "json";
1026
+ const hostingComponent = ComponentFactory.get(httpRequestContext.hostingComponentType ?? "hosting");
515
1027
  const component = ComponentFactory.get(componentName);
516
1028
  const result = await component.query({
517
1029
  id: request.query?.id,
@@ -519,9 +1031,62 @@ export async function auditableItemGraphList(httpRequestContext, componentName,
519
1031
  idExact: Coerce.boolean(request.query?.idExact),
520
1032
  resourceTypes: HttpParameterHelper.arrayFromString(request.query?.resourceTypes)
521
1033
  }, HttpParameterHelper.objectFromString(request.query?.conditions), request.query?.orderBy, request.query?.orderByDirection, HttpParameterHelper.arrayFromString(request.query?.properties), request.query?.cursor, Coerce.integer(request.query?.limit));
1034
+ const headers = {
1035
+ [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd ? MimeTypes.JsonLd : MimeTypes.Json
1036
+ };
1037
+ if (Is.stringValue(result.cursor)) {
1038
+ headers[HeaderTypes.Link] = HeaderHelper.createLinkHeader(await hostingComponent.buildPublicUrl(httpRequestContext.serverRequest.url), { cursor: result.cursor }, "next");
1039
+ }
1040
+ return {
1041
+ headers,
1042
+ body: result.entries
1043
+ };
1044
+ }
1045
+ /**
1046
+ * Get the graph vertex at a specific version.
1047
+ * @param httpRequestContext The request context for the API.
1048
+ * @param componentName The name of the component to use in the routes.
1049
+ * @param request The request.
1050
+ * @returns The response object with additional http response properties.
1051
+ */
1052
+ export async function auditableItemGraphVersionGet(httpRequestContext, componentName, request) {
1053
+ Guards.object(ROUTES_SOURCE, "request", request);
1054
+ Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
1055
+ Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
1056
+ const version = Coerce.integer(request.pathParams.version);
1057
+ Guards.integer(ROUTES_SOURCE, "request.pathParams.version", version);
1058
+ const component = ComponentFactory.get(componentName);
1059
+ const result = await component.getVersion(request.pathParams.id, version);
1060
+ return {
1061
+ headers: {
1062
+ [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd
1063
+ ? MimeTypes.JsonLd
1064
+ : MimeTypes.Json
1065
+ },
1066
+ body: result
1067
+ };
1068
+ }
1069
+ /**
1070
+ * Get all versions of a graph vertex.
1071
+ * @param httpRequestContext The request context for the API.
1072
+ * @param componentName The name of the component to use in the routes.
1073
+ * @param request The request.
1074
+ * @returns The response object with additional http response properties.
1075
+ */
1076
+ export async function auditableItemGraphVersionList(httpRequestContext, componentName, request) {
1077
+ Guards.object(ROUTES_SOURCE, "request", request);
1078
+ Guards.object(ROUTES_SOURCE, "request.pathParams", request.pathParams);
1079
+ Guards.stringValue(ROUTES_SOURCE, "request.pathParams.id", request.pathParams.id);
1080
+ const component = ComponentFactory.get(componentName);
1081
+ const result = await component.getVersions(request.pathParams.id, {
1082
+ after: request.query?.after,
1083
+ before: request.query?.before
1084
+ });
522
1085
  return {
523
1086
  headers: {
524
- [HeaderTypes.ContentType]: mimeType === "json" ? MimeTypes.Json : MimeTypes.JsonLd
1087
+ [HeaderTypes.ContentType]: request.headers?.[HeaderTypes.Accept] === MimeTypes.JsonLd
1088
+ ? MimeTypes.JsonLd
1089
+ : MimeTypes.Json
525
1090
  },
526
1091
  body: result
527
1092
  };