@sphereon/ssi-sdk.data-store 0.19.1-next.24 → 0.19.1-unstable.65
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.
- package/dist/entities/xstate/StateEntity.d.ts +14 -0
- package/dist/entities/xstate/StateEntity.d.ts.map +1 -0
- package/dist/entities/xstate/StateEntity.js +60 -0
- package/dist/entities/xstate/StateEntity.js.map +1 -0
- package/dist/index.d.ts +7 -3
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +11 -2
- package/dist/index.js.map +1 -1
- package/dist/migrations/generic/7-CreateXStateStore.d.ts +7 -0
- package/dist/migrations/generic/7-CreateXStateStore.d.ts.map +1 -0
- package/dist/migrations/generic/7-CreateXStateStore.js +78 -0
- package/dist/migrations/generic/7-CreateXStateStore.js.map +1 -0
- package/dist/migrations/generic/index.d.ts +2 -0
- package/dist/migrations/generic/index.d.ts.map +1 -1
- package/dist/migrations/generic/index.js +4 -1
- package/dist/migrations/generic/index.js.map +1 -1
- package/dist/migrations/index.d.ts +1 -1
- package/dist/migrations/index.d.ts.map +1 -1
- package/dist/migrations/index.js +2 -1
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/postgres/1708797018115-CreateXStateStore.d.ts +7 -0
- package/dist/migrations/postgres/1708797018115-CreateXStateStore.d.ts.map +1 -0
- package/dist/migrations/postgres/1708797018115-CreateXStateStore.js +45 -0
- package/dist/migrations/postgres/1708797018115-CreateXStateStore.js.map +1 -0
- package/dist/migrations/sqlite/1708796002272-CreateXStateStore.d.ts +7 -0
- package/dist/migrations/sqlite/1708796002272-CreateXStateStore.d.ts.map +1 -0
- package/dist/migrations/sqlite/1708796002272-CreateXStateStore.js +42 -0
- package/dist/migrations/sqlite/1708796002272-CreateXStateStore.js.map +1 -0
- package/dist/types/index.d.ts +1 -0
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -0
- package/dist/types/index.js.map +1 -1
- package/dist/types/xstate/IAbstractXStateStore.d.ts +38 -0
- package/dist/types/xstate/IAbstractXStateStore.d.ts.map +1 -0
- package/dist/types/xstate/IAbstractXStateStore.js +3 -0
- package/dist/types/xstate/IAbstractXStateStore.js.map +1 -0
- package/dist/xstate/IAbstractXStateStore.d.ts +9 -0
- package/dist/xstate/IAbstractXStateStore.d.ts.map +1 -0
- package/dist/xstate/IAbstractXStateStore.js +7 -0
- package/dist/xstate/IAbstractXStateStore.js.map +1 -0
- package/dist/xstate/XStateStore.d.ts +17 -0
- package/dist/xstate/XStateStore.d.ts.map +1 -0
- package/dist/xstate/XStateStore.js +110 -0
- package/dist/xstate/XStateStore.js.map +1 -0
- package/package.json +4 -4
- package/src/__tests__/xstate.entities.test.ts +47 -0
- package/src/__tests__/xstate.store.test.ts +158 -0
- package/src/entities/xstate/StateEntity.ts +34 -0
- package/src/index.ts +9 -0
- package/src/migrations/generic/7-CreateXStateStore.ts +66 -0
- package/src/migrations/generic/index.ts +3 -0
- package/src/migrations/index.ts +1 -0
- package/src/migrations/postgres/1708797018115-CreateXStateStore.ts +29 -0
- package/src/migrations/sqlite/1708796002272-CreateXStateStore.ts +26 -0
- package/src/types/index.ts +1 -0
- package/src/types/xstate/IAbstractXStateStore.ts +39 -0
- package/src/xstate/IAbstractXStateStore.ts +9 -0
- package/src/xstate/XStateStore.ts +107 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IAbstractXStateStore.js","sourceRoot":"","sources":["../../../src/types/xstate/IAbstractXStateStore.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { DeleteExpiredStateArgs, DeleteStateArgs, GetActiveStateArgs, GetStatesArgs, SaveStateArgs, State } from '../types';
|
|
2
|
+
export declare abstract class IAbstractXStateStore {
|
|
3
|
+
abstract saveState(state: SaveStateArgs): Promise<State>;
|
|
4
|
+
abstract getActiveState(args: GetActiveStateArgs): Promise<State>;
|
|
5
|
+
abstract getStates(args?: GetStatesArgs): Promise<Array<State>>;
|
|
6
|
+
abstract deleteState(args: DeleteStateArgs): Promise<boolean>;
|
|
7
|
+
abstract deleteExpiredStates(args: DeleteExpiredStateArgs): Promise<boolean>;
|
|
8
|
+
}
|
|
9
|
+
//# sourceMappingURL=IAbstractXStateStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IAbstractXStateStore.d.ts","sourceRoot":"","sources":["../../src/xstate/IAbstractXStateStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAE3H,8BAAsB,oBAAoB;IACxC,QAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IACxD,QAAQ,CAAC,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;IACjE,QAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/D,QAAQ,CAAC,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAC7D,QAAQ,CAAC,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC;CAC7E"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"IAbstractXStateStore.js","sourceRoot":"","sources":["../../src/xstate/IAbstractXStateStore.ts"],"names":[],"mappings":";;;AAEA,MAAsB,oBAAoB;CAMzC;AAND,oDAMC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { OrPromise } from '@sphereon/ssi-types';
|
|
2
|
+
import { DataSource } from 'typeorm';
|
|
3
|
+
import { StateEntity } from '../entities/xstate/StateEntity';
|
|
4
|
+
import { DeleteExpiredStateArgs, DeleteStateArgs, GetActiveStateArgs, GetStatesArgs, SaveStateArgs, State } from '../types';
|
|
5
|
+
import { IAbstractXStateStore } from './IAbstractXStateStore';
|
|
6
|
+
export declare class XStateStore extends IAbstractXStateStore {
|
|
7
|
+
private readonly dbConnection;
|
|
8
|
+
constructor(dbConnection: OrPromise<DataSource>);
|
|
9
|
+
saveState(state: SaveStateArgs): Promise<State>;
|
|
10
|
+
getActiveState(args: GetActiveStateArgs): Promise<State>;
|
|
11
|
+
getStates(args?: GetStatesArgs): Promise<Array<State>>;
|
|
12
|
+
deleteState(args: DeleteStateArgs): Promise<boolean>;
|
|
13
|
+
deleteExpiredStates(args: DeleteExpiredStateArgs): Promise<boolean>;
|
|
14
|
+
static stateFrom: (stateEntity: StateEntity) => State;
|
|
15
|
+
static stateEntityFrom: (state: State | SaveStateArgs) => StateEntity;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=XStateStore.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XStateStore.d.ts","sourceRoot":"","sources":["../../src/xstate/XStateStore.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,qBAAqB,CAAA;AAE/C,OAAO,EAAY,UAAU,EAA8B,MAAM,SAAS,CAAA;AAE1E,OAAO,EAAE,WAAW,EAAE,MAAM,gCAAgC,CAAA;AAC5D,OAAO,EAAE,sBAAsB,EAAE,eAAe,EAAE,kBAAkB,EAAE,aAAa,EAAE,aAAa,EAAE,KAAK,EAAE,MAAM,UAAU,CAAA;AAC3H,OAAO,EAAE,oBAAoB,EAAE,MAAM,wBAAwB,CAAA;AAI7D,qBAAa,WAAY,SAAQ,oBAAoB;IACnD,OAAO,CAAC,QAAQ,CAAC,YAAY,CAAuB;gBAExC,YAAY,EAAE,SAAS,CAAC,UAAU,CAAC;IAKzC,SAAS,CAAC,KAAK,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC;IAM/C,cAAc,CAAC,IAAI,EAAE,kBAAkB,GAAG,OAAO,CAAC,KAAK,CAAC;IA+BxD,SAAS,CAAC,IAAI,CAAC,EAAE,aAAa,GAAG,OAAO,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAUtD,WAAW,CAAC,IAAI,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAepD,mBAAmB,CAAC,IAAI,EAAE,sBAAsB,GAAG,OAAO,CAAC,OAAO,CAAC;IAazE,OAAc,SAAS,gBAAiB,WAAW,KAAG,KAAK,CAK1D;IAED,OAAc,eAAe,UAAW,KAAK,GAAG,aAAa,KAAG,WAAW,CAK1E;CACF"}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
|
|
3
|
+
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
|
|
4
|
+
return new (P || (P = Promise))(function (resolve, reject) {
|
|
5
|
+
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
|
|
6
|
+
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
|
|
7
|
+
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
|
|
8
|
+
step((generator = generator.apply(thisArg, _arguments || [])).next());
|
|
9
|
+
});
|
|
10
|
+
};
|
|
11
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
12
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
13
|
+
};
|
|
14
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
15
|
+
exports.XStateStore = void 0;
|
|
16
|
+
const debug_1 = __importDefault(require("debug"));
|
|
17
|
+
const typeorm_1 = require("typeorm");
|
|
18
|
+
const StateEntity_1 = require("../entities/xstate/StateEntity");
|
|
19
|
+
const IAbstractXStateStore_1 = require("./IAbstractXStateStore");
|
|
20
|
+
const debug = (0, debug_1.default)('sphereon:ssi-sdk:xstate');
|
|
21
|
+
class XStateStore extends IAbstractXStateStore_1.IAbstractXStateStore {
|
|
22
|
+
constructor(dbConnection) {
|
|
23
|
+
super();
|
|
24
|
+
this.dbConnection = dbConnection;
|
|
25
|
+
}
|
|
26
|
+
saveState(state) {
|
|
27
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
28
|
+
const connection = yield this.dbConnection;
|
|
29
|
+
debug(`Executing saveState with state: ${JSON.stringify(state)}`);
|
|
30
|
+
return connection.getRepository(StateEntity_1.StateEntity).save(XStateStore.stateEntityFrom(state));
|
|
31
|
+
});
|
|
32
|
+
}
|
|
33
|
+
getActiveState(args) {
|
|
34
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
35
|
+
const { tenantId, machineType } = args;
|
|
36
|
+
const connection = yield this.dbConnection;
|
|
37
|
+
debug(`Executing getActiveState query with machineType: ${machineType}, tenantId: ${tenantId}`);
|
|
38
|
+
const queryBuilder = connection
|
|
39
|
+
.getRepository(StateEntity_1.StateEntity)
|
|
40
|
+
.createQueryBuilder('state')
|
|
41
|
+
.where('state.completedAt IS NULL')
|
|
42
|
+
.andWhere(new typeorm_1.Brackets((qb) => {
|
|
43
|
+
qb.where('state.expiresAt IS NULL').orWhere('state.expiresAt > :now', { now: new Date() });
|
|
44
|
+
}))
|
|
45
|
+
.orderBy('state.updatedAt', 'DESC');
|
|
46
|
+
if (tenantId) {
|
|
47
|
+
queryBuilder.andWhere('state.tenantId = :tenantId', { tenantId });
|
|
48
|
+
}
|
|
49
|
+
if (machineType) {
|
|
50
|
+
queryBuilder.andWhere('state.machineType = :machineType', { machineType });
|
|
51
|
+
}
|
|
52
|
+
const result = yield queryBuilder.getOne();
|
|
53
|
+
if (!result) {
|
|
54
|
+
throw new Error(`No active state found for machineType: ${machineType}, tenantId: ${tenantId}`);
|
|
55
|
+
}
|
|
56
|
+
return XStateStore.stateFrom(result);
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
getStates(args) {
|
|
60
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
61
|
+
const connection = yield this.dbConnection;
|
|
62
|
+
debug('Getting states', args);
|
|
63
|
+
const result = yield connection.getRepository(StateEntity_1.StateEntity).find(Object.assign({}, ((args === null || args === void 0 ? void 0 : args.filter) && { where: args === null || args === void 0 ? void 0 : args.filter })));
|
|
64
|
+
return result.map((event) => XStateStore.stateFrom(event));
|
|
65
|
+
});
|
|
66
|
+
}
|
|
67
|
+
deleteState(args) {
|
|
68
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
69
|
+
if (!args.id) {
|
|
70
|
+
throw new Error('No id parameter is provided.');
|
|
71
|
+
}
|
|
72
|
+
try {
|
|
73
|
+
const connection = yield this.dbConnection;
|
|
74
|
+
debug(`Executing deleteState query with id: ${args.id}`);
|
|
75
|
+
const result = yield connection.getRepository(StateEntity_1.StateEntity).delete(args.id);
|
|
76
|
+
return result.affected != null && result.affected > 0;
|
|
77
|
+
}
|
|
78
|
+
catch (error) {
|
|
79
|
+
debug(`Error deleting state: ${error}`);
|
|
80
|
+
return false;
|
|
81
|
+
}
|
|
82
|
+
});
|
|
83
|
+
}
|
|
84
|
+
deleteExpiredStates(args) {
|
|
85
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
86
|
+
try {
|
|
87
|
+
const connection = yield this.dbConnection;
|
|
88
|
+
debug(`Executing deleteExpiredStates query with params: ${JSON.stringify(args)}`);
|
|
89
|
+
const deleteCriteria = Object.assign({ expiresAt: (0, typeorm_1.LessThan)(new Date()) }, (args.machineType && { type: args.machineType }));
|
|
90
|
+
const result = yield connection.getRepository(StateEntity_1.StateEntity).delete(deleteCriteria);
|
|
91
|
+
return result.affected != null && result.affected > 0;
|
|
92
|
+
}
|
|
93
|
+
catch (error) {
|
|
94
|
+
debug(`Error deleting state: ${error}`);
|
|
95
|
+
return false;
|
|
96
|
+
}
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
exports.XStateStore = XStateStore;
|
|
101
|
+
XStateStore.stateFrom = (stateEntity) => {
|
|
102
|
+
return Object.assign(Object.assign({}, stateEntity), { state: JSON.parse(stateEntity.state) });
|
|
103
|
+
};
|
|
104
|
+
XStateStore.stateEntityFrom = (state) => {
|
|
105
|
+
const entity = new StateEntity_1.StateEntity();
|
|
106
|
+
Object.assign(entity, state);
|
|
107
|
+
entity.state = JSON.stringify(state.state);
|
|
108
|
+
return entity;
|
|
109
|
+
};
|
|
110
|
+
//# sourceMappingURL=XStateStore.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"XStateStore.js","sourceRoot":"","sources":["../../src/xstate/XStateStore.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk.data-store",
|
|
3
|
-
"version": "0.19.1-
|
|
3
|
+
"version": "0.19.1-unstable.65+99db5685",
|
|
4
4
|
"source": "src/index.ts",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/index.d.ts",
|
|
@@ -13,8 +13,8 @@
|
|
|
13
13
|
"typeorm-postgres:migration:run": "pnpm run typeorm -- migration:run -c migration-postgres"
|
|
14
14
|
},
|
|
15
15
|
"dependencies": {
|
|
16
|
-
"@sphereon/ssi-sdk.core": "0.19.1-
|
|
17
|
-
"@sphereon/ssi-types": "0.19.1-
|
|
16
|
+
"@sphereon/ssi-sdk.core": "0.19.1-unstable.65+99db5685",
|
|
17
|
+
"@sphereon/ssi-types": "0.19.1-unstable.65+99db5685",
|
|
18
18
|
"@veramo/core": "4.2.0",
|
|
19
19
|
"@veramo/utils": "4.2.0",
|
|
20
20
|
"class-validator": "^0.14.0",
|
|
@@ -44,5 +44,5 @@
|
|
|
44
44
|
"PostgreSQL",
|
|
45
45
|
"Contact Store"
|
|
46
46
|
],
|
|
47
|
-
"gitHead": "
|
|
47
|
+
"gitHead": "99db56856054c86c2e8955d43a0b6e2c7a5228bf"
|
|
48
48
|
}
|
|
@@ -0,0 +1,47 @@
|
|
|
1
|
+
import { DataSource } from 'typeorm'
|
|
2
|
+
import { StateEntity } from '../entities/xstate/StateEntity'
|
|
3
|
+
|
|
4
|
+
import { DataStoreXStateStoreEntities, DataStoreXStateStoreMigrations, SaveStateArgs, XStateStore } from '../index'
|
|
5
|
+
|
|
6
|
+
describe('Database entities tests', (): void => {
|
|
7
|
+
let dbConnection: DataSource
|
|
8
|
+
|
|
9
|
+
beforeEach(async (): Promise<void> => {
|
|
10
|
+
dbConnection = await new DataSource({
|
|
11
|
+
type: 'sqlite',
|
|
12
|
+
database: ':memory:',
|
|
13
|
+
//logging: 'all',
|
|
14
|
+
migrationsRun: false,
|
|
15
|
+
migrations: DataStoreXStateStoreMigrations,
|
|
16
|
+
synchronize: false,
|
|
17
|
+
entities: [...DataStoreXStateStoreEntities],
|
|
18
|
+
}).initialize()
|
|
19
|
+
await dbConnection.runMigrations()
|
|
20
|
+
expect(await dbConnection.showMigrations()).toBeFalsy()
|
|
21
|
+
})
|
|
22
|
+
|
|
23
|
+
afterEach(async (): Promise<void> => {
|
|
24
|
+
await dbConnection.destroy()
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
it('should save xstate event to database', async (): Promise<void> => {
|
|
28
|
+
const expiresAt = new Date()
|
|
29
|
+
expiresAt.setTime(expiresAt.getTime() + 100000)
|
|
30
|
+
const xstateEvent: SaveStateArgs = {
|
|
31
|
+
stateName: 'acceptAgreement',
|
|
32
|
+
machineType: 'Onboarding',
|
|
33
|
+
xStateEventType: 'SET_TOC',
|
|
34
|
+
state: { myState: 'test_state' },
|
|
35
|
+
tenantId: 'test_tenant_id',
|
|
36
|
+
expiresAt,
|
|
37
|
+
}
|
|
38
|
+
const fromDb: StateEntity = await dbConnection.getRepository(StateEntity).save(XStateStore.stateEntityFrom(xstateEvent))
|
|
39
|
+
|
|
40
|
+
expect(fromDb).toBeDefined()
|
|
41
|
+
expect(fromDb?.id).not.toBeNull()
|
|
42
|
+
expect(fromDb?.machineType).toEqual(xstateEvent.machineType)
|
|
43
|
+
expect(JSON.parse(fromDb?.state)).toEqual(xstateEvent.state)
|
|
44
|
+
expect(fromDb?.tenantId).toEqual(xstateEvent.tenantId)
|
|
45
|
+
expect(fromDb?.completedAt).toBeNull()
|
|
46
|
+
})
|
|
47
|
+
})
|
|
@@ -0,0 +1,158 @@
|
|
|
1
|
+
import { DataSource } from 'typeorm'
|
|
2
|
+
import {
|
|
3
|
+
DataStoreXStateStoreEntities,
|
|
4
|
+
GetActiveStateArgs,
|
|
5
|
+
NonPersistedXStateStoreEvent,
|
|
6
|
+
SaveStateArgs,
|
|
7
|
+
State,
|
|
8
|
+
XStateStore,
|
|
9
|
+
} from '../index'
|
|
10
|
+
import { DataStoreXStateStoreMigrations } from '../migrations'
|
|
11
|
+
|
|
12
|
+
describe('Database entities tests', (): void => {
|
|
13
|
+
let dbConnection: DataSource
|
|
14
|
+
let xstateStore: XStateStore
|
|
15
|
+
|
|
16
|
+
beforeEach(async (): Promise<void> => {
|
|
17
|
+
dbConnection = await new DataSource({
|
|
18
|
+
type: 'sqlite',
|
|
19
|
+
database: ':memory:',
|
|
20
|
+
logging: 'all',
|
|
21
|
+
migrationsRun: false,
|
|
22
|
+
migrations: DataStoreXStateStoreMigrations,
|
|
23
|
+
synchronize: false,
|
|
24
|
+
entities: DataStoreXStateStoreEntities,
|
|
25
|
+
}).initialize()
|
|
26
|
+
await dbConnection.runMigrations()
|
|
27
|
+
expect(await dbConnection.showMigrations()).toBeFalsy()
|
|
28
|
+
xstateStore = new XStateStore(dbConnection)
|
|
29
|
+
})
|
|
30
|
+
|
|
31
|
+
afterEach(async (): Promise<void> => {
|
|
32
|
+
await dbConnection.destroy()
|
|
33
|
+
})
|
|
34
|
+
|
|
35
|
+
it('should store xstate event', async (): Promise<void> => {
|
|
36
|
+
const xstateEvent: NonPersistedXStateStoreEvent = {
|
|
37
|
+
stateName: 'enterPersonalDetails',
|
|
38
|
+
machineType: 'Onboarding',
|
|
39
|
+
xStateEventType: 'SET_PERSONAL_DATA',
|
|
40
|
+
state: 'test_state',
|
|
41
|
+
expiresAt: new Date(new Date().getDate() + 100000),
|
|
42
|
+
tenantId: 'test_tenant_id',
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
const savedXStoreEvent: State = await xstateStore.saveState(xstateEvent)
|
|
46
|
+
expect(savedXStoreEvent).toBeDefined()
|
|
47
|
+
})
|
|
48
|
+
|
|
49
|
+
it('should get all state events', async (): Promise<void> => {
|
|
50
|
+
const xstateEvent: NonPersistedXStateStoreEvent = {
|
|
51
|
+
stateName: 'enterPersonalDetails',
|
|
52
|
+
machineType: 'Onboarding',
|
|
53
|
+
xStateEventType: 'SET_PERSONAL_DATA',
|
|
54
|
+
state: 'test_state',
|
|
55
|
+
expiresAt: new Date(new Date().getDate() + 100000),
|
|
56
|
+
tenantId: 'test_tenant_id',
|
|
57
|
+
}
|
|
58
|
+
|
|
59
|
+
const stateEvent1: NonPersistedXStateStoreEvent = await xstateStore.saveState({ ...xstateEvent })
|
|
60
|
+
expect(stateEvent1).toBeDefined()
|
|
61
|
+
|
|
62
|
+
const stateEvent2: NonPersistedXStateStoreEvent = await xstateStore.saveState({ ...xstateEvent })
|
|
63
|
+
expect(stateEvent2).toBeDefined()
|
|
64
|
+
|
|
65
|
+
const result: Array<State> = await xstateStore.getStates()
|
|
66
|
+
expect(result).toHaveLength(2)
|
|
67
|
+
})
|
|
68
|
+
|
|
69
|
+
it('should retrieve an xstate event', async (): Promise<void> => {
|
|
70
|
+
const expiresAt = new Date()
|
|
71
|
+
expiresAt.setTime(expiresAt.getTime() + 100000)
|
|
72
|
+
const xstateEvent: SaveStateArgs = {
|
|
73
|
+
stateName: 'enterPersonalDetails',
|
|
74
|
+
machineType: 'Onboarding',
|
|
75
|
+
xStateEventType: 'SET_PERSONAL_DATA',
|
|
76
|
+
state: 'test_state',
|
|
77
|
+
expiresAt,
|
|
78
|
+
tenantId: 'test_tenant_id',
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
const savedXStoreEvent1: State = await xstateStore.saveState(xstateEvent)
|
|
82
|
+
expect(savedXStoreEvent1).toBeDefined()
|
|
83
|
+
const result: State = await xstateStore.getActiveState({ machineType: xstateEvent.machineType, tenantId: xstateEvent.tenantId })
|
|
84
|
+
expect(result).toBeDefined()
|
|
85
|
+
})
|
|
86
|
+
|
|
87
|
+
it('should delete an xstate event', async (): Promise<void> => {
|
|
88
|
+
const xstateEvent: NonPersistedXStateStoreEvent = {
|
|
89
|
+
stateName: 'enterPersonalDetails',
|
|
90
|
+
machineType: 'Onboarding',
|
|
91
|
+
xStateEventType: 'SET_PERSONAL_DATA',
|
|
92
|
+
state: 'test_state',
|
|
93
|
+
expiresAt: new Date(new Date().getDate() + 100000),
|
|
94
|
+
tenantId: 'test_tenant_id',
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
const savedXStoreEvent: State = await xstateStore.saveState(xstateEvent)
|
|
98
|
+
expect(savedXStoreEvent).toBeDefined()
|
|
99
|
+
|
|
100
|
+
const result: boolean = await xstateStore.deleteState({ id: savedXStoreEvent.id })
|
|
101
|
+
expect(result).toBeTruthy()
|
|
102
|
+
})
|
|
103
|
+
|
|
104
|
+
it('should return an error if type filter does not match', async (): Promise<void> => {
|
|
105
|
+
const args: GetActiveStateArgs = {
|
|
106
|
+
machineType: 'unknown_machine',
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
await expect(xstateStore.getActiveState(args)).rejects.toEqual(
|
|
110
|
+
Error('No active state found for machineType: unknown_machine, tenantId: undefined')
|
|
111
|
+
)
|
|
112
|
+
})
|
|
113
|
+
|
|
114
|
+
it('should delete the expired records', async () => {
|
|
115
|
+
const futureExpiresAt = new Date()
|
|
116
|
+
futureExpiresAt.setTime(futureExpiresAt.getTime() + 100000) // Future expiration
|
|
117
|
+
|
|
118
|
+
const pastExpiresAt = new Date()
|
|
119
|
+
pastExpiresAt.setTime(pastExpiresAt.getTime() - 100000) // Past expiration, already expired
|
|
120
|
+
|
|
121
|
+
const oldestXstateEvent: SaveStateArgs = {
|
|
122
|
+
stateName: 'acceptAgreement',
|
|
123
|
+
machineType: 'Onboarding1',
|
|
124
|
+
xStateEventType: 'SET_TOC',
|
|
125
|
+
state: 'test_state',
|
|
126
|
+
expiresAt: futureExpiresAt,
|
|
127
|
+
tenantId: 'test_tenant_id',
|
|
128
|
+
}
|
|
129
|
+
const middleXstateEvent: SaveStateArgs = {
|
|
130
|
+
stateName: 'acceptAgreement',
|
|
131
|
+
machineType: 'Onboarding2',
|
|
132
|
+
xStateEventType: 'SET_POLICY2',
|
|
133
|
+
state: 'test_state',
|
|
134
|
+
expiresAt: futureExpiresAt,
|
|
135
|
+
tenantId: 'test_tenant_id',
|
|
136
|
+
}
|
|
137
|
+
const newestXstateEvent: SaveStateArgs = {
|
|
138
|
+
stateName: 'enterPersonalDetails',
|
|
139
|
+
machineType: 'Onboarding3',
|
|
140
|
+
xStateEventType: 'SET_PERSONAL_DATA',
|
|
141
|
+
state: 'test_state',
|
|
142
|
+
expiresAt: pastExpiresAt, // This event should be already expired
|
|
143
|
+
tenantId: 'test_tenant_id',
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
await xstateStore.saveState(oldestXstateEvent)
|
|
147
|
+
await xstateStore.saveState(middleXstateEvent)
|
|
148
|
+
await xstateStore.saveState(newestXstateEvent)
|
|
149
|
+
|
|
150
|
+
await xstateStore.deleteExpiredStates({})
|
|
151
|
+
|
|
152
|
+
await expect(xstateStore.getActiveState({ machineType: 'Onboarding1' })).resolves.toBeDefined()
|
|
153
|
+
await expect(xstateStore.getActiveState({ machineType: 'Onboarding2' })).resolves.toBeDefined()
|
|
154
|
+
await expect(xstateStore.getActiveState({ machineType: 'Onboarding3' })).rejects.toEqual(
|
|
155
|
+
Error('No active state found for machineType: Onboarding3, tenantId: undefined')
|
|
156
|
+
)
|
|
157
|
+
})
|
|
158
|
+
})
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
import { BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
@Entity('StateEntity')
|
|
4
|
+
export class StateEntity extends BaseEntity {
|
|
5
|
+
@PrimaryGeneratedColumn('uuid', { name: 'id' })
|
|
6
|
+
id!: string
|
|
7
|
+
|
|
8
|
+
@Column({ name: 'state_name', nullable: false })
|
|
9
|
+
stateName!: string
|
|
10
|
+
|
|
11
|
+
@Column({ name: 'machine_type', nullable: false })
|
|
12
|
+
machineType!: string
|
|
13
|
+
|
|
14
|
+
@Column({ name: 'xstate_event_type', nullable: false })
|
|
15
|
+
xStateEventType!: string
|
|
16
|
+
|
|
17
|
+
@Column({ name: 'state', nullable: false })
|
|
18
|
+
state!: string
|
|
19
|
+
|
|
20
|
+
@CreateDateColumn({ name: 'created_at', nullable: false })
|
|
21
|
+
createdAt!: Date
|
|
22
|
+
|
|
23
|
+
@UpdateDateColumn({ name: 'updated_at', nullable: false })
|
|
24
|
+
updatedAt!: Date
|
|
25
|
+
|
|
26
|
+
@Column({ name: 'expires_at', type: 'datetime', nullable: true })
|
|
27
|
+
expiresAt?: Date
|
|
28
|
+
|
|
29
|
+
@Column({ name: 'completed_at', type: 'datetime', nullable: true })
|
|
30
|
+
completedAt?: Date
|
|
31
|
+
|
|
32
|
+
@Column({ name: 'tenant_id', type: 'varchar', nullable: true })
|
|
33
|
+
tenantId?: string
|
|
34
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -18,6 +18,7 @@ import { IssuerBrandingEntity, issuerBrandingEntityFrom } from './entities/issua
|
|
|
18
18
|
import { TextAttributesEntity, textAttributesEntityFrom } from './entities/issuanceBranding/TextAttributesEntity'
|
|
19
19
|
import { StatusListEntity } from './entities/statusList2021/StatusList2021Entity'
|
|
20
20
|
import { StatusListEntryEntity } from './entities/statusList2021/StatusList2021EntryEntity'
|
|
21
|
+
import { StateEntity } from './entities/xstate/StateEntity'
|
|
21
22
|
import { IStatusListEntity, IStatusListEntryEntity } from './types'
|
|
22
23
|
import { PartyRelationshipEntity } from './entities/contact/PartyRelationshipEntity'
|
|
23
24
|
import { PartyTypeEntity } from './entities/contact/PartyTypeEntity'
|
|
@@ -35,12 +36,16 @@ import { DigitalCredentialEntity } from './entities/digitalCredential/DigitalCre
|
|
|
35
36
|
import { digitalCredentialFrom, digitalCredentialsFrom, nonPersistedDigitalCredentialEntityFromAddArgs } from './utils/digitalCredential/MappingUtils'
|
|
36
37
|
export { AbstractEventLoggerStore } from './eventLogger/AbstractEventLoggerStore'
|
|
37
38
|
export { EventLoggerStore } from './eventLogger/EventLoggerStore'
|
|
39
|
+
export { IAbstractXStateStore } from './xstate/IAbstractXStateStore'
|
|
40
|
+
export { XStateStore } from './xstate/XStateStore'
|
|
41
|
+
|
|
38
42
|
export {
|
|
39
43
|
DataStoreMigrations,
|
|
40
44
|
DataStoreEventLoggerMigrations,
|
|
41
45
|
DataStoreContactMigrations,
|
|
42
46
|
DataStoreIssuanceBrandingMigrations,
|
|
43
47
|
DataStoreStatusListMigrations,
|
|
48
|
+
DataStoreXStateStoreMigrations,
|
|
44
49
|
} from './migrations'
|
|
45
50
|
export * from './types'
|
|
46
51
|
export * from './utils/contact/MappingUtils'
|
|
@@ -81,6 +86,8 @@ export const DataStoreEventLoggerEntities = [AuditEventEntity]
|
|
|
81
86
|
|
|
82
87
|
export const DataStoreDigitalCredentialEntities = [DigitalCredentialEntity]
|
|
83
88
|
|
|
89
|
+
export const DataStoreXStateStoreEntities = [StateEntity]
|
|
90
|
+
|
|
84
91
|
// All entities combined if a party wants to enable them all at once
|
|
85
92
|
export const DataStoreEntities = [
|
|
86
93
|
...DataStoreContactEntities,
|
|
@@ -88,6 +95,7 @@ export const DataStoreEntities = [
|
|
|
88
95
|
...DataStoreStatusListEntities,
|
|
89
96
|
...DataStoreEventLoggerEntities,
|
|
90
97
|
...DataStoreDigitalCredentialEntities,
|
|
98
|
+
...DataStoreXStateStoreEntities,
|
|
91
99
|
]
|
|
92
100
|
|
|
93
101
|
export {
|
|
@@ -128,4 +136,5 @@ export {
|
|
|
128
136
|
digitalCredentialFrom,
|
|
129
137
|
digitalCredentialsFrom,
|
|
130
138
|
nonPersistedDigitalCredentialEntityFromAddArgs,
|
|
139
|
+
StateEntity,
|
|
131
140
|
}
|
|
@@ -0,0 +1,66 @@
|
|
|
1
|
+
import { DatabaseType, MigrationInterface, QueryRunner } from 'typeorm'
|
|
2
|
+
import Debug from 'debug'
|
|
3
|
+
import { CreateXStateStore1708797018115 } from '../postgres/1708797018115-CreateXStateStore'
|
|
4
|
+
import { CreateXStateStore1708796002272 } from '../sqlite/1708796002272-CreateXStateStore'
|
|
5
|
+
|
|
6
|
+
const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:migrations')
|
|
7
|
+
|
|
8
|
+
export class CreateXStateStore1708098041262 implements MigrationInterface {
|
|
9
|
+
name = 'CreateXStateStore1708098041262'
|
|
10
|
+
|
|
11
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
12
|
+
debug('migration: creating contacts tables')
|
|
13
|
+
const dbType: DatabaseType = queryRunner.connection.driver.options.type
|
|
14
|
+
|
|
15
|
+
switch (dbType) {
|
|
16
|
+
case 'postgres': {
|
|
17
|
+
debug('using postgres migration file')
|
|
18
|
+
const mig: CreateXStateStore1708797018115 = new CreateXStateStore1708797018115()
|
|
19
|
+
await mig.up(queryRunner)
|
|
20
|
+
debug('Migration statements executed')
|
|
21
|
+
return
|
|
22
|
+
}
|
|
23
|
+
case 'sqlite':
|
|
24
|
+
case 'expo':
|
|
25
|
+
case 'react-native': {
|
|
26
|
+
debug('using sqlite/react-native migration file')
|
|
27
|
+
const mig: CreateXStateStore1708796002272 = new CreateXStateStore1708796002272()
|
|
28
|
+
await mig.up(queryRunner)
|
|
29
|
+
debug('Migration statements executed')
|
|
30
|
+
return
|
|
31
|
+
}
|
|
32
|
+
default:
|
|
33
|
+
return Promise.reject(
|
|
34
|
+
`Migrations are currently only supported for sqlite, react-native, expo and postgres. Was ${dbType}. Please run your database without migrations and with 'migrationsRun: false' and 'synchronize: true' for now`
|
|
35
|
+
)
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
40
|
+
debug('migration: reverting contacts tables')
|
|
41
|
+
const dbType: DatabaseType = queryRunner.connection.driver.options.type
|
|
42
|
+
|
|
43
|
+
switch (dbType) {
|
|
44
|
+
case 'postgres': {
|
|
45
|
+
debug('using postgres migration file')
|
|
46
|
+
const mig: CreateXStateStore1708797018115 = new CreateXStateStore1708797018115()
|
|
47
|
+
await mig.down(queryRunner)
|
|
48
|
+
debug('Migration statements executed')
|
|
49
|
+
return
|
|
50
|
+
}
|
|
51
|
+
case 'sqlite':
|
|
52
|
+
case 'expo':
|
|
53
|
+
case 'react-native': {
|
|
54
|
+
debug('using sqlite/react-native migration file')
|
|
55
|
+
const mig: CreateXStateStore1708796002272 = new CreateXStateStore1708796002272()
|
|
56
|
+
await mig.down(queryRunner)
|
|
57
|
+
debug('Migration statements executed')
|
|
58
|
+
return
|
|
59
|
+
}
|
|
60
|
+
default:
|
|
61
|
+
return Promise.reject(
|
|
62
|
+
`Migrations are currently only supported for sqlite, react-native, expo and postgres. Was ${dbType}. Please run your database without migrations and with 'migrationsRun: false' and 'synchronize: true' for now`
|
|
63
|
+
)
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
@@ -4,6 +4,7 @@ import { CreateContacts1690925872318 } from './3-CreateContacts'
|
|
|
4
4
|
import { CreateStatusList1693866470000 } from './4-CreateStatusList'
|
|
5
5
|
import { CreateAuditEvents1701635835330 } from './5-CreateAuditEvents'
|
|
6
6
|
import { CreateDigitalCredential1708525189000 } from './6-CreateDigitalCredential'
|
|
7
|
+
import { CreateXStateStore1708098041262 } from './7-CreateXStateStore'
|
|
7
8
|
|
|
8
9
|
/**
|
|
9
10
|
* The migrations array that SHOULD be used when initializing a TypeORM database connection.
|
|
@@ -19,6 +20,7 @@ export const DataStoreIssuanceBrandingMigrations = [CreateIssuanceBranding165946
|
|
|
19
20
|
export const DataStoreStatusListMigrations = [CreateStatusList1693866470000]
|
|
20
21
|
export const DataStoreEventLoggerMigrations = [CreateAuditEvents1701635835330]
|
|
21
22
|
export const DataStoreDigitalCredentialMigrations = [CreateDigitalCredential1708525189000]
|
|
23
|
+
export const DataStoreXStateStoreMigrations = [CreateXStateStore1708098041262]
|
|
22
24
|
|
|
23
25
|
// All migrations together
|
|
24
26
|
export const DataStoreMigrations = [
|
|
@@ -27,4 +29,5 @@ export const DataStoreMigrations = [
|
|
|
27
29
|
...DataStoreStatusListMigrations,
|
|
28
30
|
...DataStoreEventLoggerMigrations,
|
|
29
31
|
...DataStoreDigitalCredentialMigrations,
|
|
32
|
+
...DataStoreXStateStoreMigrations,
|
|
30
33
|
]
|
package/src/migrations/index.ts
CHANGED
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { enablePostgresUuidExtension } from '@sphereon/ssi-sdk.core'
|
|
2
|
+
import { MigrationInterface, QueryRunner } from 'typeorm'
|
|
3
|
+
|
|
4
|
+
export class CreateXStateStore1708797018115 implements MigrationInterface {
|
|
5
|
+
name = 'CreateXStateStore1708797018115'
|
|
6
|
+
|
|
7
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
8
|
+
await enablePostgresUuidExtension(queryRunner)
|
|
9
|
+
await queryRunner.query(`
|
|
10
|
+
CREATE TABLE "StateEntity" (
|
|
11
|
+
"id" uuid NOT NULL DEFAULT uuid_generate_v4(),
|
|
12
|
+
"state_name" character varying NOT NULL,
|
|
13
|
+
"machine_type" character varying NOT NULL,
|
|
14
|
+
"xstate_event_type" character varying NOT NULL,
|
|
15
|
+
"state" text NOT NULL,
|
|
16
|
+
"created_at" TIMESTAMP NOT NULL DEFAULT now(),
|
|
17
|
+
"updated_at" TIMESTAMP NOT NULL DEFAULT now(),
|
|
18
|
+
"expires_at" TIMESTAMP,
|
|
19
|
+
"completed_at" TIMESTAMP,
|
|
20
|
+
"tenant_id" character varying,
|
|
21
|
+
CONSTRAINT "PK_StateEntity_id" PRIMARY KEY ("id")
|
|
22
|
+
)
|
|
23
|
+
`)
|
|
24
|
+
}
|
|
25
|
+
|
|
26
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
27
|
+
await queryRunner.query(`DROP TABLE "StateEntity"`)
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
import { MigrationInterface, QueryRunner } from 'typeorm'
|
|
2
|
+
|
|
3
|
+
export class CreateXStateStore1708796002272 implements MigrationInterface {
|
|
4
|
+
name = 'CreateXStateStore1708796002272'
|
|
5
|
+
|
|
6
|
+
public async up(queryRunner: QueryRunner): Promise<void> {
|
|
7
|
+
await queryRunner.query(`
|
|
8
|
+
CREATE TABLE "StateEntity" (
|
|
9
|
+
"id" varchar PRIMARY KEY NOT NULL,
|
|
10
|
+
"state_name" varchar NOT NULL,
|
|
11
|
+
"machine_type" varchar NOT NULL,
|
|
12
|
+
"xstate_event_type" varchar NOT NULL,
|
|
13
|
+
"state" text NOT NULL,
|
|
14
|
+
"created_at" datetime NOT NULL DEFAULT (datetime('now')),
|
|
15
|
+
"updated_at" datetime NOT NULL DEFAULT (datetime('now')),
|
|
16
|
+
"expires_at" datetime,
|
|
17
|
+
"completed_at" datetime,
|
|
18
|
+
"tenant_id" varchar
|
|
19
|
+
)
|
|
20
|
+
`)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
24
|
+
await queryRunner.query(`DROP TABLE "StateEntity"`)
|
|
25
|
+
}
|
|
26
|
+
}
|
package/src/types/index.ts
CHANGED