@sphereon/ssi-sdk.data-store 0.34.1-next.3 → 0.34.1-next.322

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 (116) hide show
  1. package/dist/index.cjs +3377 -2924
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +357 -1203
  4. package/dist/index.d.ts +357 -1203
  5. package/dist/index.js +3300 -2847
  6. package/dist/index.js.map +1 -1
  7. package/package.json +10 -9
  8. package/src/__tests__/contact.entities.test.ts +4 -10
  9. package/src/__tests__/contact.store.test.ts +11 -6
  10. package/src/__tests__/digitalCredential.entities.test.ts +13 -6
  11. package/src/__tests__/digitalCredential.store.test.ts +6 -6
  12. package/src/__tests__/eventLogger.entities.test.ts +3 -3
  13. package/src/__tests__/eventLogger.store.test.ts +9 -4
  14. package/src/__tests__/issuanceBranding.entities.test.ts +2 -2
  15. package/src/__tests__/issuanceBranding.store.test.ts +3 -3
  16. package/src/__tests__/machineState.entities.test.ts +1 -1
  17. package/src/__tests__/machineState.store.test.ts +1 -1
  18. package/src/__tests__/pd-manager.entities.test.ts +27 -98
  19. package/src/__tests__/pd-manager.store.test.ts +151 -101
  20. package/src/__tests__/statusList.entities.test.ts +61 -4
  21. package/src/__tests__/statusList.store.test.ts +67 -4
  22. package/src/contact/ContactStore.ts +35 -35
  23. package/src/digitalCredential/DigitalCredentialStore.ts +6 -7
  24. package/src/entities/contact/BaseConfigEntity.ts +2 -2
  25. package/src/entities/contact/BaseContactEntity.ts +4 -5
  26. package/src/entities/contact/ConnectionEntity.ts +4 -4
  27. package/src/entities/contact/ContactMetadataItemEntity.ts +3 -4
  28. package/src/entities/contact/CorrelationIdentifierEntity.ts +3 -4
  29. package/src/entities/contact/DidAuthConfigEntity.ts +1 -2
  30. package/src/entities/contact/ElectronicAddressEntity.ts +15 -5
  31. package/src/entities/contact/IdentityEntity.ts +12 -11
  32. package/src/entities/contact/IdentityMetadataItemEntity.ts +3 -3
  33. package/src/entities/contact/NaturalPersonEntity.ts +5 -5
  34. package/src/entities/contact/OrganizationEntity.ts +1 -1
  35. package/src/entities/contact/PartyEntity.ts +7 -7
  36. package/src/entities/contact/PartyRelationshipEntity.ts +8 -8
  37. package/src/entities/contact/PartyTypeEntity.ts +4 -4
  38. package/src/entities/contact/PhysicalAddressEntity.ts +3 -3
  39. package/src/entities/digitalCredential/DigitalCredentialEntity.ts +4 -3
  40. package/src/entities/eventLogger/AuditEventEntity.ts +2 -2
  41. package/src/entities/issuanceBranding/BackgroundAttributesEntity.ts +2 -2
  42. package/src/entities/issuanceBranding/BaseLocaleBrandingEntity.ts +6 -7
  43. package/src/entities/issuanceBranding/CredentialBrandingEntity.ts +2 -2
  44. package/src/entities/issuanceBranding/CredentialClaimsEntity.ts +2 -2
  45. package/src/entities/issuanceBranding/CredentialLocaleBrandingEntity.ts +2 -2
  46. package/src/entities/issuanceBranding/ImageAttributesEntity.ts +2 -2
  47. package/src/entities/issuanceBranding/IssuerBrandingEntity.ts +2 -2
  48. package/src/entities/issuanceBranding/IssuerLocaleBrandingEntity.ts +3 -3
  49. package/src/entities/issuanceBranding/TextAttributesEntity.ts +1 -1
  50. package/src/entities/machineState/MachineStateInfoEntity.ts +1 -1
  51. package/src/entities/presentationDefinition/{PresentationDefinitionItemEntity.ts → DcqlQueryItemEntity.ts} +10 -14
  52. package/src/entities/statusList/BitstringStatusListEntryEntity.ts +60 -0
  53. package/src/entities/statusList/StatusList2021EntryEntity.ts +4 -3
  54. package/src/entities/statusList/StatusListEntities.ts +55 -7
  55. package/src/eventLogger/EventLoggerStore.ts +2 -2
  56. package/src/index.ts +31 -26
  57. package/src/issuanceBranding/IssuanceBrandingStore.ts +25 -25
  58. package/src/machineState/MachineStateStore.ts +7 -7
  59. package/src/migrations/generic/1-CreateContacts.ts +1 -1
  60. package/src/migrations/generic/10-CreatePresentationDefinitions.ts +1 -1
  61. package/src/migrations/generic/11-FixCredentialClaimsReferenceUuid.ts +2 -2
  62. package/src/migrations/generic/12-CreateBitstringStatusList.ts +82 -0
  63. package/src/migrations/generic/13-CreateDcqlQueryItem.ts +67 -0
  64. package/src/migrations/generic/2-CreateIssuanceBranding.ts +1 -1
  65. package/src/migrations/generic/3-CreateContacts.ts +2 -2
  66. package/src/migrations/generic/4-CreateStatusList.ts +1 -1
  67. package/src/migrations/generic/5-CreateAuditEvents.ts +2 -2
  68. package/src/migrations/generic/6-CreateDigitalCredential.ts +1 -1
  69. package/src/migrations/generic/7-CreateMachineStateStore.ts +1 -1
  70. package/src/migrations/generic/8-CreateContacts.ts +1 -1
  71. package/src/migrations/generic/9-CreateContacts.ts +1 -1
  72. package/src/migrations/generic/index.ts +10 -4
  73. package/src/migrations/postgres/1659463079428-CreateContacts.ts +1 -1
  74. package/src/migrations/postgres/1685628974232-CreateIssuanceBranding.ts +1 -1
  75. package/src/migrations/postgres/1690925872592-CreateContacts.ts +1 -1
  76. package/src/migrations/postgres/1716475165345-CreatePresentationDefinitions.ts +1 -1
  77. package/src/migrations/postgres/1726588800000-CreateDcqlQueryItem.ts +25 -0
  78. package/src/migrations/postgres/1737110469001-UpdateStatusList.ts +1 -1
  79. package/src/migrations/postgres/1741895823000-CreateBitstringStatusList.ts +67 -0
  80. package/src/migrations/sqlite/1716475165344-CreatePresentationDefinitions.ts +1 -1
  81. package/src/migrations/sqlite/1726617600000-CreateDcqlQueryItem.ts +24 -0
  82. package/src/migrations/sqlite/1741895823001-CreateBitstringStatusList.ts +145 -0
  83. package/src/presentationDefinition/PDStore.ts +45 -45
  84. package/src/statusList/IStatusListStore.ts +14 -11
  85. package/src/statusList/StatusListStore.ts +74 -36
  86. package/src/types/index.ts +0 -12
  87. package/src/types/statusList/IAbstractStatusListStore.ts +55 -5
  88. package/src/types/statusList/statusList.ts +50 -2
  89. package/src/utils/ValidatorUtils.ts +1 -1
  90. package/src/utils/contact/MappingUtils.ts +10 -10
  91. package/src/utils/digitalCredential/MappingUtils.ts +3 -21
  92. package/src/utils/eventLogger/MappingUtils.ts +2 -2
  93. package/src/utils/issuanceBranding/MappingUtils.ts +13 -13
  94. package/src/utils/presentationDefinition/MappingUtils.ts +31 -22
  95. package/src/utils/statusList/MappingUtils.ts +71 -30
  96. package/src/contact/AbstractContactStore.ts +0 -71
  97. package/src/digitalCredential/AbstractDigitalCredentialStore.ts +0 -21
  98. package/src/eventLogger/AbstractEventLoggerStore.ts +0 -9
  99. package/src/issuanceBranding/AbstractIssuanceBrandingStore.ts +0 -41
  100. package/src/machineState/IAbstractMachineStateStore.ts +0 -65
  101. package/src/presentationDefinition/AbstractPDStore.ts +0 -20
  102. package/src/types/contact/IAbstractContactStore.ts +0 -161
  103. package/src/types/contact/contact.ts +0 -295
  104. package/src/types/contact/index.ts +0 -2
  105. package/src/types/digitalCredential/IAbstractDigitalCredentialStore.ts +0 -43
  106. package/src/types/digitalCredential/enums.ts +0 -70
  107. package/src/types/digitalCredential/index.ts +0 -3
  108. package/src/types/digitalCredential/types.ts +0 -39
  109. package/src/types/eventLogger/IAbstractEventLoggerStore.ts +0 -22
  110. package/src/types/eventLogger/eventLogger.ts +0 -4
  111. package/src/types/issuanceBranding/IAbstractIssuanceBrandingStore.ts +0 -85
  112. package/src/types/issuanceBranding/issuanceBranding.ts +0 -138
  113. package/src/types/machineState/IAbstractMachineStateStore.ts +0 -68
  114. package/src/types/presentationDefinition/IAbstractPDStore.ts +0 -25
  115. package/src/types/presentationDefinition/presentationDefinition.ts +0 -19
  116. package/src/types/validation/validation.ts +0 -3
