@sphereon/ssi-sdk.data-store 0.18.2-unstable.60 → 0.18.2-unstable.67
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/xstatePersistence/StateEntity.d.ts +3 -2
- package/dist/entities/xstatePersistence/StateEntity.d.ts.map +1 -1
- package/dist/entities/xstatePersistence/StateEntity.js +17 -28
- package/dist/entities/xstatePersistence/StateEntity.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -2
- package/dist/index.js.map +1 -1
- package/dist/migrations/generic/index.d.ts +1 -1
- package/dist/migrations/generic/index.d.ts.map +1 -1
- package/dist/migrations/generic/index.js +3 -3
- 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 -2
- package/dist/migrations/index.js.map +1 -1
- package/dist/migrations/postgres/1708097018115-CreateXStateStore.js +3 -3
- package/dist/migrations/postgres/1708097018115-CreateXStateStore.js.map +1 -1
- package/dist/migrations/sqlite/1708096002272-CreateXStateStore.js +3 -3
- package/dist/migrations/sqlite/1708096002272-CreateXStateStore.js.map +1 -1
- package/dist/types/index.d.ts +1 -1
- package/dist/types/index.d.ts.map +1 -1
- package/dist/types/index.js +1 -1
- package/dist/types/index.js.map +1 -1
- package/dist/types/xstatePersistence/IAbstractXStateStore.d.ts +29 -0
- package/dist/types/xstatePersistence/IAbstractXStateStore.d.ts.map +1 -0
- package/dist/types/xstatePersistence/{types.js → IAbstractXStateStore.js} +1 -1
- package/dist/types/xstatePersistence/IAbstractXStateStore.js.map +1 -0
- package/dist/utils/contact/MappingUtils.d.ts +1 -3
- package/dist/utils/contact/MappingUtils.d.ts.map +1 -1
- package/dist/utils/contact/MappingUtils.js +1 -13
- package/dist/utils/contact/MappingUtils.js.map +1 -1
- package/dist/xstatePersistence/IAbstractXStateStore.d.ts +5 -4
- package/dist/xstatePersistence/IAbstractXStateStore.d.ts.map +1 -1
- package/dist/xstatePersistence/IAbstractXStateStore.js.map +1 -1
- package/dist/xstatePersistence/XStateStore.d.ts +5 -3
- package/dist/xstatePersistence/XStateStore.d.ts.map +1 -1
- package/dist/xstatePersistence/XStateStore.js +28 -8
- package/dist/xstatePersistence/XStateStore.js.map +1 -1
- package/package.json +4 -4
- package/src/__tests__/xstatePersistence.entities.test.ts +45 -0
- package/src/__tests__/xstatePersistence.store.test.ts +120 -0
- package/src/entities/xstatePersistence/StateEntity.ts +30 -24
- package/src/index.ts +2 -2
- package/src/migrations/generic/index.ts +2 -2
- package/src/migrations/index.ts +1 -1
- package/src/migrations/postgres/1708097018115-CreateXStateStore.ts +3 -3
- package/src/migrations/sqlite/1708096002272-CreateXStateStore.ts +3 -3
- package/src/types/index.ts +1 -1
- package/src/types/xstatePersistence/IAbstractXStateStore.ts +33 -0
- package/src/utils/contact/MappingUtils.ts +1 -14
- package/src/xstatePersistence/IAbstractXStateStore.ts +5 -4
- package/src/xstatePersistence/XStateStore.ts +34 -11
- package/dist/types/xstatePersistence/types.d.ts +0 -23
- package/dist/types/xstatePersistence/types.d.ts.map +0 -1
- package/dist/types/xstatePersistence/types.js.map +0 -1
- package/src/types/xstatePersistence/types.ts +0 -27
|
@@ -15,25 +15,34 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
15
15
|
exports.XStateStore = void 0;
|
|
16
16
|
const debug_1 = __importDefault(require("debug"));
|
|
17
17
|
const StateEntity_1 = require("../entities/xstatePersistence/StateEntity");
|
|
18
|
-
const MappingUtils_1 = require("../utils/contact/MappingUtils");
|
|
19
18
|
const IAbstractXStateStore_1 = require("./IAbstractXStateStore");
|
|
20
19
|
const debug = (0, debug_1.default)('sphereon:ssi-sdk:xstatePersistence');
|
|
21
20
|
class XStateStore extends IAbstractXStateStore_1.IAbstractXStateStore {
|
|
22
21
|
constructor(dbConnection) {
|
|
23
22
|
super();
|
|
23
|
+
this.stateFrom = (state) => {
|
|
24
|
+
return {
|
|
25
|
+
state: state.id,
|
|
26
|
+
type: state.type,
|
|
27
|
+
createdAt: state.createdAt,
|
|
28
|
+
updatedAt: state.updatedAt,
|
|
29
|
+
completedAt: state.completedAt,
|
|
30
|
+
tenantId: state.tenantId
|
|
31
|
+
};
|
|
32
|
+
};
|
|
24
33
|
this.dbConnection = dbConnection;
|
|
25
34
|
}
|
|
26
35
|
saveState(state) {
|
|
27
36
|
return __awaiter(this, void 0, void 0, function* () {
|
|
28
37
|
const connection = yield this.dbConnection;
|
|
29
|
-
debug
|
|
30
|
-
|
|
38
|
+
debug(`Executing saveState with state: ${JSON.stringify(state)}`);
|
|
39
|
+
return connection.getRepository(StateEntity_1.StateEntity).save(state);
|
|
31
40
|
});
|
|
32
41
|
}
|
|
33
42
|
getState(args) {
|
|
34
43
|
return __awaiter(this, void 0, void 0, function* () {
|
|
35
44
|
const connection = yield this.dbConnection;
|
|
36
|
-
debug
|
|
45
|
+
debug(`Executing loadState query with type: ${args.type}`);
|
|
37
46
|
const result = yield connection.getRepository(StateEntity_1.StateEntity)
|
|
38
47
|
.findOne({
|
|
39
48
|
where: { type: args.type }
|
|
@@ -41,15 +50,26 @@ class XStateStore extends IAbstractXStateStore_1.IAbstractXStateStore {
|
|
|
41
50
|
if (!result) {
|
|
42
51
|
return Promise.reject(Error(`No state found for type: ${args.type}`));
|
|
43
52
|
}
|
|
44
|
-
return
|
|
53
|
+
return this.stateFrom(result);
|
|
54
|
+
});
|
|
55
|
+
}
|
|
56
|
+
getStates(args) {
|
|
57
|
+
return __awaiter(this, void 0, void 0, function* () {
|
|
58
|
+
const connection = yield this.dbConnection; // TODO apply everywhere
|
|
59
|
+
debug('Getting states', args);
|
|
60
|
+
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 })));
|
|
61
|
+
return result.map((event) => this.stateFrom(event));
|
|
45
62
|
});
|
|
46
63
|
}
|
|
47
64
|
deleteState(args) {
|
|
48
65
|
return __awaiter(this, void 0, void 0, function* () {
|
|
49
66
|
const connection = yield this.dbConnection;
|
|
50
|
-
debug
|
|
51
|
-
yield connection.
|
|
52
|
-
.delete(
|
|
67
|
+
debug(`Executing deleteState query with where clause: ${args.where} and params: ${JSON.stringify(args.parameters)}`);
|
|
68
|
+
yield connection.createQueryBuilder()
|
|
69
|
+
.delete()
|
|
70
|
+
.from(StateEntity_1.StateEntity)
|
|
71
|
+
.where(args.where, args.parameters)
|
|
72
|
+
.execute();
|
|
53
73
|
});
|
|
54
74
|
}
|
|
55
75
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"XStateStore.js","sourceRoot":"","sources":["../../src/xstatePersistence/XStateStore.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,kDAAyB;AAGzB,2EAAsE;AAEtE,
|
|
1
|
+
{"version":3,"file":"XStateStore.js","sourceRoot":"","sources":["../../src/xstatePersistence/XStateStore.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;AACA,kDAAyB;AAGzB,2EAAsE;AAEtE,iEAA4D;AAE5D,MAAM,KAAK,GAAG,IAAA,eAAK,EAAC,oCAAoC,CAAC,CAAA;AAEzD,MAAa,WAAY,SAAQ,2CAAoB;IAGjD,YAAY,YAAmC;QAC3C,KAAK,EAAE,CAAA;QA2CH,cAAS,GAAG,CAAC,KAAkB,EAAS,EAAE;YAC9C,OAAO;gBACH,KAAK,EAAE,KAAK,CAAC,EAAE;gBACf,IAAI,EAAE,KAAK,CAAC,IAAI;gBAChB,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,SAAS,EAAE,KAAK,CAAC,SAAS;gBAC1B,WAAW,EAAE,KAAK,CAAC,WAAW;gBAC9B,QAAQ,EAAE,KAAK,CAAC,QAAQ;aAC3B,CAAA;QACL,CAAC,CAAA;QAnDG,IAAI,CAAC,YAAY,GAAG,YAAY,CAAA;IACpC,CAAC;IAEK,SAAS,CAAC,KAAoB;;YAChC,MAAM,UAAU,GAAe,MAAM,IAAI,CAAC,YAAY,CAAA;YACtD,KAAK,CAAC,mCAAmC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,CAAC,CAAA;YACjE,OAAO,UAAU,CAAC,aAAa,CAAC,yBAAW,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7D,CAAC;KAAA;IAEK,QAAQ,CAAC,IAAkB;;YAC7B,MAAM,UAAU,GAAe,MAAM,IAAI,CAAC,YAAY,CAAA;YACtD,KAAK,CAAC,wCAAwC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAA;YAC1D,MAAM,MAAM,GAAuB,MAAM,UAAU,CAAC,aAAa,CAAC,yBAAW,CAAC;iBACzE,OAAO,CAAC;gBACL,KAAK,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE;aAC7B,CAAC,CAAA;YACN,IAAI,CAAC,MAAM,EAAE;gBACT,OAAO,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,4BAA4B,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAA;aACxE;YACD,OAAO,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC,CAAA;QACjC,CAAC;KAAA;IAEK,SAAS,CAAC,IAAoB;;YAChC,MAAM,UAAU,GAAe,MAAM,IAAI,CAAC,YAAY,CAAA,CAAC,wBAAwB;YAC/E,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC,CAAA;YAC7B,MAAM,MAAM,GAAuB,MAAM,UAAU,CAAC,aAAa,CAAC,yBAAW,CAAC,CAAC,IAAI,mBAC5E,CAAC,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,KAAI,EAAE,KAAK,EAAE,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,MAAM,EAAE,CAAC,EAC9C,CAAA;YAEF,OAAO,MAAM,CAAC,GAAG,CAAC,CAAC,KAAkB,EAAE,EAAE,CAAC,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAA;QACpE,CAAC;KAAA;IAEK,WAAW,CAAC,IAAqB;;YACnC,MAAM,UAAU,GAAe,MAAM,IAAI,CAAC,YAAY,CAAA;YACtD,KAAK,CAAC,kDAAkD,IAAI,CAAC,KAAK,gBAAgB,IAAI,CAAC,SAAS,CAAC,IAAI,CAAC,UAAU,CAAC,EAAE,CAAC,CAAA;YACpH,MAAM,UAAU,CAAC,kBAAkB,EAAE;iBAChC,MAAM,EAAE;iBACR,IAAI,CAAC,yBAAW,CAAC;iBACjB,KAAK,CAAC,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,UAAU,CAAC;iBAClC,OAAO,EAAE,CAAA;QAClB,CAAC;KAAA;CAYJ;AAzDD,kCAyDC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sphereon/ssi-sdk.data-store",
|
|
3
|
-
"version": "0.18.2-unstable.
|
|
3
|
+
"version": "0.18.2-unstable.67+3c9bd888",
|
|
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.18.2-unstable.
|
|
17
|
-
"@sphereon/ssi-types": "0.18.2-unstable.
|
|
16
|
+
"@sphereon/ssi-sdk.core": "0.18.2-unstable.67+3c9bd888",
|
|
17
|
+
"@sphereon/ssi-types": "0.18.2-unstable.67+3c9bd888",
|
|
18
18
|
"@veramo/core": "4.2.0",
|
|
19
19
|
"class-validator": "^0.14.0",
|
|
20
20
|
"debug": "^4.3.4",
|
|
@@ -43,5 +43,5 @@
|
|
|
43
43
|
"PostgreSQL",
|
|
44
44
|
"Contact Store"
|
|
45
45
|
],
|
|
46
|
-
"gitHead": "
|
|
46
|
+
"gitHead": "3c9bd88842928319f8e8c72d0b17c82b7c84010e"
|
|
47
47
|
}
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
import {DataSource} from 'typeorm'
|
|
2
|
+
import {StateEntity, stateEntityFrom} from "../entities/xstatePersistence/StateEntity";
|
|
3
|
+
|
|
4
|
+
import {DataStoreXStateStoreEntities, DataStoreXStateStoreMigrations, NonPersistedXStateStoreEvent} 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 xstateEvent: NonPersistedXStateStoreEvent = {
|
|
29
|
+
state: 'test_state',
|
|
30
|
+
type: 'b40b8474-58a2-4b23-9fde-bd6ee1902cdb',
|
|
31
|
+
completedAt: new Date(),
|
|
32
|
+
tenantId: 'test_tenant_id'
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
const xstateEventEntity: StateEntity = stateEntityFrom(xstateEvent)
|
|
36
|
+
const fromDb: StateEntity = await dbConnection.getRepository(StateEntity).save(xstateEventEntity)
|
|
37
|
+
|
|
38
|
+
expect(fromDb).toBeDefined()
|
|
39
|
+
expect(fromDb?.id).not.toBeNull()
|
|
40
|
+
expect(fromDb?.type).toEqual(xstateEvent.type)
|
|
41
|
+
expect(fromDb?.state).toEqual(xstateEvent.state)
|
|
42
|
+
expect(fromDb?.tenantId).toEqual(xstateEvent.tenantId)
|
|
43
|
+
expect(fromDb?.completedAt).toEqual(xstateEvent.completedAt)
|
|
44
|
+
})
|
|
45
|
+
})
|
|
@@ -0,0 +1,120 @@
|
|
|
1
|
+
import {DataSource} from 'typeorm'
|
|
2
|
+
import {DataStoreXStateStoreEntities, GetStateArgs, NonPersistedXStateStoreEvent, State, XStateStore} from '../index'
|
|
3
|
+
import {DataStoreXStateStoreMigrations} from '../migrations'
|
|
4
|
+
|
|
5
|
+
describe('Database entities tests', (): void => {
|
|
6
|
+
let dbConnection: DataSource
|
|
7
|
+
let xstateStore: XStateStore
|
|
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
|
+
xstateStore = new XStateStore(dbConnection)
|
|
22
|
+
})
|
|
23
|
+
|
|
24
|
+
afterEach(async (): Promise<void> => {
|
|
25
|
+
await dbConnection.destroy()
|
|
26
|
+
})
|
|
27
|
+
|
|
28
|
+
it('should store xstate event', async (): Promise<void> => {
|
|
29
|
+
const xstateEvent: NonPersistedXStateStoreEvent = {
|
|
30
|
+
state: 'test_state',
|
|
31
|
+
type: 'b40b8474-58a2-4b23-9fde-bd6ee1902cdb',
|
|
32
|
+
createdAt: new Date(),
|
|
33
|
+
updatedAt: new Date(),
|
|
34
|
+
completedAt: new Date(),
|
|
35
|
+
tenantId: 'test_tenant_id'
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const savedXStoreEvent: State = await xstateStore.saveState(xstateEvent)
|
|
39
|
+
expect(savedXStoreEvent).toBeDefined()
|
|
40
|
+
})
|
|
41
|
+
|
|
42
|
+
it('should get all state events', async (): Promise<void> => {
|
|
43
|
+
const xstateEvent: NonPersistedXStateStoreEvent = {
|
|
44
|
+
state: 'test_state',
|
|
45
|
+
type: 'b40b8474-58a2-4b23-9fde-bd6ee1902cdb',
|
|
46
|
+
completedAt: new Date(),
|
|
47
|
+
tenantId: 'test_tenant_id'
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
const stateEvent1: NonPersistedXStateStoreEvent = await xstateStore.saveState({...xstateEvent})
|
|
51
|
+
expect(stateEvent1).toBeDefined()
|
|
52
|
+
|
|
53
|
+
const stateEvent2: NonPersistedXStateStoreEvent = await xstateStore.saveState({...xstateEvent})
|
|
54
|
+
expect(stateEvent2).toBeDefined()
|
|
55
|
+
|
|
56
|
+
const result: Array<State> = await xstateStore.getStates()
|
|
57
|
+
expect(result).toHaveLength(2)
|
|
58
|
+
})
|
|
59
|
+
|
|
60
|
+
it('should retrieve an xstate event', async (): Promise<void> => {
|
|
61
|
+
const xstateEvent: NonPersistedXStateStoreEvent = {
|
|
62
|
+
state: 'test_state',
|
|
63
|
+
type: 'b40b8474-58a2-4b23-9fde-bd6ee1902cdb',
|
|
64
|
+
completedAt: new Date(),
|
|
65
|
+
tenantId: 'test_tenant_id'
|
|
66
|
+
}
|
|
67
|
+
|
|
68
|
+
const savedXStoreEvent1: State = await xstateStore.saveState(xstateEvent)
|
|
69
|
+
expect(savedXStoreEvent1).toBeDefined()
|
|
70
|
+
|
|
71
|
+
const result: State = await xstateStore.getState(xstateEvent)
|
|
72
|
+
expect(result).toBeDefined()
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
it('should return an error if type filter does not match', async (): Promise<void> => {
|
|
76
|
+
const args: GetStateArgs = {
|
|
77
|
+
type: 'unknown_event'
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
await expect(xstateStore.getState(args)).rejects.toEqual(Error('No state found for type: unknown_event'))
|
|
81
|
+
})
|
|
82
|
+
|
|
83
|
+
it('should delete the expired records', async () => {
|
|
84
|
+
const now = new Date()
|
|
85
|
+
const newestXstateEvent: NonPersistedXStateStoreEvent = {
|
|
86
|
+
state: 'test_state',
|
|
87
|
+
type: 'test_type_1',
|
|
88
|
+
createdAt: now,
|
|
89
|
+
completedAt: new Date(),
|
|
90
|
+
tenantId: 'test_tenant_id'
|
|
91
|
+
}
|
|
92
|
+
const middleXstateEvent: NonPersistedXStateStoreEvent = {
|
|
93
|
+
state: 'test_state',
|
|
94
|
+
type: 'test_type_2',
|
|
95
|
+
createdAt: new Date(+now - 30000),
|
|
96
|
+
completedAt: new Date(),
|
|
97
|
+
tenantId: 'test_tenant_id'
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
const oldestXstateEvent: NonPersistedXStateStoreEvent = {
|
|
101
|
+
state: 'test_state',
|
|
102
|
+
type: 'test_type_3',
|
|
103
|
+
createdAt: new Date(+now - 60000),
|
|
104
|
+
completedAt: new Date(),
|
|
105
|
+
tenantId: 'test_tenant_id'
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
await xstateStore.saveState(oldestXstateEvent)
|
|
109
|
+
await xstateStore.saveState(middleXstateEvent)
|
|
110
|
+
await xstateStore.saveState(newestXstateEvent)
|
|
111
|
+
|
|
112
|
+
await xstateStore.deleteState({
|
|
113
|
+
where: `created_at < datetime('now', :ttl)`, parameters: { ttl: '-30 seconds' }
|
|
114
|
+
})
|
|
115
|
+
|
|
116
|
+
await expect(xstateStore.getState({ type: 'test_type_1'})).resolves.toBeDefined()
|
|
117
|
+
await expect(xstateStore.getState({ type: 'test_type_2'})).resolves.toBeDefined()
|
|
118
|
+
await expect(xstateStore.getState({ type: 'test_type_3'})).rejects.toEqual(Error('No state found for type: test_type_3'))
|
|
119
|
+
})
|
|
120
|
+
})
|
|
@@ -1,29 +1,35 @@
|
|
|
1
|
-
import {BaseEntity, Column, Entity,
|
|
1
|
+
import {BaseEntity, Column, CreateDateColumn, Entity, PrimaryGeneratedColumn, UpdateDateColumn} from "typeorm"
|
|
2
|
+
import {NonPersistedXStateStoreEvent} from "../../types";
|
|
2
3
|
|
|
3
4
|
@Entity('StateEntity')
|
|
4
5
|
export class StateEntity extends BaseEntity {
|
|
5
|
-
@
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
@Column()
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
@Column()
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
@
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
@
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
@Column({ type: '
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
@Column()
|
|
24
|
-
// @ts-ignore
|
|
6
|
+
@PrimaryGeneratedColumn('uuid', { name: 'id' })
|
|
7
|
+
id!: string
|
|
8
|
+
|
|
9
|
+
@Column({ name: 'state', nullable: false })
|
|
10
|
+
state!: string
|
|
11
|
+
|
|
12
|
+
@Column({ name: 'type', nullable: false })
|
|
13
|
+
type!: string
|
|
14
|
+
|
|
15
|
+
@CreateDateColumn({ name: 'created_at', nullable: false })
|
|
16
|
+
createdAt!: Date
|
|
17
|
+
|
|
18
|
+
@UpdateDateColumn({ name: 'updated_at', nullable: false })
|
|
19
|
+
updatedAt!: Date
|
|
20
|
+
|
|
21
|
+
@Column({ name: 'completed_at', type: 'datetime', nullable: true })
|
|
22
|
+
completedAt?: Date
|
|
23
|
+
|
|
24
|
+
@Column({ name: 'tenant_id', type: 'varchar', nullable: true })
|
|
25
25
|
tenantId?: string
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export const stateEntityFrom = (args: NonPersistedXStateStoreEvent): StateEntity => {
|
|
29
|
+
const stateEntity = new StateEntity()
|
|
30
|
+
stateEntity.state = args.state
|
|
31
|
+
stateEntity.type = args.type
|
|
32
|
+
stateEntity.completedAt = args.completedAt
|
|
33
|
+
stateEntity.tenantId = args.tenantId
|
|
34
|
+
return stateEntity
|
|
29
35
|
}
|
package/src/index.ts
CHANGED
|
@@ -18,7 +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/xstatePersistence/StateEntity";
|
|
21
|
+
import { StateEntity } from "./entities/xstatePersistence/StateEntity";
|
|
22
22
|
import { IStatusListEntity, IStatusListEntryEntity } from './types'
|
|
23
23
|
import { PartyRelationshipEntity } from './entities/contact/PartyRelationshipEntity'
|
|
24
24
|
import { PartyTypeEntity } from './entities/contact/PartyTypeEntity'
|
|
@@ -42,7 +42,7 @@ export {
|
|
|
42
42
|
DataStoreContactMigrations,
|
|
43
43
|
DataStoreIssuanceBrandingMigrations,
|
|
44
44
|
DataStoreStatusListMigrations,
|
|
45
|
-
|
|
45
|
+
DataStoreXStateStoreMigrations,
|
|
46
46
|
} from './migrations'
|
|
47
47
|
export * from './types'
|
|
48
48
|
export * from './utils/contact/MappingUtils'
|
|
@@ -18,7 +18,7 @@ export const DataStoreContactMigrations = [CreateContacts1659463079429, CreateCo
|
|
|
18
18
|
export const DataStoreIssuanceBrandingMigrations = [CreateIssuanceBranding1659463079429]
|
|
19
19
|
export const DataStoreStatusListMigrations = [CreateStatusList1693866470000]
|
|
20
20
|
export const DataStoreEventLoggerMigrations = [CreateAuditEvents1701635835330]
|
|
21
|
-
export const
|
|
21
|
+
export const DataStoreXStateStoreMigrations = [CreateXStateStore1708098041262]
|
|
22
22
|
|
|
23
23
|
// All migrations together
|
|
24
24
|
export const DataStoreMigrations = [
|
|
@@ -26,5 +26,5 @@ export const DataStoreMigrations = [
|
|
|
26
26
|
...DataStoreIssuanceBrandingMigrations,
|
|
27
27
|
...DataStoreStatusListMigrations,
|
|
28
28
|
...DataStoreEventLoggerMigrations,
|
|
29
|
-
...
|
|
29
|
+
...DataStoreXStateStoreMigrations
|
|
30
30
|
]
|
package/src/migrations/index.ts
CHANGED
|
@@ -7,12 +7,12 @@ export class CreateXStateStore1708097018115 implements MigrationInterface {
|
|
|
7
7
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
|
8
8
|
await enablePostgresUuidExtension(queryRunner)
|
|
9
9
|
await queryRunner.query(
|
|
10
|
-
`CREATE TABLE "
|
|
10
|
+
`CREATE TABLE "StateEntity" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "state" varchar(255) NOT NULL, "type" varchar(255) NOT NULL, "created_at" TIMESTAMP NOT NULL DEFAULT now(), "updated_at" TIMESTAMP NOT NULL DEFAULT now(), "completed_at" TIMESTAMP, "tenant_id" varchar(255) NULL, "ttl" INTEGER NULL, CONSTRAINT PK_XStateStore_id PRIMARY KEY ("id"))`
|
|
11
11
|
)
|
|
12
12
|
}
|
|
13
13
|
|
|
14
14
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
15
|
-
await queryRunner.query(`ALTER TABLE "
|
|
16
|
-
await queryRunner.query(`DROP TABLE "
|
|
15
|
+
await queryRunner.query(`ALTER TABLE "StateEntity" DROP CONSTRAINT "PK_StateStore_id"`)
|
|
16
|
+
await queryRunner.query(`DROP TABLE "StateEntity"`)
|
|
17
17
|
}
|
|
18
18
|
}
|
|
@@ -5,12 +5,12 @@ export class CreateXStateStore1708096002272 implements MigrationInterface {
|
|
|
5
5
|
|
|
6
6
|
public async up(queryRunner: QueryRunner): Promise<any> {
|
|
7
7
|
await queryRunner.query(
|
|
8
|
-
`CREATE TABLE "
|
|
8
|
+
`CREATE TABLE "StateEntity" ("id" varchar PRIMARY KEY, "state" varchar(255) NOT NULL, "type" varchar(255) NOT NULL, "created_at" DATETIME NOT NULL DEFAULT (datetime('now')), "updated_at" DATETIME NOT NULL DEFAULT (datetime('now')), "completed_at" DATETIME, "tenant_id" varchar(255) NULL, "ttl" INTEGER NULL)`
|
|
9
9
|
)
|
|
10
10
|
}
|
|
11
11
|
|
|
12
12
|
public async down(queryRunner: QueryRunner): Promise<void> {
|
|
13
|
-
await queryRunner.query(`ALTER TABLE "
|
|
14
|
-
await queryRunner.query(`DROP TABLE "
|
|
13
|
+
await queryRunner.query(`ALTER TABLE "StateEntity"`)
|
|
14
|
+
await queryRunner.query(`DROP TABLE "StateEntity"`)
|
|
15
15
|
}
|
|
16
16
|
}
|
package/src/types/index.ts
CHANGED
|
@@ -7,4 +7,4 @@ export * from './statusList/statusList'
|
|
|
7
7
|
export * from './statusList/IAbstractStatusListStore'
|
|
8
8
|
export * from './eventLogger/IAbstractEventLoggerStore'
|
|
9
9
|
export * from './eventLogger/eventLogger'
|
|
10
|
-
export * from './xstatePersistence/
|
|
10
|
+
export * from './xstatePersistence/IAbstractXStateStore'
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import {ObjectLiteral} from "typeorm";
|
|
2
|
+
|
|
3
|
+
export type SaveStateArgs = {
|
|
4
|
+
state: string
|
|
5
|
+
type: string
|
|
6
|
+
createdAt?: Date
|
|
7
|
+
updatedAt?: Date
|
|
8
|
+
completedAt?: Date
|
|
9
|
+
tenantId?: string
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
export type GetStateArgs = Pick<SaveStateArgs, 'type'>
|
|
13
|
+
|
|
14
|
+
export type FindStatesArgs = Partial<SaveStateArgs>
|
|
15
|
+
|
|
16
|
+
export type GetStatesArgs = {
|
|
17
|
+
filter: FindStatesArgs
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
export type NonPersistedXStateStoreEvent = SaveStateArgs
|
|
21
|
+
|
|
22
|
+
export type DeleteStateArgs = { where: string, parameters?: ObjectLiteral }
|
|
23
|
+
|
|
24
|
+
export type VoidResult = void
|
|
25
|
+
|
|
26
|
+
export type State = {
|
|
27
|
+
state: string
|
|
28
|
+
type: string
|
|
29
|
+
createdAt: Date
|
|
30
|
+
updatedAt: Date
|
|
31
|
+
completedAt?: Date
|
|
32
|
+
tenantId?: string
|
|
33
|
+
}
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import {StateEntity} from "../../entities/xstatePersistence/StateEntity";
|
|
2
1
|
import {
|
|
3
2
|
Connection,
|
|
4
3
|
ConnectionConfig,
|
|
@@ -27,7 +26,7 @@ import {
|
|
|
27
26
|
Organization,
|
|
28
27
|
Party,
|
|
29
28
|
PartyRelationship,
|
|
30
|
-
PartyType,
|
|
29
|
+
PartyType,
|
|
31
30
|
} from '../../types'
|
|
32
31
|
import { PartyEntity } from '../../entities/contact/PartyEntity'
|
|
33
32
|
import { IdentityEntity } from '../../entities/contact/IdentityEntity'
|
|
@@ -343,15 +342,3 @@ export const isOpenIdConfig = (config: NonPersistedConnectionConfig | BaseConfig
|
|
|
343
342
|
|
|
344
343
|
export const isDidAuthConfig = (config: NonPersistedConnectionConfig | BaseConfigEntity): config is DidAuthConfig | DidAuthConfigEntity =>
|
|
345
344
|
'identifier' in config && 'redirectUrl' in config && 'sessionId' in config
|
|
346
|
-
|
|
347
|
-
export const stateFrom = (state: StateEntity): State => {
|
|
348
|
-
return {
|
|
349
|
-
state: state.id,
|
|
350
|
-
type: state.type,
|
|
351
|
-
createdAt: state.createdAt,
|
|
352
|
-
updatedAt: state.updatedAt,
|
|
353
|
-
completedAt: state.completedAt,
|
|
354
|
-
tenantId: state.tenantId,
|
|
355
|
-
ttl: state.ttl
|
|
356
|
-
}
|
|
357
|
-
}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
|
-
import {GetStateArgs,
|
|
1
|
+
import {DeleteStateArgs, GetStateArgs, GetStatesArgs, SaveStateArgs, State, VoidResult} from "../types";
|
|
2
2
|
|
|
3
3
|
export abstract class IAbstractXStateStore {
|
|
4
|
-
abstract saveState(state: SaveStateArgs): Promise<
|
|
5
|
-
abstract getState(args: GetStateArgs): Promise<
|
|
6
|
-
abstract
|
|
4
|
+
abstract saveState(state: SaveStateArgs): Promise<State>
|
|
5
|
+
abstract getState(args: GetStateArgs): Promise<State>
|
|
6
|
+
abstract getStates(args?: GetStatesArgs): Promise<Array<State>>
|
|
7
|
+
abstract deleteState(args: DeleteStateArgs): Promise<VoidResult>
|
|
7
8
|
}
|
|
@@ -3,8 +3,7 @@ import Debug from 'debug'
|
|
|
3
3
|
import {DataSource} from "typeorm";
|
|
4
4
|
|
|
5
5
|
import {StateEntity} from "../entities/xstatePersistence/StateEntity";
|
|
6
|
-
import {DeleteStateArgs, GetStateArgs,
|
|
7
|
-
import {stateFrom} from "../utils/contact/MappingUtils";
|
|
6
|
+
import {DeleteStateArgs, GetStateArgs, GetStatesArgs, SaveStateArgs, State, VoidResult,} from "../types";
|
|
8
7
|
import {IAbstractXStateStore} from "./IAbstractXStateStore";
|
|
9
8
|
|
|
10
9
|
const debug = Debug('sphereon:ssi-sdk:xstatePersistence')
|
|
@@ -17,15 +16,15 @@ export class XStateStore extends IAbstractXStateStore {
|
|
|
17
16
|
this.dbConnection = dbConnection
|
|
18
17
|
}
|
|
19
18
|
|
|
20
|
-
async saveState(state: SaveStateArgs): Promise<
|
|
19
|
+
async saveState(state: SaveStateArgs): Promise<State> {
|
|
21
20
|
const connection: DataSource = await this.dbConnection
|
|
22
|
-
debug
|
|
23
|
-
|
|
21
|
+
debug(`Executing saveState with state: ${JSON.stringify(state)}`)
|
|
22
|
+
return connection.getRepository(StateEntity).save(state);
|
|
24
23
|
}
|
|
25
24
|
|
|
26
|
-
async getState(args: GetStateArgs): Promise<
|
|
25
|
+
async getState(args: GetStateArgs): Promise<State> {
|
|
27
26
|
const connection: DataSource = await this.dbConnection
|
|
28
|
-
debug
|
|
27
|
+
debug(`Executing loadState query with type: ${args.type}`)
|
|
29
28
|
const result: StateEntity | null = await connection.getRepository(StateEntity)
|
|
30
29
|
.findOne({
|
|
31
30
|
where: { type: args.type }
|
|
@@ -33,13 +32,37 @@ export class XStateStore extends IAbstractXStateStore {
|
|
|
33
32
|
if (!result) {
|
|
34
33
|
return Promise.reject(Error(`No state found for type: ${args.type}`))
|
|
35
34
|
}
|
|
36
|
-
return stateFrom(result)
|
|
35
|
+
return this.stateFrom(result)
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
async getStates(args?: GetStatesArgs): Promise<Array<State>> {
|
|
39
|
+
const connection: DataSource = await this.dbConnection // TODO apply everywhere
|
|
40
|
+
debug('Getting states', args)
|
|
41
|
+
const result: Array<StateEntity> = await connection.getRepository(StateEntity).find({
|
|
42
|
+
...(args?.filter && { where: args?.filter }),
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
return result.map((event: StateEntity) => this.stateFrom(event))
|
|
37
46
|
}
|
|
38
47
|
|
|
39
48
|
async deleteState(args: DeleteStateArgs): Promise<VoidResult> {
|
|
40
49
|
const connection: DataSource = await this.dbConnection
|
|
41
|
-
debug
|
|
42
|
-
await connection.
|
|
43
|
-
.delete(
|
|
50
|
+
debug(`Executing deleteState query with where clause: ${args.where} and params: ${JSON.stringify(args.parameters)}`)
|
|
51
|
+
await connection.createQueryBuilder()
|
|
52
|
+
.delete()
|
|
53
|
+
.from(StateEntity)
|
|
54
|
+
.where(args.where, args.parameters)
|
|
55
|
+
.execute()
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
private stateFrom = (state: StateEntity): State => {
|
|
59
|
+
return {
|
|
60
|
+
state: state.id,
|
|
61
|
+
type: state.type,
|
|
62
|
+
createdAt: state.createdAt,
|
|
63
|
+
updatedAt: state.updatedAt,
|
|
64
|
+
completedAt: state.completedAt,
|
|
65
|
+
tenantId: state.tenantId
|
|
66
|
+
}
|
|
44
67
|
}
|
|
45
68
|
}
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
export type SaveStateArgs = {
|
|
2
|
-
state: string;
|
|
3
|
-
type: string;
|
|
4
|
-
createdAt: Date;
|
|
5
|
-
updatedAt: Date;
|
|
6
|
-
completedAt: Date;
|
|
7
|
-
tenantId?: string;
|
|
8
|
-
ttl: number;
|
|
9
|
-
};
|
|
10
|
-
export type GetStateArgs = Pick<SaveStateArgs, 'type'>;
|
|
11
|
-
export type DeleteStateArgs = Pick<SaveStateArgs, 'type'>;
|
|
12
|
-
export type VoidResult = void;
|
|
13
|
-
export type GetStateResult = State;
|
|
14
|
-
export type State = {
|
|
15
|
-
state: string;
|
|
16
|
-
type: string;
|
|
17
|
-
createdAt: Date;
|
|
18
|
-
updatedAt: Date;
|
|
19
|
-
completedAt: Date;
|
|
20
|
-
tenantId?: string;
|
|
21
|
-
ttl: number;
|
|
22
|
-
};
|
|
23
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/types/xstatePersistence/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,aAAa,GAAG;IACxB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,WAAW,EAAE,IAAI,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;CACd,CAAA;AAED,MAAM,MAAM,YAAY,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AAEtD,MAAM,MAAM,eAAe,GAAG,IAAI,CAAC,aAAa,EAAE,MAAM,CAAC,CAAA;AAEzD,MAAM,MAAM,UAAU,GAAG,IAAI,CAAA;AAE7B,MAAM,MAAM,cAAc,GAAG,KAAK,CAAA;AAElC,MAAM,MAAM,KAAK,GAAG;IAChB,KAAK,EAAE,MAAM,CAAA;IACb,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,IAAI,CAAA;IACf,SAAS,EAAE,IAAI,CAAA;IACf,WAAW,EAAE,IAAI,CAAA;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAA;IACjB,GAAG,EAAE,MAAM,CAAA;CACd,CAAA"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/types/xstatePersistence/types.ts"],"names":[],"mappings":""}
|
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
export type SaveStateArgs = {
|
|
2
|
-
state: string
|
|
3
|
-
type: string
|
|
4
|
-
createdAt: Date
|
|
5
|
-
updatedAt: Date
|
|
6
|
-
completedAt: Date
|
|
7
|
-
tenantId?: string
|
|
8
|
-
ttl: number
|
|
9
|
-
}
|
|
10
|
-
|
|
11
|
-
export type GetStateArgs = Pick<SaveStateArgs, 'type'>
|
|
12
|
-
|
|
13
|
-
export type DeleteStateArgs = Pick<SaveStateArgs, 'type'>
|
|
14
|
-
|
|
15
|
-
export type VoidResult = void
|
|
16
|
-
|
|
17
|
-
export type GetStateResult = State
|
|
18
|
-
|
|
19
|
-
export type State = {
|
|
20
|
-
state: string
|
|
21
|
-
type: string
|
|
22
|
-
createdAt: Date
|
|
23
|
-
updatedAt: Date
|
|
24
|
-
completedAt: Date
|
|
25
|
-
tenantId?: string
|
|
26
|
-
ttl: number
|
|
27
|
-
}
|