@sphereon/ssi-sdk.data-store 0.34.1-fix.114 → 0.34.1-fix.141

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 (30) hide show
  1. package/dist/index.cjs +1606 -1399
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +160 -166
  4. package/dist/index.d.ts +160 -166
  5. package/dist/index.js +1562 -1355
  6. package/dist/index.js.map +1 -1
  7. package/package.json +8 -8
  8. package/src/__tests__/contact.entities.test.ts +2 -2
  9. package/src/__tests__/contact.store.test.ts +1 -1
  10. package/src/__tests__/digitalCredential.entities.test.ts +2 -1
  11. package/src/__tests__/digitalCredential.store.test.ts +5 -5
  12. package/src/__tests__/pd-manager.entities.test.ts +14 -37
  13. package/src/__tests__/pd-manager.store.test.ts +133 -0
  14. package/src/digitalCredential/DigitalCredentialStore.ts +9 -9
  15. package/src/entities/contact/IdentityEntity.ts +2 -1
  16. package/src/entities/digitalCredential/DigitalCredentialEntity.ts +2 -1
  17. package/src/entities/presentationDefinition/PresentationDefinitionItemEntity.ts +1 -1
  18. package/src/migrations/generic/12-CreateBitstringStatusList.ts +32 -2
  19. package/src/migrations/generic/13-UpdatePresentationDefinitionItemNullable.ts +67 -0
  20. package/src/migrations/generic/index.ts +13 -5
  21. package/src/migrations/postgres/1741895823000-CreateBitstringStatusList.ts +13 -2
  22. package/src/migrations/postgres/1756975509000-UpdatePresentationDefinitionItemNullable.ts +15 -0
  23. package/src/migrations/sqlite/1756975340000-UpdatePresentationDefinitionItemNullable.ts +77 -0
  24. package/src/presentationDefinition/PDStore.ts +6 -1
  25. package/src/types/contact/contact.ts +1 -1
  26. package/src/types/digitalCredential/IAbstractDigitalCredentialStore.ts +2 -1
  27. package/src/types/digitalCredential/enums.ts +0 -7
  28. package/src/types/digitalCredential/types.ts +2 -1
  29. package/src/types/presentationDefinition/presentationDefinition.ts +3 -3
  30. package/src/utils/presentationDefinition/MappingUtils.ts +39 -10