@@ -1,8 +1,46 @@
1
1
  import { DataSources } from '@sphereon/ssi-sdk.agent-config'
2
+ import { DcqlQuery } from 'dcql'
2
3
  import { DataSource } from 'typeorm'
3
- import { DataStorePresentationDefinitionEntities, DataStorePresentationDefinitionMigrations, PDStore } from '../index'
4
- import { GetDefinitionsArgs, NonPersistedPresentationDefinitionItem, PresentationDefinitionItem } from '../types'
5
4
  import { afterEach, beforeEach, describe, expect, it } from 'vitest'
5
+ import {
6
+ DataStorePresentationDefinitionEntities,
7
+ DataStorePresentationDefinitionMigrations,
8
+ type DeleteDefinitionsArgs,
9
+ ImportDcqlQueryItem,
10
+ PDStore,
11
+ } from '../index'
12
+ import { DcqlQueryItem, GetDefinitionsArgs, NonPersistedDcqlQueryItem } from '@sphereon/ssi-sdk.data-store-types'
13
+
14
+ export const SAMPLE_DCQL_QUERY_IMPORT: ImportDcqlQueryItem = {
15
+ queryId: 'ajax-club',
16
+ query: {
17
+ credentials: [
18
+ {
19
+ id: 'clubcard-v1',
20
+ format: 'dc+sd-jwt',
21
+ require_cryptographic_holder_binding: true,
22
+ multiple: false,
23
+ meta: {
24
+ vct_values: ['clubcard-v1'],
25
+ },
26
+ claims: [
27
+ {
28
+ path: ['personData', 'name'],
29
+ },
30
+ {
31
+ path: ['personData', 'birthDate'],
32
+ },
33
+ {
34
+ path: ['membershipData', 'membershipId'],
35
+ },
36
+ {
37
+ path: ['membershipData', 'season'],
38
+ },
39
+ ],
40
+ },
41
+ ],
42
+ },
43
+ }
6
44
 
