@sphereon/ssi-sdk.data-store 0.34.1-feature.SSISDK.47.43 → 0.34.1-feature.SSISDK.50.101

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 (31) hide show
  1. package/dist/index.cjs +1620 -1417
  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 +1576 -1373
  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 +15 -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/1737110469001-UpdateStatusList.ts +1 -1
  22. package/src/migrations/postgres/1741895823000-CreateBitstringStatusList.ts +15 -2
  23. package/src/migrations/postgres/1756975509000-UpdatePresentationDefinitionItemNullable.ts +15 -0
  24. package/src/migrations/sqlite/1756975340000-UpdatePresentationDefinitionItemNullable.ts +77 -0
  25. package/src/presentationDefinition/PDStore.ts +6 -1
  26. package/src/types/contact/contact.ts +1 -1
  27. package/src/types/digitalCredential/IAbstractDigitalCredentialStore.ts +2 -1
  28. package/src/types/digitalCredential/enums.ts +1 -8
  29. package/src/types/digitalCredential/types.ts +2 -1
  30. package/src/types/presentationDefinition/presentationDefinition.ts +3 -3
  31. package/src/utils/presentationDefinition/MappingUtils.ts +34 -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
 
@@ -38,7 +38,7 @@ export namespace CredentialDocumentFormat {
38
38
  export function toSpecValue(documentFormat: CredentialDocumentFormat, documentType: DocumentType) {
39
39
  switch (documentFormat) {
40
40
  case CredentialDocumentFormat.SD_JWT:
41
- return 'vc+sd-jwt'
41
+ return 'dc+sd-jwt'
42
42
  case CredentialDocumentFormat.MSO_MDOC:
43
43
  return 'mso_mdoc'
44
44
  case CredentialDocumentFormat.JSON_LD:
@@ -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,7 +15,14 @@ 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
  }
@@ -30,29 +38,45 @@ export const presentationDefinitionEntityItemFrom = (item: NonPersistedPresentat
30
38
  entity.version = item.version
31
39
  entity.name = item.name
32
40
  entity.purpose = item.purpose
33
- entity.definitionPayload = JSON.stringify(item.definitionPayload!)
34
- entity.dcqlPayload = JSON.stringify(item.dcqlPayload!)
41
+ if (item.definitionPayload) {
42
+ entity.definitionPayload = JSON.stringify(item.definitionPayload)
43
+ }
44
+ if (item.dcqlPayload) {
45
+ entity.dcqlPayload = JSON.stringify(item.dcqlPayload.dcqlQuery)
46
+ }
35
47
  return entity
36
48
  }
37
49
 
38
- function hashPayload(payload: IPresentationDefinition): string {
50
+ function hashPayload(payload: IPresentationDefinition | DcqlQueryPayload): string {
39
51
  return blakepkg.blake2bHex(JSON.stringify(payload))
40
52
  }
41
53
 
42
54
  export function isPresentationDefinitionEqual(base: PartialPresentationDefinitionItem, compare: PartialPresentationDefinitionItem): boolean {
43
55
  if (
44
56
  base.definitionId !== compare.definitionId ||
45
- base.tenantId != compare.tenantId ||
57
+ base.tenantId !== compare.tenantId ||
46
58
  base.version !== compare.version ||
47
- base.name != compare.name ||
48
- base.purpose != compare.purpose
59
+ base.name !== compare.name ||
60
+ base.purpose !== compare.purpose
49
61
  ) {
50
62
  return false
51
63
  }
52
64
 
65
+ if (base.dcqlPayload && compare.dcqlPayload) {
66
+ if (hashPayload(base.dcqlPayload) !== hashPayload(compare.dcqlPayload)) {
67
+ return false
68
+ }
69
+ } else if (base.dcqlPayload || compare.dcqlPayload) {
70
+ return false
71
+ }
72
+
53
73
  if (base.definitionPayload && compare.definitionPayload) {
54
- return hashPayload(base.definitionPayload) === hashPayload(compare.definitionPayload)
74
+ if (hashPayload(base.definitionPayload) !== hashPayload(compare.definitionPayload)) {
75
+ return false
76
+ }
77
+ } else if (base.definitionPayload || compare.definitionPayload) {
78
+ return false
55
79
  }
56
80
 
57
- return false
81
+ return true
58
82
  }