@sphereon/ssi-sdk.data-store 0.30.1-unstable.4 → 0.30.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (136) hide show
  1. package/LICENSE +201 -201
  2. package/README.md +77 -77
  3. package/dist/contact/ContactStore.d.ts.map +1 -1
  4. package/dist/digitalCredential/DigitalCredentialStore.d.ts.map +1 -1
  5. package/dist/eventLogger/EventLoggerStore.d.ts.map +1 -1
  6. package/dist/issuanceBranding/IssuanceBrandingStore.d.ts.map +1 -1
  7. package/dist/migrations/internal-migrations-ormconfig.d.ts.map +1 -1
  8. package/dist/migrations/postgres/1708525189001-CreateDigitalCredential.js +33 -33
  9. package/dist/migrations/postgres/1708797018115-CreateMachineStateStore.js +16 -16
  10. package/dist/migrations/postgres/1715761125001-CreateContacts.js +33 -33
  11. package/dist/migrations/postgres/1716475165345-CreatePresentationDefinitions.js +12 -12
  12. package/dist/migrations/sqlite/1708525189002-CreateDigitalCredential.js +32 -32
  13. package/dist/migrations/sqlite/1708796002272-CreateMachineStateStore.js +15 -15
  14. package/dist/migrations/sqlite/1710438363002-CreateContacts.js +13 -13
  15. package/dist/migrations/sqlite/1715761125002-CreateContacts.js +32 -32
  16. package/dist/migrations/sqlite/1716475165344-CreatePresentationDefinitions.js +9 -9
  17. package/dist/presentationDefinition/PDStore.d.ts.map +1 -1
  18. package/dist/utils/SortingUtils.d.ts.map +1 -1
  19. package/dist/utils/contact/MappingUtils.d.ts.map +1 -1
  20. package/dist/utils/digitalCredential/MappingUtils.d.ts.map +1 -1
  21. package/dist/utils/digitalCredential/MappingUtils.js +4 -4
  22. package/dist/utils/digitalCredential/MappingUtils.js.map +1 -1
  23. package/dist/utils/presentationDefinition/MappingUtils.js +2 -2
  24. package/dist/utils/presentationDefinition/MappingUtils.js.map +1 -1
  25. package/package.json +8 -8
  26. package/src/__tests__/contact.entities.test.ts +2642 -2642
  27. package/src/__tests__/contact.store.test.ts +2649 -2649
  28. package/src/__tests__/digitalCredential.entities.test.ts +274 -274
  29. package/src/__tests__/digitalCredential.store.test.ts +330 -330
  30. package/src/__tests__/eventLogger.entities.test.ts +76 -76
  31. package/src/__tests__/eventLogger.store.test.ts +130 -130
  32. package/src/__tests__/issuanceBranding.entities.test.ts +846 -846
  33. package/src/__tests__/issuanceBranding.store.test.ts +1886 -1886
  34. package/src/__tests__/machineState.entities.test.ts +53 -53
  35. package/src/__tests__/machineState.store.test.ts +176 -176
  36. package/src/__tests__/pd-manager.entities.test.ts +73 -73
  37. package/src/__tests__/pd-manager.store.test.ts +193 -193
  38. package/src/contact/AbstractContactStore.ts +71 -71
  39. package/src/contact/ContactStore.ts +768 -768
  40. package/src/digitalCredential/AbstractDigitalCredentialStore.ts +21 -21
  41. package/src/digitalCredential/DigitalCredentialStore.ts +189 -189
  42. package/src/entities/contact/BaseContactEntity.ts +51 -51
  43. package/src/entities/contact/ConnectionEntity.ts +35 -35
  44. package/src/entities/contact/ContactMetadataItemEntity.ts +51 -51
  45. package/src/entities/contact/CorrelationIdentifierEntity.ts +43 -43
  46. package/src/entities/contact/DidAuthConfigEntity.ts +20 -20
  47. package/src/entities/contact/ElectronicAddressEntity.ts +70 -70
  48. package/src/entities/contact/IdentityEntity.ts +107 -107
  49. package/src/entities/contact/IdentityMetadataItemEntity.ts +48 -48
  50. package/src/entities/contact/NaturalPersonEntity.ts +44 -44
  51. package/src/entities/contact/OpenIdConfigEntity.ts +32 -32
  52. package/src/entities/contact/OrganizationEntity.ts +35 -35
  53. package/src/entities/contact/PartyEntity.ts +117 -117
  54. package/src/entities/contact/PartyRelationshipEntity.ts +68 -68
  55. package/src/entities/contact/PartyTypeEntity.ts +63 -63
  56. package/src/entities/contact/PhysicalAddressEntity.ts +95 -95
  57. package/src/entities/digitalCredential/DigitalCredentialEntity.ts +98 -98
  58. package/src/entities/eventLogger/AuditEventEntity.ts +92 -92
  59. package/src/entities/issuanceBranding/BackgroundAttributesEntity.ts +42 -42
  60. package/src/entities/issuanceBranding/BaseLocaleBrandingEntity.ts +87 -87
  61. package/src/entities/issuanceBranding/CredentialBrandingEntity.ts +79 -79
  62. package/src/entities/issuanceBranding/CredentialLocaleBrandingEntity.ts +33 -33
  63. package/src/entities/issuanceBranding/ImageAttributesEntity.ts +57 -57
  64. package/src/entities/issuanceBranding/ImageDimensionsEntity.ts +22 -22
  65. package/src/entities/issuanceBranding/IssuerBrandingEntity.ts +73 -73
  66. package/src/entities/issuanceBranding/IssuerLocaleBrandingEntity.ts +33 -33
  67. package/src/entities/issuanceBranding/TextAttributesEntity.ts +31 -31
  68. package/src/entities/machineState/MachineStateInfoEntity.ts +59 -59
  69. package/src/entities/presentationDefinition/PresentationDefinitionItemEntity.ts +44 -44
  70. package/src/entities/statusList2021/StatusList2021Entity.ts +96 -96
  71. package/src/entities/statusList2021/StatusList2021EntryEntity.ts +29 -29
  72. package/src/eventLogger/AbstractEventLoggerStore.ts +7 -7
  73. package/src/eventLogger/EventLoggerStore.ts +62 -62
  74. package/src/index.ts +160 -160
  75. package/src/issuanceBranding/IssuanceBrandingStore.ts +559 -559
  76. package/src/machineState/IAbstractMachineStateStore.ts +65 -65
  77. package/src/machineState/MachineStateStore.ts +149 -149
  78. package/src/migrations/generic/1-CreateContacts.ts +66 -66
  79. package/src/migrations/generic/10-CreatePresentationDefinitions.ts +66 -66
  80. package/src/migrations/generic/2-CreateIssuanceBranding.ts +64 -64
  81. package/src/migrations/generic/3-CreateContacts.ts +66 -66
  82. package/src/migrations/generic/4-CreateStatusList.ts +54 -54
  83. package/src/migrations/generic/5-CreateAuditEvents.ts +66 -66
  84. package/src/migrations/generic/6-CreateDigitalCredential.ts +66 -66
  85. package/src/migrations/generic/7-CreateMachineStateStore.ts +66 -66
  86. package/src/migrations/generic/8-CreateContacts.ts +66 -66
  87. package/src/migrations/generic/9-CreateContacts.ts +66 -66
  88. package/src/migrations/generic/index.ts +43 -43
  89. package/src/migrations/index.ts +10 -10
  90. package/src/migrations/postgres/1659463079428-CreateContacts.ts +63 -63
  91. package/src/migrations/postgres/1685628974232-CreateIssuanceBranding.ts +85 -85
  92. package/src/migrations/postgres/1690925872592-CreateContacts.ts +158 -158
  93. package/src/migrations/postgres/1693866470001-CreateStatusList.ts +24 -24
  94. package/src/migrations/postgres/1701634812183-CreateAuditEvents.ts +33 -33
  95. package/src/migrations/postgres/1708525189001-CreateDigitalCredential.ts +61 -61
  96. package/src/migrations/postgres/1708797018115-CreateMachineStateStore.ts +29 -29
  97. package/src/migrations/postgres/1710438363001-CreateContacts.ts +63 -63
  98. package/src/migrations/postgres/1715761125001-CreateContacts.ts +60 -60
  99. package/src/migrations/postgres/1716475165345-CreatePresentationDefinitions.ts +25 -25
  100. package/src/migrations/sqlite/1659463069549-CreateContacts.ts +110 -110
  101. package/src/migrations/sqlite/1685628973231-CreateIssuanceBranding.ts +119 -119
  102. package/src/migrations/sqlite/1690925872693-CreateContacts.ts +228 -228
  103. package/src/migrations/sqlite/1693866470000-CreateStatusList.ts +24 -24
  104. package/src/migrations/sqlite/1701634819487-CreateAuditEvents.ts +15 -15
  105. package/src/migrations/sqlite/1708525189002-CreateDigitalCredential.ts +46 -46
  106. package/src/migrations/sqlite/1708796002272-CreateMachineStateStore.ts +28 -28
  107. package/src/migrations/sqlite/1710438363002-CreateContacts.ts +83 -83
  108. package/src/migrations/sqlite/1715761125002-CreateContacts.ts +59 -59
  109. package/src/migrations/sqlite/1716475165344-CreatePresentationDefinitions.ts +24 -24
  110. package/src/presentationDefinition/AbstractPDStore.ts +20 -20
  111. package/src/presentationDefinition/PDStore.ts +185 -185
  112. package/src/statusList/IStatusListStore.ts +44 -44
  113. package/src/statusList/StatusListStore.ts +236 -236
  114. package/src/types/contact/IAbstractContactStore.ts +161 -161
  115. package/src/types/contact/contact.ts +295 -295
  116. package/src/types/digitalCredential/IAbstractDigitalCredentialStore.ts +42 -42
  117. package/src/types/digitalCredential/digitalCredential.ts +102 -102
  118. package/src/types/eventLogger/IAbstractEventLoggerStore.ts +12 -12
  119. package/src/types/eventLogger/eventLogger.ts +3 -3
  120. package/src/types/index.ts +14 -14
  121. package/src/types/machineState/IAbstractMachineStateStore.ts +68 -68
  122. package/src/types/presentationDefinition/IAbstractPDStore.ts +25 -25
  123. package/src/types/presentationDefinition/presentationDefinition.ts +17 -17
  124. package/src/utils/SortingUtils.ts +16 -16
  125. package/src/utils/contact/MappingUtils.ts +506 -506
  126. package/src/utils/digitalCredential/MappingUtils.ts +160 -160
  127. package/src/utils/hasher.ts +19 -19
  128. package/src/utils/presentationDefinition/MappingUtils.ts +52 -52
  129. package/dist/entities/contact/IMetadataEntity.d.ts +0 -8
  130. package/dist/entities/contact/IMetadataEntity.d.ts.map +0 -1
  131. package/dist/entities/contact/IMetadataEntity.js +0 -2
  132. package/dist/entities/contact/IMetadataEntity.js.map +0 -1
  133. package/dist/migrations/generic/8-CreatePresentationDefinitions.d.ts +0 -7
  134. package/dist/migrations/generic/8-CreatePresentationDefinitions.d.ts.map +0 -1
  135. package/dist/migrations/generic/8-CreatePresentationDefinitions.js +0 -78
  136. package/dist/migrations/generic/8-CreatePresentationDefinitions.js.map +0 -1