7
45
  describe('PDStore tests', (): void => {
8
46
  let dbConnection: DataSource
@@ -28,136 +66,148 @@ describe('PDStore tests', (): void => {
28
66
  await dbConnection.destroy()
29
67
  })
30
68
 
31
- it('should check if definition exists', async (): Promise<void> => {
32
- const definition: NonPersistedPresentationDefinitionItem = {
33
- definitionId: 'definition1',
34
- version: '1.0',
35
- definitionPayload: { id: 'definition1', input_descriptors: [] },
36
- }
37
- const savedDefinition: PresentationDefinitionItem = await pdStore.addDefinition(definition)
38
- expect(savedDefinition).toBeDefined()
39
-
40
- const exists: boolean = await pdStore.hasDefinition({ itemId: savedDefinition.id })
41
-
42
- expect(exists).toBeTruthy()
43
- })
44
-
45
- it('should check if definitions exist by filter', async (): Promise<void> => {
46
- const definition: NonPersistedPresentationDefinitionItem = {
47
- definitionId: 'definition1',
48
- version: '1.0',
49
- definitionPayload: { id: 'definition1', input_descriptors: [] },
50
- }
51
- const savedDefinition: PresentationDefinitionItem = await pdStore.addDefinition(definition)
52
- expect(savedDefinition).toBeDefined()
53
-
54
- const exists: boolean = await pdStore.hasDefinitions({ filter: [{ definitionId: 'definition1' }] })
55
-
56
- expect(exists).toBeTruthy()
57
- })
58
-
59
- it('should get definition by id', async (): Promise<void> => {
60
- const definition: NonPersistedPresentationDefinitionItem = {
61
- definitionId: 'definition1',
62
- version: '1.0',
63
- definitionPayload: { id: 'definition1', input_descriptors: [] },
64
- }
65
-
66
- const savedDefinition: PresentationDefinitionItem = await pdStore.addDefinition(definition)
67
- expect(savedDefinition).toBeDefined()
68
-
69
- const result: PresentationDefinitionItem = await pdStore.getDefinition({ itemId: savedDefinition.id })
70
-
71
- expect(result).toBeDefined()
72
- })
73
-
74
- it('should throw error when getting definition with unknown id', async (): Promise<void> => {
69
+ it('should throw error when getting query with unknown id', async (): Promise<void> => {
75
70
  const itemId = 'unknownDefinitionId'
76
71
 
77
72
  await expect(pdStore.getDefinition({ itemId })).rejects.toThrow(`No presentation definition item found for id: ${itemId}`)
78
73
  })
79
74
 
80
- it('should get all definitions', async (): Promise<void> => {
81
- const definition1: NonPersistedPresentationDefinitionItem = {
82
- definitionId: 'definition1',
75
+ it('should get all queries', async (): Promise<void> => {
76
+ const definition1: NonPersistedDcqlQueryItem = {
77
+ queryId: 'definition1',
83
78
  version: '1.0',
84
- definitionPayload: { id: 'definition1', input_descriptors: [] },
79
+ query: {
80
+ credentials: [
81
+ {
82
+ id: 'id-card-v1',
83
+ format: 'dc+sd-jwt',
84
+ require_cryptographic_holder_binding: true,
85
+ multiple: false,
86
+ claims: [
87
+ {
88
+ path: ['name'],
89
+ },
90
+ ],
91
+ },
92
+ ],
93
+ },
85
94
  }
86
- const savedDefinition1: PresentationDefinitionItem = await pdStore.addDefinition(definition1)
95
+ const savedDefinition1: DcqlQueryItem = await pdStore.addDefinition(definition1)
87
96
  expect(savedDefinition1).toBeDefined()
88
97
 
89
- const definition2: NonPersistedPresentationDefinitionItem = {
90
- definitionId: 'definition2',
98
+ const definition2: NonPersistedDcqlQueryItem = {
99
+ queryId: 'definition2',
91
100
  version: '1.0',
92
- definitionPayload: { id: 'definition2', input_descriptors: [] },
101
+ query: {
102
+ credentials: [
103
+ {
104
+ id: 'driver-license-v1',
105
+ format: 'dc+sd-jwt',
106
+ require_cryptographic_holder_binding: true,
107
+ multiple: false,
108
+ claims: [
109
+ {
110
+ path: ['dateOfBirth'],
111
+ },
112
+ ],
113
+ },
114
+ ],
115
+ },
93
116
  }
94
- const savedDefinition2: PresentationDefinitionItem = await pdStore.addDefinition(definition2)
117
+ const savedDefinition2: DcqlQueryItem = await pdStore.addDefinition(definition2)
95
118
  expect(savedDefinition2).toBeDefined()
96
119
 
97
- const result: Array<PresentationDefinitionItem> = await pdStore.getDefinitions({})
120
+ const result: Array<DcqlQueryItem> = await pdStore.getDefinitions({})
98
121
 
99
122
  expect(result).toBeDefined()
100
123
  expect(result.length).toEqual(2)
101
124
  })
102
125
 
103
- it('should get definitions by filter', async (): Promise<void> => {
104
- const definition: NonPersistedPresentationDefinitionItem = {
105
- definitionId: 'definition1',
126
+ it('should update dcql query', async (): Promise<void> => {
127
+ const definition: NonPersistedDcqlQueryItem = {
128
+ queryId: SAMPLE_DCQL_QUERY_IMPORT.queryId,
106
129
  version: '1.0',
107
- definitionPayload: { id: 'definition1', input_descriptors: [] },
130
+ query: SAMPLE_DCQL_QUERY_IMPORT.query,
108
131
  }
109
- const savedDefinition: PresentationDefinitionItem = await pdStore.addDefinition(definition)
132
+ const savedDefinition: DcqlQueryItem = await pdStore.addDefinition(definition)
110
133
  expect(savedDefinition).toBeDefined()
111
134
 
112
- const args: GetDefinitionsArgs = {
113
- filter: [{ definitionId: 'definition1' }],
135
+ const updatedDcqlQuery = DcqlQuery.parse({
136
+ credentials: [
137
+ {
138
+ id: 'updated-clubcard',
139
+ format: 'dc+sd-jwt',
140
+ claims: [
141
+ {
142
+ path: ['name'],
143
+ },
144
+ ],
145
+ },
146
+ ],
147
+ })
148
+
149
+ const updatedDefinition: DcqlQueryItem = {
150
+ ...savedDefinition,
151
+ version: '1.1',
152
+ query: updatedDcqlQuery,
114
153
  }
115
- const result: Array<PresentationDefinitionItem> = await pdStore.getDefinitions(args)
116
154
 
117
- expect(result.length).toEqual(1)
155
+ await pdStore.updateDefinition(updatedDefinition)
156
+ const result: DcqlQueryItem = await pdStore.getDefinition({ itemId: savedDefinition.id })
157
+
158
+ expect(result).toBeDefined()
159
+ expect(result.version).toEqual('1.1')
160
+ expect(result.query?.credentials[0].id).toEqual('updated-clubcard')
161
+ expect(result.query?.credentials[0].format).toEqual('dc+sd-jwt')
118
162
  })
119
163
 
120
- it('should add definition', async (): Promise<void> => {
121
- const definition: NonPersistedPresentationDefinitionItem = {
122
- definitionId: 'definition1',
164
+ it('should get dcql queries by id', async (): Promise<void> => {
165
+ const definition: NonPersistedDcqlQueryItem = {
166
+ queryId: SAMPLE_DCQL_QUERY_IMPORT.queryId,
123
167
  version: '1.0',
124
- definitionPayload: { id: 'definition1', input_descriptors: [] },
168
+ query: SAMPLE_DCQL_QUERY_IMPORT.query,
125
169
  }
126
170
 
127
- const result: PresentationDefinitionItem = await pdStore.addDefinition(definition)
171
+ const savedDefinition: DcqlQueryItem = await pdStore.addDefinition(definition)
172
+ expect(savedDefinition).toBeDefined()
173
+
174
+ const result: DcqlQueryItem = await pdStore.getDefinition({ itemId: savedDefinition.id })
128
175
 
129
176
  expect(result).toBeDefined()
130
- expect(result.definitionId).toEqual(definition.definitionId)
177
+ expect(result.query).toBeDefined()
178
+ expect(result.query.credentials[0].format).toBe('dc+sd-jwt')
179
+ if (result.query.credentials[0].format === 'dc+sd-jwt') {
180
+ expect(result.query.credentials[0].meta?.vct_values).toContain('clubcard-v1')
181
+ }
182
+ expect(result.query.credentials[0].claims).toHaveLength(4)
131
183
  })
132
184
 
133
- it('should update definition', async (): Promise<void> => {
134
- const definition: NonPersistedPresentationDefinitionItem = {
135
- definitionId: 'definition1',
185
+ it('should get dcql queries by filter', async (): Promise<void> => {
186
+ const definition: NonPersistedDcqlQueryItem = {
187
+ queryId: SAMPLE_DCQL_QUERY_IMPORT.queryId,
136
188
  version: '1.0',
137
- definitionPayload: { id: 'definition1', input_descriptors: [] },
189
+ query: SAMPLE_DCQL_QUERY_IMPORT.query,
138
190
  }
139
- const savedDefinition: PresentationDefinitionItem = await pdStore.addDefinition(definition)
191
+ const savedDefinition: DcqlQueryItem = await pdStore.addDefinition(definition)
140
192
  expect(savedDefinition).toBeDefined()
141
193
 
142
- const updatedDefinition: PresentationDefinitionItem = {
143
- ...savedDefinition,
144
- version: '1.1',
194
+ const args: GetDefinitionsArgs = {
195
+ filter: [{ queryId: 'ajax-club' }],
145
196
  }
197
+ const result: Array<DcqlQueryItem> = await pdStore.getDefinitions(args)
146
198
 
147
- await pdStore.updateDefinition(updatedDefinition)
148
- const result: PresentationDefinitionItem = await pdStore.getDefinition({ itemId: savedDefinition.id })
149
-
150
- expect(result).toBeDefined()
151
- expect(result.version).toEqual('1.1')
199
+ expect(result.length).toEqual(1)
200
+ expect(result[0].query).toBeDefined()
201
+ expect(result[0].query.credentials[0].id).toEqual('clubcard-v1')
152
202
  })
153
203
 
154
- it('should delete definition', async (): Promise<void> => {
155
- const definition: NonPersistedPresentationDefinitionItem = {
156
- definitionId: 'definition1',
204
+ it('should delete dcql query', async (): Promise<void> => {
205
+ const definition: NonPersistedDcqlQueryItem = {
206
+ queryId: 'definition1',
157
207
  version: '1.0',
158
- definitionPayload: { id: 'definition1', input_descriptors: [] },
208
+ query: SAMPLE_DCQL_QUERY_IMPORT.query,
159
209
  }
160
- const savedDefinition: PresentationDefinitionItem = await pdStore.addDefinition(definition)
210
+ const savedDefinition: DcqlQueryItem = await pdStore.addDefinition(definition)
161
211
  expect(savedDefinition).toBeDefined()
162
212
 
163
213
  await pdStore.deleteDefinition({ itemId: savedDefinition.id })
@@ -167,28 +217,28 @@ describe('PDStore tests', (): void => {
167
217
  )
168
218
  })
169
219
 
170
- it('should delete definitions by filter', async (): Promise<void> => {
171
- const definition1: NonPersistedPresentationDefinitionItem = {
172
- definitionId: 'definition1',
220
+ it('should delete dcql queries by filter', async (): Promise<void> => {
221
+ const definition1: NonPersistedDcqlQueryItem = {
222
+ queryId: 'definition1',
173
223
  version: '1.0',
174
- definitionPayload: { id: 'definition1', input_descriptors: [] },
224
+ query: SAMPLE_DCQL_QUERY_IMPORT.query,
175
225
  }
176
- const savedDefinition1: PresentationDefinitionItem = await pdStore.addDefinition(definition1)
226
+ const savedDefinition1: DcqlQueryItem = await pdStore.addDefinition(definition1)
177
227
  expect(savedDefinition1).toBeDefined()
178
228
 
179
- const definition2: NonPersistedPresentationDefinitionItem = {
180
- definitionId: 'definition2',
229
+ const definition2: NonPersistedDcqlQueryItem = {
230
+ queryId: 'definition2',
181
231
  version: '1.0',
182
- definitionPayload: { id: 'definition2', input_descriptors: [] },
232
+ query: SAMPLE_DCQL_QUERY_IMPORT.query,
183
233
  }
184
- const savedDefinition2: PresentationDefinitionItem = await pdStore.addDefinition(definition2)
234
+ const savedDefinition2: DcqlQueryItem = await pdStore.addDefinition(definition2)
185
235
  expect(savedDefinition2).toBeDefined()
186
236
 
187
- const filter = { filter: [{ definitionId: 'definition1' }] }
237
+ const filter = { filter: [{ queryId: 'definition1' }] } satisfies DeleteDefinitionsArgs
188
238
  await pdStore.deleteDefinitions(filter)
189
239
 
190
- const remainingDefinitions: Array<PresentationDefinitionItem> = await pdStore.getDefinitions({})
240
+ const remainingDefinitions: Array<DcqlQueryItem> = await pdStore.getDefinitions({})
191
241
  expect(remainingDefinitions.length).toEqual(1)
192
- expect(remainingDefinitions[0].definitionId).toEqual('definition2')
242
+ expect(remainingDefinitions[0].queryId).toEqual('definition2')
193
243
  })
194
244
  })
@@ -1,10 +1,10 @@
1
- import { DataSource } from 'typeorm'
2
1
  import { DataSources } from '@sphereon/ssi-sdk.agent-config'
3
- import { DataStoreStatusListEntities, StatusListEntryEntity } from '../index'
4
- import { DataStoreStatusListMigrations } from '../migrations'
5
- import { OAuthStatusListEntity, StatusList2021Entity } from '../entities/statusList/StatusListEntities'
6
2
  import { IIssuer, StatusListCredentialIdMode, StatusListDriverType } from '@sphereon/ssi-types'
3
+ import { DataSource } from 'typeorm'
7
4
  import { afterEach, beforeEach, describe, expect, it } from 'vitest'
5
+ import { OAuthStatusListEntity, StatusList2021Entity } from '../entities/statusList/StatusListEntities'
6
+ import { BitstringStatusListEntity, BitstringStatusListEntryEntity, DataStoreStatusListEntities, StatusListEntryEntity } from '../index'
7
+ import { DataStoreStatusListMigrations } from '../migrations'
8
8
 
9
9
  describe('Status list entities tests', () => {
10
10
  let dbConnection: DataSource
@@ -18,6 +18,8 @@ describe('Status list entities tests', () => {
18
18
  migrations: DataStoreStatusListMigrations,
19
19
  synchronize: false,
20
20
  entities: [...DataStoreStatusListEntities],
21
+ logger: 'advanced-console',
22
+ logging: ['query', 'error', 'schema', 'warn', 'info', 'log', 'migration'],
21
23
  }).initialize()
22
24
  await dbConnection.runMigrations()
23
25
  expect(await dbConnection.showMigrations()).toBeFalsy()
@@ -214,4 +216,59 @@ describe('Status list entities tests', () => {
214
216
  })
215
217
  expect(foundEntry).toBeNull()
216
218
  })
219
+
220
+ it('should save bitstring status list to database', async () => {
221
+ const statusList = new BitstringStatusListEntity()
222
+ statusList.id = 'bitstring-list-1'
223
+ statusList.correlationId = 'correlation-bitstring-1'
224
+ statusList.driverType = StatusListDriverType.AGENT_TYPEORM
225
+ statusList.length = 131072
226
+ statusList.credentialIdMode = StatusListCredentialIdMode.ISSUANCE
227
+ statusList.proofFormat = 'lds'
228
+ statusList.statusPurpose = 'revocation'
229
+ statusList.bitsPerStatus = 1
230
+ statusList.ttl = 3600000
231
+ statusList.validFrom = new Date('2024-01-01T00:00:00Z')
232
+ statusList.validUntil = new Date('2025-01-01T00:00:00Z')
233
+ statusList.issuer = 'did:example:789'
234
+
235
+ const fromDb = await dbConnection.getRepository(BitstringStatusListEntity).save(statusList)
236
+ expect(fromDb).toBeDefined()
237
+ expect(fromDb.id).toEqual(statusList.id)
238
+ expect(fromDb.statusPurpose).toEqual(statusList.statusPurpose)
239
+ expect(fromDb.bitsPerStatus).toEqual(statusList.bitsPerStatus)
240
+ expect(fromDb.ttl).toEqual(statusList.ttl)
241
+ expect(fromDb.validFrom).toEqual(statusList.validFrom)
242
+ expect(fromDb.validUntil).toEqual(statusList.validUntil)
243
+ })
244
+
245
+ it('should save bitstring status list entry to database', async () => {
246
+ const statusList = new BitstringStatusListEntity()
247
+ statusList.id = 'bitstring-list-1'
248
+ statusList.correlationId = 'correlation-bitstring-1'
249
+ statusList.driverType = StatusListDriverType.AGENT_TYPEORM
250
+ statusList.length = 131072
251
+ statusList.credentialIdMode = StatusListCredentialIdMode.ISSUANCE
252
+ statusList.proofFormat = 'lds'
253
+ statusList.statusPurpose = 'revocation'
254
+ statusList.issuer = 'did:example:789'
255
+
256
+ await dbConnection.getRepository(BitstringStatusListEntity).save(statusList)
257
+
258
+ const entry = new BitstringStatusListEntryEntity()
259
+ entry.statusList = statusList
260
+ entry.statusListIndex = 42
261
+ entry.credentialId = 'bitstring-credential-1'
262
+ entry.credentialHash = 'bitstring-hash-1'
263
+ entry.statusPurpose = 'revocation'
264
+ entry.bitsPerStatus = 1
265
+ entry.statusReference = 'https://example.org/status-ref'
266
+
267
+ const fromDb = await dbConnection.getRepository(BitstringStatusListEntryEntity).save(entry)
268
+ expect(fromDb).toBeDefined()
269
+ expect(fromDb.statusListIndex).toEqual(entry.statusListIndex)
270
+ expect(fromDb.statusPurpose).toEqual(entry.statusPurpose)
271
+ expect(fromDb.bitsPerStatus).toEqual(entry.bitsPerStatus)
272
+ expect(fromDb.statusReference).toEqual(entry.statusReference)
273
+ })
217
274
  })
@@ -1,11 +1,11 @@
1
- import { DataSource } from 'typeorm'
2
1
  import { DataSources } from '@sphereon/ssi-sdk.agent-config'
3
- import { DataStoreStatusListEntities } from '../index'
2
+ import { StatusListCredentialIdMode, StatusListDriverType, StatusListType } from '@sphereon/ssi-types'
3
+ import { DataSource } from 'typeorm'
4
+ import { afterEach, beforeEach, describe, expect, it } from 'vitest'
5
+ import { DataStoreStatusListEntities, IBitstringStatusListEntity } from '../index'
4
6
  import { DataStoreStatusListMigrations } from '../migrations'
5
7
  import { StatusListStore } from '../statusList/StatusListStore'
6
8
  import { IOAuthStatusListEntity, IStatusList2021Entity, IStatusListEntryEntity } from '../types'
7
- import { StatusListCredentialIdMode, StatusListDriverType, StatusListType } from '@sphereon/ssi-types'
8
- import { afterEach, beforeEach, describe, expect, it } from 'vitest'
9
9
 
10
10
  describe('Status list store tests', () => {
11
11
  let dbConnection: DataSource
@@ -230,4 +230,67 @@ describe('Status list store tests', () => {
230
230
 
231
231
  await expect(statusListStore.getStatusList({ id: statusList.id })).rejects.toThrow(`No status list found for id ${statusList.id}`)
232
232
  })
233
+
234
+ it('should store bitstring status list', async () => {
235
+ const statusList: IBitstringStatusListEntity = {
236
+ id: 'bitstring-list-1',
237
+ correlationId: 'correlation-bitstring-1',
238
+ driverType: StatusListDriverType.AGENT_TYPEORM,
239
+ length: 131072,
240
+ credentialIdMode: StatusListCredentialIdMode.ISSUANCE,
241
+ type: StatusListType.BitstringStatusList,
242
+ proofFormat: 'lds',
243
+ statusPurpose: 'revocation',
244
+ bitsPerStatus: 1,
245
+ ttl: 3600000,
246
+ validFrom: new Date('2024-01-01T00:00:00Z'),
247
+ validUntil: new Date('2025-01-01T00:00:00Z'),
248
+ issuer: 'did:example:789',
249
+ }
250
+
251
+ const result = await statusListStore.addStatusList(statusList)
252
+ expect(result).toBeDefined()
253
+ expect(result.id).toEqual(statusList.id)
254
+ expect((result as IBitstringStatusListEntity).statusPurpose).toEqual(statusList.statusPurpose)
255
+ expect((result as IBitstringStatusListEntity).ttl).toEqual(statusList.ttl)
256
+ })
257
+
258
+ it('should store and retrieve all three types of status lists', async () => {
259
+ const statusList2021: IStatusList2021Entity = {
260
+ id: 'test-list-1',
261
+ correlationId: 'correlation-1',
262
+ driverType: StatusListDriverType.AGENT_TYPEORM,
263
+ length: 100000,
264
+ credentialIdMode: StatusListCredentialIdMode.ISSUANCE,
265
+ type: StatusListType.StatusList2021,
266
+ proofFormat: 'jwt',
267
+ statusPurpose: 'revocation',
268
+ indexingDirection: 'rightToLeft',
269
+ issuer: 'did:example:123',
270
+ }
271
+
272
+ const bitstringStatusList: IBitstringStatusListEntity = {
273
+ id: 'bitstring-list-1',
274
+ correlationId: 'correlation-bitstring-1',
275
+ driverType: StatusListDriverType.AGENT_TYPEORM,
276
+ length: 131072,
277
+ credentialIdMode: StatusListCredentialIdMode.ISSUANCE,
278
+ type: StatusListType.BitstringStatusList,
279
+ proofFormat: 'lds',
280
+ bitsPerStatus: 1,
281
+ statusPurpose: 'suspension',
282
+ ttl: 3600000,
283
+ issuer: 'did:example:789',
284
+ }
285
+
286
+ await statusListStore.addStatusList(statusList2021)
287
+ await statusListStore.addStatusList(bitstringStatusList)
288
+
289
+ const found2021 = await statusListStore.getStatusList({ id: statusList2021.id })
290
+ const foundBitstring = await statusListStore.getStatusList({ id: bitstringStatusList.id })
291
+
292
+ expect(found2021.type).toEqual(StatusListType.StatusList2021)
293
+ expect(foundBitstring.type).toEqual(StatusListType.BitstringStatusList)
294
+ expect((foundBitstring as IBitstringStatusListEntity).statusPurpose).toEqual('suspension')
295
+ })
233
296
  })
@@ -1,37 +1,5 @@
1
- import { OrPromise } from '@sphereon/ssi-types'
2
- import { BaseEntity, DataSource, type FindOptionsWhere, In, type Repository } from 'typeorm'
3
- import Debug from 'debug'
4
- import { AbstractContactStore } from './AbstractContactStore'
5
- import { PartyEntity } from '../entities/contact/PartyEntity'
6
- import { IdentityEntity } from '../entities/contact/IdentityEntity'
7
- import { IdentityMetadataItemEntity } from '../entities/contact/IdentityMetadataItemEntity'
8
- import { CorrelationIdentifierEntity } from '../entities/contact/CorrelationIdentifierEntity'
9
- import { ConnectionEntity } from '../entities/contact/ConnectionEntity'
10
- import { BaseConfigEntity } from '../entities/contact/BaseConfigEntity'
11
- import { PartyRelationshipEntity } from '../entities/contact/PartyRelationshipEntity'
12
- import { PartyTypeEntity } from '../entities/contact/PartyTypeEntity'
13
- import { BaseContactEntity } from '../entities/contact/BaseContactEntity'
14
- import { ElectronicAddressEntity } from '../entities/contact/ElectronicAddressEntity'
15
- import { PhysicalAddressEntity } from '../entities/contact/PhysicalAddressEntity'
16
- import {
17
- electronicAddressEntityFrom,
18
- electronicAddressFrom,
19
- identityEntityFrom,
20
- identityFrom,
21
- isDidAuthConfig,
22
- isNaturalPerson,
23
- isOpenIdConfig,
24
- isOrganization,
25
- partyEntityFrom,
26
- partyFrom,
27
- partyRelationshipEntityFrom,
28
- partyRelationshipFrom,
29
- partyTypeEntityFrom,
30
- partyTypeFrom,
31
- physicalAddressEntityFrom,
32
- physicalAddressFrom,
33
- } from '../utils/contact/MappingUtils'
34
1
  import {
2
+ AbstractContactStore,
35
3
  AddElectronicAddressArgs,
36
4
  AddIdentityArgs,
37
5
  AddPartyArgs,
@@ -53,8 +21,8 @@ import {
53
21
  GetPhysicalAddressesArgs,
54
22
  GetRelationshipArgs,
55
23
  GetRelationshipsArgs,
56
- IMetadataEntity,
57
24
  Identity,
25
+ IMetadataEntity,
58
26
  MetadataItem,
59
27
  MetadataTypes,
60
28
  NonPersistedConnectionConfig,
@@ -76,7 +44,39 @@ import {
76
44
  UpdatePartyTypeArgs,
77
45
  UpdatePhysicalAddressArgs,
78
46
  UpdateRelationshipArgs,
79
- } from '../types'
47
+ } from '@sphereon/ssi-sdk.data-store-types'
48
+ import { OrPromise } from '@sphereon/ssi-types'
49
+ import Debug from 'debug'
50
+ import { BaseEntity, DataSource, type FindOptionsWhere, In, type Repository } from 'typeorm'
51
+ import { BaseConfigEntity } from '../entities/contact/BaseConfigEntity'
52
+ import { BaseContactEntity } from '../entities/contact/BaseContactEntity'
53
+ import { ConnectionEntity } from '../entities/contact/ConnectionEntity'
54
+ import { CorrelationIdentifierEntity } from '../entities/contact/CorrelationIdentifierEntity'
55
+ import { ElectronicAddressEntity } from '../entities/contact/ElectronicAddressEntity'
56
+ import { IdentityEntity } from '../entities/contact/IdentityEntity'
57
+ import { IdentityMetadataItemEntity } from '../entities/contact/IdentityMetadataItemEntity'
58
+ import { PartyEntity } from '../entities/contact/PartyEntity'
59
+ import { PartyRelationshipEntity } from '../entities/contact/PartyRelationshipEntity'
60
+ import { PartyTypeEntity } from '../entities/contact/PartyTypeEntity'
61
+ import { PhysicalAddressEntity } from '../entities/contact/PhysicalAddressEntity'
62
+ import {
63
+ electronicAddressEntityFrom,
64
+ electronicAddressFrom,
65
+ identityEntityFrom,
66
+ identityFrom,
67
+ isDidAuthConfig,
68
+ isNaturalPerson,
69
+ isOpenIdConfig,
70
+ isOrganization,
71
+ partyEntityFrom,
72
+ partyFrom,
73
+ partyRelationshipEntityFrom,
74
+ partyRelationshipFrom,
75
+ partyTypeEntityFrom,
76
+ partyTypeFrom,
77
+ physicalAddressEntityFrom,
78
+ physicalAddressFrom,
79
+ } from '../utils/contact/MappingUtils'
80
80
 
81
81
  const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:contact-store')
82
82
 
@@ -1,7 +1,6 @@
1
- import { AbstractDigitalCredentialStore } from './AbstractDigitalCredentialStore'
2
1
  import {
2
+ AbstractDigitalCredentialStore,
3
3
  AddCredentialArgs,
4
- CredentialRole,
5
4
  CredentialStateType,
6
5
  DigitalCredential,
7
6
  GetCredentialArgs,
@@ -10,13 +9,13 @@ import {
10
9
  NonPersistedDigitalCredential,
11
10
  RemoveCredentialArgs,
12
11
  UpdateCredentialStateArgs,
13
- } from '../types'
14
- import { OrPromise } from '@sphereon/ssi-types'
15
- import { DataSource, type FindOptionsOrder, type FindOptionsWhere, Repository } from 'typeorm'
12
+ } from '@sphereon/ssi-sdk.data-store-types'
13
+ import { CredentialRole, OrPromise } from '@sphereon/ssi-types'
16
14
  import Debug from 'debug'
17
- import { DigitalCredentialEntity } from '../entities/digitalCredential/DigitalCredentialEntity'
15
+ import { DataSource, type FindOptionsOrder, type FindOptionsWhere, Repository } from 'typeorm'
18
16
 
19
17
  import { digitalCredentialFrom, digitalCredentialsFrom, nonPersistedDigitalCredentialEntityFromAddArgs } from '../../src'
18
+ import { DigitalCredentialEntity } from '../entities/digitalCredential/DigitalCredentialEntity'
20
19
  import { parseAndValidateOrderOptions } from '../utils/SortingUtils'
21
20
 
22
21
  const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:credential-store')
@@ -78,7 +77,7 @@ export class DigitalCredentialStore extends AbstractDigitalCredentialStore {
78
77
  return false
79
78
  }
80
79
 
81
- let query: FindOptionsWhere<DigitalCredentialEntity> = {}
80
+ const query: FindOptionsWhere<DigitalCredentialEntity> = {}
82
81
 
83
82
  if ('id' in args) {
84
83
  query.id = args.id
@@ -1,5 +1,5 @@
1
- import typeorm from 'typeorm'
2
- const { BaseEntity, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn, TableInheritance } = typeorm
1
+ import { BaseEntity, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn, TableInheritance } from 'typeorm'
2
+
3
3
  import { ConnectionEntity } from './ConnectionEntity'
4
4
 
5
5
  @Entity('BaseConfig')
@@ -1,5 +1,5 @@
1
- import typeorm from 'typeorm'
2
- const {
1
+ import { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'
2
+ import {
3
3
  BaseEntity,
4
4
  BeforeInsert,
5
5
  BeforeUpdate,
@@ -11,10 +11,9 @@ const {
11
11
  PrimaryGeneratedColumn,
12
12
  TableInheritance,
13
13
  UpdateDateColumn,
14
- } = typeorm
15
- import { typeOrmDateTime } from '@sphereon/ssi-sdk.agent-config'
16
- import { PartyEntity } from './PartyEntity'
14
+ } from 'typeorm'
17
15
  import { ContactMetadataItemEntity } from './ContactMetadataItemEntity'
16
+ import { PartyEntity } from './PartyEntity'
18
17
 
19
18
  @Entity('BaseContact')
20
19
  @TableInheritance({ column: { type: 'varchar', name: 'type' } })
@@ -1,10 +1,10 @@
1
- import typeorm from 'typeorm'
2
- const { Entity, Column, PrimaryGeneratedColumn, OneToOne, JoinColumn, BaseEntity } = typeorm
1
+ import { ConnectionType } from '@sphereon/ssi-sdk.data-store-types'
2
+ import { BaseEntity, Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm'
3
+
3
4
  import { BaseConfigEntity } from './BaseConfigEntity'
4
- import { ConnectionType } from '../../types'
5
+ import { DidAuthConfigEntity } from './DidAuthConfigEntity'
5
6
  import { IdentityEntity } from './IdentityEntity'
6
7
  import { OpenIdConfigEntity } from './OpenIdConfigEntity'
7
- import { DidAuthConfigEntity } from './DidAuthConfigEntity'
8
8
 
9
9
  @Entity('Connection')
10
10
  export class ConnectionEntity extends BaseEntity {