@sphereon/ssi-sdk.data-store 0.34.1-feature.SSISDK.46.41 → 0.34.1-feature.SSISDK.50.98

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 +1618 -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 +1574 -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 +32 -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,12 @@ 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
+ dcqlQuery: DcqlQuery.parse(JSON.parse(entity.dcqlPayload)),
22
+ },
23
+ }),
18
24
  createdAt: entity.createdAt,
19
25
  lastUpdatedAt: entity.lastUpdatedAt,
20
26
  }
@@ -30,29 +36,45 @@ export const presentationDefinitionEntityItemFrom = (item: NonPersistedPresentat
30
36
  entity.version = item.version
31
37
  entity.name = item.name
32
38
  entity.purpose = item.purpose
33
- entity.definitionPayload = JSON.stringify(item.definitionPayload!)
34
- entity.dcqlPayload = JSON.stringify(item.dcqlPayload!)
39
+ if (item.definitionPayload) {
40
+ entity.definitionPayload = JSON.stringify(item.definitionPayload)
41
+ }
42
+ if (item.dcqlPayload) {
43
+ entity.dcqlPayload = JSON.stringify(item.dcqlPayload.dcqlQuery)
44
+ }
35
45
  return entity
36
46
  }
37
47
 
38
- function hashPayload(payload: IPresentationDefinition): string {
48
+ function hashPayload(payload: IPresentationDefinition | DcqlQueryPayload): string {
39
49
  return blakepkg.blake2bHex(JSON.stringify(payload))
40
50
  }
41
51
 
42
52
  export function isPresentationDefinitionEqual(base: PartialPresentationDefinitionItem, compare: PartialPresentationDefinitionItem): boolean {
43
53
  if (
44
54
  base.definitionId !== compare.definitionId ||
45
- base.tenantId != compare.tenantId ||
55
+ base.tenantId !== compare.tenantId ||
46
56
  base.version !== compare.version ||
47
- base.name != compare.name ||
48
- base.purpose != compare.purpose
57
+ base.name !== compare.name ||
58
+ base.purpose !== compare.purpose
49
59
  ) {
50
60
  return false
51
61
  }
52
62
 
63
+ if (base.dcqlPayload && compare.dcqlPayload) {
64
+ if (hashPayload(base.dcqlPayload) !== hashPayload(compare.dcqlPayload)) {
65
+ return false
66
+ }
67
+ } else if (base.dcqlPayload || compare.dcqlPayload) {
68
+ return false
69
+ }
70
+
53
71
  if (base.definitionPayload && compare.definitionPayload) {
54
- return hashPayload(base.definitionPayload) === hashPayload(compare.definitionPayload)
72
+ if (hashPayload(base.definitionPayload) !== hashPayload(compare.definitionPayload)) {
73
+ return false
74
+ }
75
+ } else if (base.definitionPayload || compare.definitionPayload) {
76
+ return false
55
77
  }
56
78
 
57
- return false
79
+ return true
58
80
  }