Skip to main content

Auditable Item Graph Service Examples

Use these examples when you want to run graph operations in process, keep an audit trail, and work with strongly typed entities.

AuditableItemGraphService

import { AuditableItemGraphService } from '@twin.org/auditable-item-graph-service';

const service = new AuditableItemGraphService();

console.log(service.className()); // AuditableItemGraphService
import { AuditableItemGraphService } from '@twin.org/auditable-item-graph-service';

const service = new AuditableItemGraphService();

const vertexId = await service.create({
annotationObject: {
'@context': 'https://www.w3.org/ns/activitystreams',
type: 'Create',
actor: {
type: 'Person',
id: 'did:example:alice',
name: 'Alice'
},
object: {
type: 'Note',
content: 'Initial version'
}
},
aliases: [{ id: 'order-2026-0195', aliasFormat: 'orderRef' }],
resources: [
{ resourceObject: { '@context': 'https://schema.org', type: 'Thing', name: 'Order 2026-0195' } }
]
});

await service.update({
id: vertexId,
aliases: [{ id: 'order-2026-0195', aliasFormat: 'orderRef' }],
resources: [
{
id: 'resource-order',
resourceObject: {
'@context': 'https://schema.org',
type: 'Thing',
name: 'Order 2026-0195 (amended)'
}
}
],
edges: [{ targetId: 'aig:018f5a6cfd9444d58c7c2d4df1fd0fff', edgeRelationships: ['derivedFrom'] }]
});

console.log(vertexId); // aig:018f5a6cfd9444d58c7c2d4df1fd0a23
import { VerifyDepth } from '@twin.org/auditable-item-graph-models';
import { AuditableItemGraphService } from '@twin.org/auditable-item-graph-service';

const service = new AuditableItemGraphService();
const vertexId = 'aig:018f5a6cfd9444d58c7c2d4df1fd0a23';

const vertex = await service.get(vertexId, {
includeDeleted: false,
verifySignatureDepth: VerifyDepth.Current
});

const changesetChunk = await service.getChangesets(vertexId, undefined, 10, {
verifySignatureDepth: VerifyDepth.Current
});

const firstChangeset = changesetChunk.changesets.itemListElement?.[0];

if (firstChangeset?.id) {
const changeset = await service.getChangeset(firstChangeset.id, {
verifySignatureDepth: VerifyDepth.Current
});

console.log(vertex.id); // aig:018f5a6cfd9444d58c7c2d4df1fd0a23
console.log(changeset.id); // aig:018f5a6cfd9444d58c7c2d4df1fd0a23:changeset:018f5a6cfd9444d58c7c2d4df1fd0b10
}
import { ComparisonOperator, SortDirection } from '@twin.org/entity';
import { AuditableItemGraphService } from '@twin.org/auditable-item-graph-service';

const service = new AuditableItemGraphService();

const queryResult = await service.query(
{
id: 'order-2026',
idMode: 'alias',
idExact: false,
resourceTypes: ['Thing']
},
[
{
field: 'dateCreated',
comparison: ComparisonOperator.GreaterThan,
value: '2026-01-01T00:00:00.000Z'
}
],
'dateCreated',
SortDirection.Descending,
['id', 'dateCreated', 'aliases'],
undefined,
25
);

console.log(queryResult.entries.itemListElement?.length ?? 0); // 3

await service.removeVerifiable('aig:018f5a6cfd9444d58c7c2d4df1fd0a23');

AuditableItemGraphVertex

import {
AuditableItemGraphAlias,
AuditableItemGraphEdge,
AuditableItemGraphResource,
AuditableItemGraphVertex
} from '@twin.org/auditable-item-graph-service';

const alias = new AuditableItemGraphAlias();
alias.id = 'order-2026-0195';
alias.aliasFormat = 'orderRef';
alias.dateCreated = '2026-03-10T09:30:00.000Z';

const resource = new AuditableItemGraphResource();
resource.id = 'resource-order';
resource.dateCreated = '2026-03-10T09:30:00.000Z';
resource.resourceObject = {
'@context': 'https://schema.org',
type: 'Thing',
name: 'Order 2026-0195'
};

const edge = new AuditableItemGraphEdge();
edge.id = 'edge-1';
edge.dateCreated = '2026-03-10T09:30:00.000Z';
edge.targetId = 'aig:018f5a6cfd9444d58c7c2d4df1fd0fff';
edge.edgeRelationships = ['derivedFrom'];

const vertex = new AuditableItemGraphVertex();
vertex.id = '018f5a6cfd9444d58c7c2d4df1fd0a23';
vertex.organizationIdentity = 'did:web:example.org';
vertex.dateCreated = '2026-03-10T09:30:00.000Z';
vertex.aliases = [alias];
vertex.resources = [resource];
vertex.edges = [edge];

console.log(vertex.aliases?.length ?? 0); // 1

AuditableItemGraphChangeset

import {
AuditableItemGraphChangeset,
AuditableItemGraphPatch
} from '@twin.org/auditable-item-graph-service';

const patch = new AuditableItemGraphPatch();
patch.op = 'replace';
patch.path = '/resources/0/resourceObject/name';
patch.value = 'Order 2026-0195 (amended)';

const changeset = new AuditableItemGraphChangeset();
changeset.id = '018f5a6cfd9444d58c7c2d4df1fd0b10';
changeset.vertexId = '018f5a6cfd9444d58c7c2d4df1fd0a23';
changeset.dateCreated = '2026-03-10T09:40:00.000Z';
changeset.userIdentity = 'did:web:example.org:users:alice';
changeset.patches = [patch];

console.log(changeset.patches.length); // 1

AuditableItemGraphAlias

import { AuditableItemGraphAlias } from '@twin.org/auditable-item-graph-service';

const alias = new AuditableItemGraphAlias();
alias.id = 'order-2026-0195';
alias.aliasFormat = 'orderRef';
alias.dateCreated = '2026-03-10T09:30:00.000Z';

console.log(alias.id); // order-2026-0195

AuditableItemGraphResource

import { AuditableItemGraphResource } from '@twin.org/auditable-item-graph-service';

const resource = new AuditableItemGraphResource();
resource.id = 'resource-order';
resource.dateCreated = '2026-03-10T09:30:00.000Z';
resource.resourceObject = {
'@context': 'https://schema.org',
type: 'Thing',
name: 'Order 2026-0195'
};

console.log(resource.id); // resource-order

AuditableItemGraphEdge

import { AuditableItemGraphEdge } from '@twin.org/auditable-item-graph-service';

const edge = new AuditableItemGraphEdge();
edge.id = 'edge-1';
edge.dateCreated = '2026-03-10T09:30:00.000Z';
edge.targetId = 'aig:018f5a6cfd9444d58c7c2d4df1fd0fff';
edge.edgeRelationships = ['derivedFrom'];

console.log(edge.edgeRelationships[0]); // derivedFrom

AuditableItemGraphPatch

import { AuditableItemGraphPatch } from '@twin.org/auditable-item-graph-service';

const patch = new AuditableItemGraphPatch();
patch.op = 'add';
patch.path = '/aliases/-';
patch.value = {
id: 'order-2026-0195',
aliasFormat: 'orderRef'
};

console.log(patch.op); // add