@@ -0,0 +1,77 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm'
2
+
3
+ export class UpdatePresentationDefinitionItemNullableSqlite1756975340000 implements MigrationInterface {
4
+ name = 'UpdatePresentationDefinitionItemNullable1756975340000'
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ // Create temporary table with updated schema (definition_payload nullable)
8
+ await queryRunner.query(`
9
+ CREATE TABLE "temporary_PresentationDefinitionItem" (
10
+ "id" varchar PRIMARY KEY NOT NULL,
11
+ "definition_id" varchar(255) NOT NULL,
12
+ "version" varchar(255) NOT NULL,
13
+ "tenant_id" varchar(255),
14
+ "purpose" varchar(255),
15
+ "name" varchar(255),
16
+ "definition_payload" text,
17
+ "dcql_payload" text,
18
+ "created_at" datetime NOT NULL DEFAULT (datetime('now')),
19
+ "last_updated_at" datetime NOT NULL DEFAULT (datetime('now')),
20
+ CONSTRAINT "UQ_PresentationDefinitionItem_definition_id_version" UNIQUE ("definition_id", "version")
21
+ )
22
+ `)
23
+
24
+ // Copy data from old table
25
+ await queryRunner.query(`
26
+ INSERT INTO "temporary_PresentationDefinitionItem"(
27
+ "id", "definition_id", "version", "tenant_id", "purpose", "name",
28
+ "definition_payload", "dcql_payload", "created_at", "last_updated_at"
29
+ )
30
+ SELECT
31
+ "id", "definition_id", "version", "tenant_id", "purpose", "name",
32
+ "definition_payload", "dcql_payload", "created_at", "last_updated_at"
33
+ FROM "PresentationDefinitionItem"
34
+ `)
35
+
36
+ // Drop old table and rename
37
+ await queryRunner.query(`DROP TABLE "PresentationDefinitionItem"`)
38
+ await queryRunner.query(`ALTER TABLE "temporary_PresentationDefinitionItem" RENAME TO "PresentationDefinitionItem"`)
39
+
40
+ // Recreate index
41
+ await queryRunner.query(`CREATE INDEX "IDX_PresentationDefinitionItem_version" ON "PresentationDefinitionItem" ("version")`)
42
+ }
43
+
44
+ public async down(queryRunner: QueryRunner): Promise<void> {
45
+ // Revert to original schema (definition_payload NOT NULL, dcql_payload nullable)
46
+ await queryRunner.query(`
47
+ CREATE TABLE "temporary_PresentationDefinitionItem" (
48
+ "id" varchar PRIMARY KEY NOT NULL,
49
+ "definition_id" varchar(255) NOT NULL,
50
+ "version" varchar(255) NOT NULL,
51
+ "tenant_id" varchar(255),
52
+ "purpose" varchar(255),
53
+ "name" varchar(255),
54
+ "definition_payload" text NOT NULL,
55
+ "dcql_payload" text,
56
+ "created_at" datetime NOT NULL DEFAULT (datetime('now')),
57
+ "last_updated_at" datetime NOT NULL DEFAULT (datetime('now')),
58
+ CONSTRAINT "UQ_PresentationDefinitionItem_definition_id_version" UNIQUE ("definition_id", "version")
59
+ )
60
+ `)
61
+
62
+ await queryRunner.query(`
63
+ INSERT INTO "temporary_PresentationDefinitionItem"(
64
+ "id", "definition_id", "version", "tenant_id", "purpose", "name",
65
+ "definition_payload", "dcql_payload", "created_at", "last_updated_at"
66
+ )
67
+ SELECT
68
+ "id", "definition_id", "version", "tenant_id", "purpose", "name",
69
+ "definition_payload", "dcql_payload", "created_at", "last_updated_at"
70
+ FROM "PresentationDefinitionItem"
71
+ `)
72
+
73
+ await queryRunner.query(`DROP TABLE "PresentationDefinitionItem"`)
74
+ await queryRunner.query(`ALTER TABLE "temporary_PresentationDefinitionItem" RENAME TO "PresentationDefinitionItem"`)
75
+ await queryRunner.query(`CREATE INDEX "IDX_PresentationDefinitionItem_version" ON "PresentationDefinitionItem" ("version")`)
76
+ }
77
+ }
@@ -106,7 +106,12 @@ export class PDStore extends AbstractPDStore {
106
106
  updatedEntity.version = item.version
107
107
  updatedEntity.name = item.name
108
108
  updatedEntity.purpose = item.purpose
109
- updatedEntity.definitionPayload = JSON.stringify(item.definitionPayload!)
109
+ if (item.definitionPayload) {
110
+ updatedEntity.definitionPayload = JSON.stringify(item.definitionPayload!)
111
+ }
112
+ if (item.dcqlPayload) {
113
+ updatedEntity.dcqlPayload = JSON.stringify(item.dcqlPayload!.dcqlQuery)
114
+ }
110
115
 
111
116
  debug('Updating presentation definition entity', updatedEntity)
112
117
  const updateResult: PresentationDefinitionItemEntity = await pdRepository.save(updatedEntity, {
@@ -1,7 +1,7 @@
1
1
  import { ManagedIdentifierOptsOrResult } from '@sphereon/ssi-sdk-ext.identifier-resolution'
2
2
  import { IIdentifier } from '@veramo/core'
3
3
  import { IIssuerLocaleBranding } from '../issuanceBranding/issuanceBranding'
4
- import { CredentialRole } from '../digitalCredential'
4
+ import { CredentialRole } from '@sphereon/ssi-types'
5
5
 
6
6
  export type MetadataTypes = string | number | Date | boolean | undefined
7
7
 
@@ -2,7 +2,8 @@ import { HasherSync } from '@sphereon/ssi-types'
2
2
  import { FindOptionsOrder } from 'typeorm'
3
3
  import { DigitalCredentialEntity } from '../../entities/digitalCredential/DigitalCredentialEntity'
4
4
  import { DigitalCredential } from './types'
5
- import { CredentialCorrelationType, CredentialRole, CredentialStateType, RegulationType } from './enums'
5
+ import { CredentialCorrelationType, CredentialStateType, RegulationType } from './enums'
6
+ import { CredentialRole } from '@sphereon/ssi-types'
6
7
 
7
8
  export type GetCredentialArgs = { id: string } | { hash: string }
8
9
 
@@ -56,13 +56,6 @@ export enum CredentialCorrelationType {
56
56
  URL = 'URL',
57
57
  }
58
58
 
59
- export enum CredentialRole {
60
- ISSUER = 'ISSUER',
61
- VERIFIER = 'VERIFIER',
62
- HOLDER = 'HOLDER',
63
- FEDERATION_TRUST_ANCHOR = 'FEDERATION_TRUST_ANCHOR',
64
- }
65
-
66
59
  export enum CredentialStateType {
67
60
  REVOKED = 'REVOKED',
68
61
  VERIFIED = 'VERIFIED',
@@ -1,4 +1,5 @@
1
- import { CredentialCorrelationType, CredentialDocumentFormat, CredentialRole, CredentialStateType, DocumentType, RegulationType } from './enums'
1
+ import { CredentialCorrelationType, CredentialDocumentFormat, CredentialStateType, DocumentType, RegulationType } from './enums'
2
+ import { CredentialRole } from '@sphereon/ssi-types'
2
3
 
3
4
  /**
4
5
  * DigitalCredential
@@ -1,5 +1,5 @@
1
1
  import { IPresentationDefinition } from '@sphereon/pex'
2
- import { DcqlQueryREST } from '@sphereon/ssi-types'
2
+ import { DcqlQueryPayload } from '@sphereon/ssi-types'
3
3
 
4
4
  export type PresentationDefinitionItem = {
5
5
  id: string
@@ -8,8 +8,8 @@ export type PresentationDefinitionItem = {
8
8
  version: string
9
9
  name?: string
10
10
  purpose?: string
11
- definitionPayload: IPresentationDefinition
12
- dcqlPayload?: DcqlQueryREST
11
+ definitionPayload?: IPresentationDefinition
12
+ dcqlPayload?: DcqlQueryPayload
13
13
  createdAt: Date
14
14
  lastUpdatedAt: Date
15
15
  }
@@ -1,9 +1,10 @@
1
+ import { DcqlQueryPayload } from '@sphereon/ssi-types'
2
+ import { DcqlQuery } from 'dcql'
1
3
  import { PresentationDefinitionItemEntity } from '../../entities/presentationDefinition/PresentationDefinitionItemEntity'
2
4
  import type { IPresentationDefinition } from '@sphereon/pex'
3
5
  import type { NonPersistedPresentationDefinitionItem, PartialPresentationDefinitionItem, PresentationDefinitionItem } from '../../types'
4
6
  import * as blakepkg from 'blakejs'
5
7
  import { replaceNullWithUndefined } from '../FormattingUtils'
6
- import type { DcqlQueryREST } from '@sphereon/ssi-types'
7
8
 
8
9
  export const presentationDefinitionItemFrom = (entity: PresentationDefinitionItemEntity): PresentationDefinitionItem => {
9
10
  const result: PresentationDefinitionItem = {
@@ -14,11 +15,21 @@ export const presentationDefinitionItemFrom = (entity: PresentationDefinitionIte
14
15
  name: entity.name,
15
16
  purpose: entity.purpose,
16
17
  definitionPayload: JSON.parse(entity.definitionPayload) as IPresentationDefinition,
17
- dcqlPayload: JSON.parse(entity.dcqlPayload) as DcqlQueryREST,
18
+ ...(entity.dcqlPayload && {
19
+ dcqlPayload: {
20
+ queryId: entity.definitionId,
21
+ name: entity.name,
22
+ defaultPurpose: entity.purpose,
23
+ dcqlQuery: DcqlQuery.parse(JSON.parse(entity.dcqlPayload)),
24
+ },
25
+ }),
18
26
  createdAt: entity.createdAt,
19
27
  lastUpdatedAt: entity.lastUpdatedAt,
20
28
  }
21
29
 
30
+ if (result.dcqlPayload?.dcqlQuery) {
31
+ DcqlQuery.validate(result.dcqlPayload?.dcqlQuery)
32
+ }
22
33
  return replaceNullWithUndefined(result)
23
34
  }
24
35
 
@@ -30,29 +41,47 @@ export const presentationDefinitionEntityItemFrom = (item: NonPersistedPresentat
30
41
  entity.version = item.version
31
42
  entity.name = item.name
32
43
  entity.purpose = item.purpose
33
- entity.definitionPayload = JSON.stringify(item.definitionPayload!)
34
- entity.dcqlPayload = JSON.stringify(item.dcqlPayload!)
44
+ if (item.definitionPayload) {
45
+ entity.definitionPayload = JSON.stringify(item.definitionPayload)
46
+ }
47
+ if (item.dcqlPayload) {
48
+ const dcqlQuery = DcqlQuery.parse(item.dcqlPayload.dcqlQuery)
49
+ DcqlQuery.validate(dcqlQuery)
50
+ entity.dcqlPayload = JSON.stringify(item.dcqlPayload.dcqlQuery)
51
+ }
35
52
  return entity
36
53
  }
37
54
 
38
- function hashPayload(payload: IPresentationDefinition): string {
55
+ function hashPayload(payload: IPresentationDefinition | DcqlQueryPayload): string {
39
56
  return blakepkg.blake2bHex(JSON.stringify(payload))
40
57
  }
41
58
 
42
59
  export function isPresentationDefinitionEqual(base: PartialPresentationDefinitionItem, compare: PartialPresentationDefinitionItem): boolean {
43
60
  if (
44
61
  base.definitionId !== compare.definitionId ||
45
- base.tenantId != compare.tenantId ||
62
+ base.tenantId !== compare.tenantId ||
46
63
  base.version !== compare.version ||
47
- base.name != compare.name ||
48
- base.purpose != compare.purpose
64
+ base.name !== compare.name ||
65
+ base.purpose !== compare.purpose
49
66
  ) {
50
67
  return false
51
68
  }
52
69
 
70
+ if (base.dcqlPayload && compare.dcqlPayload) {
71
+ if (hashPayload(base.dcqlPayload) !== hashPayload(compare.dcqlPayload)) {
72
+ return false
73
+ }
74
+ } else if (base.dcqlPayload || compare.dcqlPayload) {
75
+ return false
76
+ }
77
+
53
78
  if (base.definitionPayload && compare.definitionPayload) {
54
- return hashPayload(base.definitionPayload) === hashPayload(compare.definitionPayload)
79
+ if (hashPayload(base.definitionPayload) !== hashPayload(compare.definitionPayload)) {
80
+ return false
81
+ }
82
+ } else if (base.definitionPayload || compare.definitionPayload) {
83
+ return false
55
84
  }
56
85
 
57
- return false
86
+ return true
58
87
  }