@@ -1,53 +1,53 @@
1
- import { DataSources } from '@sphereon/ssi-sdk.agent-config'
2
- import { DataSource } from 'typeorm'
3
- import { MachineStateInfoEntity } from '../entities/machineState/MachineStateInfoEntity'
4
-
5
- import { DataStoreMachineStateEntities, DataStoreMachineStateMigrations, StoreMachineStatePersistArgs, MachineStateStore } from '../index'
6
-
7
- describe('Machine State Info Database entities tests', (): void => {
8
- let dbConnection: DataSource
9
-
10
- beforeEach(async (): Promise<void> => {
11
- DataSources.singleInstance().defaultDbType = 'sqlite'
12
- dbConnection = await new DataSource({
13
- type: 'sqlite',
14
- database: ':memory:',
15
- //logging: 'all',
16
- migrationsRun: false,
17
- migrations: DataStoreMachineStateMigrations,
18
- synchronize: false,
19
- entities: [...DataStoreMachineStateEntities],
20
- }).initialize()
21
- await dbConnection.runMigrations()
22
- expect(await dbConnection.showMigrations()).toBeFalsy()
23
- })
24
-
25
- afterEach(async (): Promise<void> => {
26
- await dbConnection.destroy()
27
- })
28
-
29
- it('should save machine state info to database', async (): Promise<void> => {
30
- const expiresAt = new Date()
31
- expiresAt.setTime(expiresAt.getTime() + 100000)
32
- const machineInfo: StoreMachineStatePersistArgs = {
33
- instanceId: 'Onboarding1',
34
- latestStateName: 'acceptAgreement',
35
- machineName: 'Onboarding',
36
- updatedCount: 0,
37
- latestEventType: 'SET_TOC',
38
- state: JSON.stringify({ myState: 'test_state' }),
39
- tenantId: 'test_tenant_id',
40
- expiresAt,
41
- }
42
- const fromDb: MachineStateInfoEntity = await dbConnection
43
- .getRepository(MachineStateInfoEntity)
44
- .save(MachineStateStore.machineStateInfoEntityFrom(machineInfo))
45
-
46
- expect(fromDb).toBeDefined()
47
- expect(fromDb?.instanceId).not.toBeNull()
48
- expect(fromDb?.machineName).toEqual(machineInfo.machineName)
49
- expect(fromDb?.state).toEqual(machineInfo.state)
50
- expect(fromDb?.tenantId).toEqual(machineInfo.tenantId)
51
- expect(fromDb?.completedAt).toBeNull()
52
- })
53
- })
1
+ import { DataSources } from '@sphereon/ssi-sdk.agent-config'
2
+ import { DataSource } from 'typeorm'
3
+ import { MachineStateInfoEntity } from '../entities/machineState/MachineStateInfoEntity'
4
+
5
+ import { DataStoreMachineStateEntities, DataStoreMachineStateMigrations, StoreMachineStatePersistArgs, MachineStateStore } from '../index'
6
+
7
+ describe('Machine State Info Database entities tests', (): void => {
8
+ let dbConnection: DataSource
9
+
10
+ beforeEach(async (): Promise<void> => {
11
+ DataSources.singleInstance().defaultDbType = 'sqlite'
12
+ dbConnection = await new DataSource({
13
+ type: 'sqlite',
14
+ database: ':memory:',
15
+ //logging: 'all',
16
+ migrationsRun: false,
17
+ migrations: DataStoreMachineStateMigrations,
18
+ synchronize: false,
19
+ entities: [...DataStoreMachineStateEntities],
20
+ }).initialize()
21
+ await dbConnection.runMigrations()
22
+ expect(await dbConnection.showMigrations()).toBeFalsy()
23
+ })
24
+
25
+ afterEach(async (): Promise<void> => {
26
+ await dbConnection.destroy()
27
+ })
28
+
29
+ it('should save machine state info to database', async (): Promise<void> => {
30
+ const expiresAt = new Date()
31
+ expiresAt.setTime(expiresAt.getTime() + 100000)
32
+ const machineInfo: StoreMachineStatePersistArgs = {
33
+ instanceId: 'Onboarding1',
34
+ latestStateName: 'acceptAgreement',
35
+ machineName: 'Onboarding',
36
+ updatedCount: 0,
37
+ latestEventType: 'SET_TOC',
38
+ state: JSON.stringify({ myState: 'test_state' }),
39
+ tenantId: 'test_tenant_id',
40
+ expiresAt,
41
+ }
42
+ const fromDb: MachineStateInfoEntity = await dbConnection
43
+ .getRepository(MachineStateInfoEntity)
44
+ .save(MachineStateStore.machineStateInfoEntityFrom(machineInfo))
45
+
46
+ expect(fromDb).toBeDefined()
47
+ expect(fromDb?.instanceId).not.toBeNull()
48
+ expect(fromDb?.machineName).toEqual(machineInfo.machineName)
49
+ expect(fromDb?.state).toEqual(machineInfo.state)
50
+ expect(fromDb?.tenantId).toEqual(machineInfo.tenantId)
51
+ expect(fromDb?.completedAt).toBeNull()
52
+ })
53
+ })
@@ -1,176 +1,176 @@
1
- import { DataSources } from '@sphereon/ssi-sdk.agent-config'
2
- import { DataSource } from 'typeorm'
3
- import { DataStoreMachineStateEntities, MachineStateStore, StoreMachineStatesFindActiveArgs, StoreMachineStatePersistArgs } from '../index'
4
- import { DataStoreMachineStateMigrations } from '../migrations'
5
-
6
- describe('Machine State store tests', (): void => {
7
- let dbConnection: DataSource
8
- let store: MachineStateStore
9
-
10
- beforeEach(async (): Promise<void> => {
11
- DataSources.singleInstance().defaultDbType = 'sqlite'
12
- dbConnection = await new DataSource({
13
- type: 'sqlite',
14
- database: ':memory:',
15
- logging: 'all',
16
- migrationsRun: false,
17
- migrations: DataStoreMachineStateMigrations,
18
- synchronize: false,
19
- entities: DataStoreMachineStateEntities,
20
- }).initialize()
21
- await dbConnection.runMigrations()
22
- expect(await dbConnection.showMigrations()).toBeFalsy()
23
- store = new MachineStateStore(dbConnection)
24
- })
25
-
26
- afterEach(async (): Promise<void> => {
27
- await dbConnection.destroy()
28
- })
29
-
30
- it('should store machine state info', async (): Promise<void> => {
31
- const persistArgs: StoreMachineStatePersistArgs = {
32
- instanceId: 'Onboarding1',
33
- machineName: 'Onboarding',
34
- updatedCount: 0,
35
- latestStateName: 'enterPersonalDetails',
36
- latestEventType: 'SET_PERSONAL_DATA',
37
- state: 'test_state',
38
- expiresAt: new Date(new Date().getDate() + 100000),
39
- tenantId: 'test_tenant_id',
40
- }
41
-
42
- const persistMachineStateResult = await store.persistMachineState(persistArgs)
43
- expect(persistMachineStateResult).toBeDefined()
44
- })
45
-
46
- it('should get all machines with their current state', async (): Promise<void> => {
47
- const persistArgs: StoreMachineStatePersistArgs = {
48
- instanceId: 'Onboarding1',
49
- machineName: 'Onboarding',
50
- latestStateName: 'enterPersonalDetails',
51
- latestEventType: 'SET_PERSONAL_DATA',
52
- updatedCount: 0,
53
- state: 'test_state',
54
- expiresAt: new Date(new Date().getDate() + 100000),
55
- tenantId: 'test_tenant_id',
56
- }
57
-
58
- const stateEvent1 = await store.persistMachineState({ ...persistArgs })
59
- expect(stateEvent1).toBeDefined()
60
-
61
- const stateEvent2 = await store.persistMachineState({ ...persistArgs, instanceId: 'Onboarding2' })
62
- expect(stateEvent2).toBeDefined()
63
-
64
- const result = await store.findMachineStates()
65
- expect(result).toHaveLength(2)
66
- })
67
-
68
- it('should retrieve a machine state', async (): Promise<void> => {
69
- const expiresAt = new Date()
70
- expiresAt.setTime(expiresAt.getTime() + 100000)
71
- const persistArgs: StoreMachineStatePersistArgs = {
72
- instanceId: 'Onboarding1',
73
- machineName: 'Onboarding',
74
- latestStateName: 'enterPersonalDetails',
75
- latestEventType: 'SET_PERSONAL_DATA',
76
- state: 'test_state',
77
- updatedCount: 0,
78
- expiresAt,
79
- tenantId: 'test_tenant_id',
80
- }
81
-
82
- const machineStatePersisted = await store.persistMachineState(persistArgs)
83
- expect(machineStatePersisted).toBeDefined()
84
- const result = await store.findActiveMachineStates({ machineName: persistArgs.machineName, tenantId: persistArgs.tenantId })
85
- expect(result).toBeDefined()
86
- })
87
-
88
- it('should delete a machine state', async (): Promise<void> => {
89
- const persistArgs: StoreMachineStatePersistArgs = {
90
- instanceId: 'Onboarding1',
91
- machineName: 'Onboarding',
92
- updatedCount: 0,
93
- latestStateName: 'enterPersonalDetails',
94
- latestEventType: 'SET_PERSONAL_DATA',
95
- state: 'test_state',
96
- expiresAt: new Date(new Date().getDate() + 100000),
97
- tenantId: 'test_tenant_id',
98
- }
99
-
100
- const persistedState = await store.persistMachineState(persistArgs)
101
- expect(persistedState).toBeDefined()
102
-
103
- const result: boolean = await store.deleteMachineState({ instanceId: persistedState.instanceId })
104
- expect(result).toBeTruthy()
105
- })
106
-
107
- it('should return an error if type filter does not match', async (): Promise<void> => {
108
- const args: StoreMachineStatesFindActiveArgs = {
109
- machineName: 'unknown_machine',
110
- }
111
-
112
- await expect(store.findActiveMachineStates(args)).resolves.toEqual([])
113
- })
114
-
115
- it('should delete the expired records', async () => {
116
- const futureExpiresAt = new Date()
117
- futureExpiresAt.setTime(futureExpiresAt.getTime() + 100000) // Future expiration
118
-
119
- const pastExpiresAt = new Date()
120
- pastExpiresAt.setTime(pastExpiresAt.getTime() - 100000) // Past expiration, already expired
121
-
122
- const oldestXstateEvent: StoreMachineStatePersistArgs = {
123
- instanceId: 'Onboarding1',
124
- machineName: 'Onboarding',
125
- latestStateName: 'enterPersonalDetails',
126
- latestEventType: 'SET_TOC',
127
- updatedCount: 0,
128
- state: 'test_state',
129
- expiresAt: futureExpiresAt,
130
- tenantId: 'test_tenant_id',
131
- }
132
- const middleXstateEvent: StoreMachineStatePersistArgs = {
133
- instanceId: 'Onboarding1',
134
- machineName: 'Onboarding',
135
- latestStateName: 'TOC',
136
- latestEventType: 'SET_POLICY2',
137
- updatedCount: 1,
138
- state: 'test_state',
139
- expiresAt: futureExpiresAt,
140
- tenantId: 'test_tenant_id',
141
- }
142
- const newestXstateEvent: StoreMachineStatePersistArgs = {
143
- instanceId: 'OnboardingExpired',
144
- machineName: 'Onboarding',
145
- latestStateName: 'POLICY',
146
- latestEventType: 'SET_PERSONAL_DATA',
147
- updatedCount: 0,
148
- state: 'test_state',
149
- expiresAt: pastExpiresAt, // This event should be already expired
150
- tenantId: 'test_tenant_id',
151
- }
152
-
153
- await store.persistMachineState(oldestXstateEvent)
154
- await store.persistMachineState(middleXstateEvent)
155
- await store.persistMachineState(newestXstateEvent)
156
-
157
- await expect(store.findActiveMachineStates({ machineName: 'Onboarding' })).resolves.toHaveLength(1)
158
-
159
- await store.deleteExpiredMachineStates({})
160
- await expect(store.findActiveMachineStates({ machineName: 'Onboarding' })).resolves.toHaveLength(1)
161
- await expect(store.findActiveMachineStates({ machineName: 'Onboarding' })).resolves.toMatchObject([
162
- {
163
- completedAt: null,
164
- createdAt: expect.anything(),
165
- expiresAt: expect.anything(),
166
- instanceId: 'Onboarding1',
167
- latestEventType: 'SET_POLICY2',
168
- latestStateName: 'TOC',
169
- machineName: 'Onboarding',
170
- state: 'test_state',
171
- tenantId: 'test_tenant_id',
172
- updatedAt: expect.anything(),
173
- },
174
- ])
175
- })
176
- })
1
+ import { DataSources } from '@sphereon/ssi-sdk.agent-config'
2
+ import { DataSource } from 'typeorm'
3
+ import { DataStoreMachineStateEntities, MachineStateStore, StoreMachineStatesFindActiveArgs, StoreMachineStatePersistArgs } from '../index'
4
+ import { DataStoreMachineStateMigrations } from '../migrations'
5
+
6
+ describe('Machine State store tests', (): void => {
7
+ let dbConnection: DataSource
8
+ let store: MachineStateStore
9
+
10
+ beforeEach(async (): Promise<void> => {
11
+ DataSources.singleInstance().defaultDbType = 'sqlite'
12
+ dbConnection = await new DataSource({
13
+ type: 'sqlite',
14
+ database: ':memory:',
15
+ logging: 'all',
16
+ migrationsRun: false,
17
+ migrations: DataStoreMachineStateMigrations,
18
+ synchronize: false,
19
+ entities: DataStoreMachineStateEntities,
20
+ }).initialize()
21
+ await dbConnection.runMigrations()
22
+ expect(await dbConnection.showMigrations()).toBeFalsy()
23
+ store = new MachineStateStore(dbConnection)
24
+ })
25
+
26
+ afterEach(async (): Promise<void> => {
27
+ await dbConnection.destroy()
28
+ })
29
+
30
+ it('should store machine state info', async (): Promise<void> => {
31
+ const persistArgs: StoreMachineStatePersistArgs = {
32
+ instanceId: 'Onboarding1',
33
+ machineName: 'Onboarding',
34
+ updatedCount: 0,
35
+ latestStateName: 'enterPersonalDetails',
36
+ latestEventType: 'SET_PERSONAL_DATA',
37
+ state: 'test_state',
38
+ expiresAt: new Date(new Date().getDate() + 100000),
39
+ tenantId: 'test_tenant_id',
40
+ }
41
+
42
+ const persistMachineStateResult = await store.persistMachineState(persistArgs)
43
+ expect(persistMachineStateResult).toBeDefined()
44
+ })
45
+
46
+ it('should get all machines with their current state', async (): Promise<void> => {
47
+ const persistArgs: StoreMachineStatePersistArgs = {
48
+ instanceId: 'Onboarding1',
49
+ machineName: 'Onboarding',
50
+ latestStateName: 'enterPersonalDetails',
51
+ latestEventType: 'SET_PERSONAL_DATA',
52
+ updatedCount: 0,
53
+ state: 'test_state',
54
+ expiresAt: new Date(new Date().getDate() + 100000),
55
+ tenantId: 'test_tenant_id',
56
+ }
57
+
58
+ const stateEvent1 = await store.persistMachineState({ ...persistArgs })
59
+ expect(stateEvent1).toBeDefined()
60
+
61
+ const stateEvent2 = await store.persistMachineState({ ...persistArgs, instanceId: 'Onboarding2' })
62
+ expect(stateEvent2).toBeDefined()
63
+
64
+ const result = await store.findMachineStates()
65
+ expect(result).toHaveLength(2)
66
+ })
67
+
68
+ it('should retrieve a machine state', async (): Promise<void> => {
69
+ const expiresAt = new Date()
70
+ expiresAt.setTime(expiresAt.getTime() + 100000)
71
+ const persistArgs: StoreMachineStatePersistArgs = {
72
+ instanceId: 'Onboarding1',
73
+ machineName: 'Onboarding',
74
+ latestStateName: 'enterPersonalDetails',
75
+ latestEventType: 'SET_PERSONAL_DATA',
76
+ state: 'test_state',
77
+ updatedCount: 0,
78
+ expiresAt,
79
+ tenantId: 'test_tenant_id',
80
+ }
81
+
82
+ const machineStatePersisted = await store.persistMachineState(persistArgs)
83
+ expect(machineStatePersisted).toBeDefined()
84
+ const result = await store.findActiveMachineStates({ machineName: persistArgs.machineName, tenantId: persistArgs.tenantId })
85
+ expect(result).toBeDefined()
86
+ })
87
+
88
+ it('should delete a machine state', async (): Promise<void> => {
89
+ const persistArgs: StoreMachineStatePersistArgs = {
90
+ instanceId: 'Onboarding1',
91
+ machineName: 'Onboarding',
92
+ updatedCount: 0,
93
+ latestStateName: 'enterPersonalDetails',
94
+ latestEventType: 'SET_PERSONAL_DATA',
95
+ state: 'test_state',
96
+ expiresAt: new Date(new Date().getDate() + 100000),
97
+ tenantId: 'test_tenant_id',
98
+ }
99
+
100
+ const persistedState = await store.persistMachineState(persistArgs)
101
+ expect(persistedState).toBeDefined()
102
+
103
+ const result: boolean = await store.deleteMachineState({ instanceId: persistedState.instanceId })
104
+ expect(result).toBeTruthy()
105
+ })
106
+
107
+ it('should return an error if type filter does not match', async (): Promise<void> => {
108
+ const args: StoreMachineStatesFindActiveArgs = {
109
+ machineName: 'unknown_machine',
110
+ }
111
+
112
+ await expect(store.findActiveMachineStates(args)).resolves.toEqual([])
113
+ })
114
+
115
+ it('should delete the expired records', async () => {
116
+ const futureExpiresAt = new Date()
117
+ futureExpiresAt.setTime(futureExpiresAt.getTime() + 100000) // Future expiration
118
+
119
+ const pastExpiresAt = new Date()
120
+ pastExpiresAt.setTime(pastExpiresAt.getTime() - 100000) // Past expiration, already expired
121
+
122
+ const oldestXstateEvent: StoreMachineStatePersistArgs = {
123
+ instanceId: 'Onboarding1',
124
+ machineName: 'Onboarding',
125
+ latestStateName: 'enterPersonalDetails',
126
+ latestEventType: 'SET_TOC',
127
+ updatedCount: 0,
128
+ state: 'test_state',
129
+ expiresAt: futureExpiresAt,
130
+ tenantId: 'test_tenant_id',
131
+ }
132
+ const middleXstateEvent: StoreMachineStatePersistArgs = {
133
+ instanceId: 'Onboarding1',
134
+ machineName: 'Onboarding',
135
+ latestStateName: 'TOC',
136
+ latestEventType: 'SET_POLICY2',
137
+ updatedCount: 1,
138
+ state: 'test_state',
139
+ expiresAt: futureExpiresAt,
140
+ tenantId: 'test_tenant_id',
141
+ }
142
+ const newestXstateEvent: StoreMachineStatePersistArgs = {
143
+ instanceId: 'OnboardingExpired',
144
+ machineName: 'Onboarding',
145
+ latestStateName: 'POLICY',
146
+ latestEventType: 'SET_PERSONAL_DATA',
147
+ updatedCount: 0,
148
+ state: 'test_state',
149
+ expiresAt: pastExpiresAt, // This event should be already expired
150
+ tenantId: 'test_tenant_id',
151
+ }
152
+
153
+ await store.persistMachineState(oldestXstateEvent)
154
+ await store.persistMachineState(middleXstateEvent)
155
+ await store.persistMachineState(newestXstateEvent)
156
+
157
+ await expect(store.findActiveMachineStates({ machineName: 'Onboarding' })).resolves.toHaveLength(1)
158
+
159
+ await store.deleteExpiredMachineStates({})
160
+ await expect(store.findActiveMachineStates({ machineName: 'Onboarding' })).resolves.toHaveLength(1)
161
+ await expect(store.findActiveMachineStates({ machineName: 'Onboarding' })).resolves.toMatchObject([
162
+ {
163
+ completedAt: null,
164
+ createdAt: expect.anything(),
165
+ expiresAt: expect.anything(),
166
+ instanceId: 'Onboarding1',
167
+ latestEventType: 'SET_POLICY2',
168
+ latestStateName: 'TOC',
169
+ machineName: 'Onboarding',
170
+ state: 'test_state',
171
+ tenantId: 'test_tenant_id',
172
+ updatedAt: expect.anything(),
173
+ },
174
+ ])
175
+ })
176
+ })
@@ -1,73 +1,73 @@
1
- import { DataSources } from '@sphereon/ssi-sdk.agent-config'
2
- import { DataSource } from 'typeorm'
3
- import { PresentationDefinitionItemEntity } from '../entities/presentationDefinition/PresentationDefinitionItemEntity'
4
- import { DataStorePresentationDefinitionMigrations } from '../migrations'
5
- import { DataStorePresentationDefinitionEntities } from '../index'
6
-
7
- describe('PresentationDefinitionItemEntity tests', (): void => {
8
- let dbConnection: DataSource
9
-
10
- beforeEach(async (): Promise<void> => {
11
- DataSources.singleInstance().defaultDbType = 'sqlite'
12
- dbConnection = await new DataSource({
13
- type: 'sqlite',
14
- database: ':memory:',
15
- logging: ['info'],
16
- synchronize: true,
17
- migrationsRun: false,
18
- migrations: DataStorePresentationDefinitionMigrations,
19
- entities: DataStorePresentationDefinitionEntities,
20
- }).initialize()
21
- })
22
-
23
- afterEach(async (): Promise<void> => {
24
- await dbConnection.destroy()
25
- })
26
-
27
- it('should create and retrieve PresentationDefinitionItemEntity', async (): Promise<void> => {
28
- const repository = dbConnection.getRepository(PresentationDefinitionItemEntity)
29
- const entity = new PresentationDefinitionItemEntity()
30
- entity.definitionId = 'definition1'
31
- entity.version = '1.0'
32
- entity.definitionPayload = JSON.stringify({ id: 'definition1', input_descriptors: [] })
33
-
34
- const savedEntity = await repository.save(entity)
35
- expect(savedEntity).toBeDefined()
36
- expect(savedEntity.id).toBeDefined()
37
-
38
- const retrievedEntity = await repository.findOneBy({ id: savedEntity.id })
39
- expect(retrievedEntity).toBeDefined()
40
- expect(retrievedEntity!.definitionId).toEqual('definition1')
41
- })
42
-
43
- it('should update PresentationDefinitionItemEntity', async (): Promise<void> => {
44
- const repository = dbConnection.getRepository(PresentationDefinitionItemEntity)
45
- const entity = new PresentationDefinitionItemEntity()
46
- entity.definitionId = 'definition1'
47
- entity.version = '1.0'
48
- entity.definitionPayload = JSON.stringify({ id: 'definition1', input_descriptors: [] })
49
-
50
- const savedEntity = await repository.save(entity)
51
- expect(savedEntity).toBeDefined()
52
-
53
- savedEntity.version = '1.1'
54
- const updatedEntity = await repository.save(savedEntity)
55
- expect(updatedEntity).toBeDefined()
56
- expect(updatedEntity.version).toEqual('1.1')
57
- })
58
-
59
- it('should delete PresentationDefinitionItemEntity', async (): Promise<void> => {
60
- const repository = dbConnection.getRepository(PresentationDefinitionItemEntity)
61
- const entity = new PresentationDefinitionItemEntity()
62
- entity.definitionId = 'definition1'
63
- entity.version = '1.0'
64
- entity.definitionPayload = JSON.stringify({ id: 'definition1', input_descriptors: [] })
65
-
66
- const savedEntity = await repository.save(entity)
67
- expect(savedEntity).toBeDefined()
68
-
69
- await repository.delete(savedEntity.id)
70
- const retrievedEntity = await repository.findOneBy({ id: savedEntity.id })
71
- expect(retrievedEntity).toBeNull()
72
- })
73
- })
1
+ import { DataSources } from '@sphereon/ssi-sdk.agent-config'
2
+ import { DataSource } from 'typeorm'
3
+ import { PresentationDefinitionItemEntity } from '../entities/presentationDefinition/PresentationDefinitionItemEntity'
4
+ import { DataStorePresentationDefinitionMigrations } from '../migrations'
5
+ import { DataStorePresentationDefinitionEntities } from '../index'
6
+
7
+ describe('PresentationDefinitionItemEntity tests', (): void => {
8
+ let dbConnection: DataSource
9
+
10
+ beforeEach(async (): Promise<void> => {
11
+ DataSources.singleInstance().defaultDbType = 'sqlite'
12
+ dbConnection = await new DataSource({
13
+ type: 'sqlite',
14
+ database: ':memory:',
15
+ logging: ['info'],
16
+ synchronize: true,
17
+ migrationsRun: false,
18
+ migrations: DataStorePresentationDefinitionMigrations,
19
+ entities: DataStorePresentationDefinitionEntities,
20
+ }).initialize()
21
+ })
22
+
23
+ afterEach(async (): Promise<void> => {
24
+ await dbConnection.destroy()
25
+ })
26
+
27
+ it('should create and retrieve PresentationDefinitionItemEntity', async (): Promise<void> => {
28
+ const repository = dbConnection.getRepository(PresentationDefinitionItemEntity)
29
+ const entity = new PresentationDefinitionItemEntity()
30
+ entity.definitionId = 'definition1'
31
+ entity.version = '1.0'
32
+ entity.definitionPayload = JSON.stringify({ id: 'definition1', input_descriptors: [] })
33
+
34
+ const savedEntity = await repository.save(entity)
35
+ expect(savedEntity).toBeDefined()
36
+ expect(savedEntity.id).toBeDefined()
37
+
38
+ const retrievedEntity = await repository.findOneBy({ id: savedEntity.id })
39
+ expect(retrievedEntity).toBeDefined()
40
+ expect(retrievedEntity!.definitionId).toEqual('definition1')
41
+ })
42
+
43
+ it('should update PresentationDefinitionItemEntity', async (): Promise<void> => {
44
+ const repository = dbConnection.getRepository(PresentationDefinitionItemEntity)
45
+ const entity = new PresentationDefinitionItemEntity()
46
+ entity.definitionId = 'definition1'
47
+ entity.version = '1.0'
48
+ entity.definitionPayload = JSON.stringify({ id: 'definition1', input_descriptors: [] })
49
+
50
+ const savedEntity = await repository.save(entity)
51
+ expect(savedEntity).toBeDefined()
52
+
53
+ savedEntity.version = '1.1'
54
+ const updatedEntity = await repository.save(savedEntity)
55
+ expect(updatedEntity).toBeDefined()
56
+ expect(updatedEntity.version).toEqual('1.1')
57
+ })
58
+
59
+ it('should delete PresentationDefinitionItemEntity', async (): Promise<void> => {
60
+ const repository = dbConnection.getRepository(PresentationDefinitionItemEntity)
61
+ const entity = new PresentationDefinitionItemEntity()
62
+ entity.definitionId = 'definition1'
63
+ entity.version = '1.0'
64
+ entity.definitionPayload = JSON.stringify({ id: 'definition1', input_descriptors: [] })
65
+
66
+ const savedEntity = await repository.save(entity)
67
+ expect(savedEntity).toBeDefined()
68
+
69
+ await repository.delete(savedEntity.id)
70
+ const retrievedEntity = await repository.findOneBy({ id: savedEntity.id })
71
+ expect(retrievedEntity).toBeNull()
72
+ })
73
+ })