@sphereon/ssi-sdk.data-store 0.34.1-fix.170 → 0.34.1-fix.182

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 (24) hide show
  1. package/dist/index.cjs +105 -174
  2. package/dist/index.cjs.map +1 -1
  3. package/dist/index.d.cts +32 -33
  4. package/dist/index.d.ts +32 -33
  5. package/dist/index.js +105 -174
  6. package/dist/index.js.map +1 -1
  7. package/package.json +7 -7
  8. package/src/__tests__/pd-manager.entities.test.ts +21 -69
  9. package/src/__tests__/pd-manager.store.test.ts +111 -194
  10. package/src/entities/presentationDefinition/{PresentationDefinitionItemEntity.ts → DcqlQueryItemEntity.ts} +8 -12
  11. package/src/index.ts +3 -3
  12. package/src/migrations/generic/{13-UpdatePresentationDefinitionItemNullable.ts → 13-CreateDcqlQueryItem.ts} +8 -8
  13. package/src/migrations/generic/index.ts +2 -5
  14. package/src/migrations/postgres/1716475165345-CreatePresentationDefinitions.ts +1 -1
  15. package/src/migrations/postgres/1726588800000-CreateDcqlQueryItem.ts +25 -0
  16. package/src/migrations/sqlite/1716475165344-CreatePresentationDefinitions.ts +1 -1
  17. package/src/migrations/sqlite/1726617600000-CreateDcqlQueryItem.ts +24 -0
  18. package/src/presentationDefinition/AbstractPDStore.ts +5 -5
  19. package/src/presentationDefinition/PDStore.ts +40 -45
  20. package/src/types/presentationDefinition/IAbstractPDStore.ts +5 -5
  21. package/src/types/presentationDefinition/presentationDefinition.ts +8 -9
  22. package/src/utils/presentationDefinition/MappingUtils.ts +21 -41
  23. package/src/migrations/postgres/1756975509000-UpdatePresentationDefinitionItemNullable.ts +0 -15
  24. package/src/migrations/sqlite/1756975340000-UpdatePresentationDefinitionItemNullable.ts +0 -77
@@ -1,13 +1,13 @@
1
1
  import Debug from 'debug'
2
2
  import { DatabaseType, MigrationInterface, QueryRunner } from 'typeorm'
3
3
 
4
- import { UpdatePresentationDefinitionItemNullablePG1741895824000 } from '../postgres/1756975509000-UpdatePresentationDefinitionItemNullable'
5
- import { UpdatePresentationDefinitionItemNullableSqlite1756975340000 } from '../sqlite/1756975340000-UpdatePresentationDefinitionItemNullable'
4
+ import { CreateDcqlQueryItemPG1726588800000 } from '../postgres/1726588800000-CreateDcqlQueryItem'
5
+ import { CreateDcqlQueryItemSQlite1726617600000 } from '../sqlite/1726617600000-CreateDcqlQueryItem'
6
6
 
7
7
  const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:migrations')
8
8
 
9
- export class UpdatePresentationDefinitionItemNullable1741895824000 implements MigrationInterface {
10
- name = 'UpdatePresentationDefinitionItemNullable1741895824000'
9
+ export class CreateDcqlQueryItem1726617600000 implements MigrationInterface {
10
+ name = 'CreateDcqlQueryItem1726617600000'
11
11
 
12
12
  public async up(queryRunner: QueryRunner): Promise<void> {
13
13
  debug('migration: updating presentation definition item nullable fields')
@@ -16,7 +16,7 @@ export class UpdatePresentationDefinitionItemNullable1741895824000 implements Mi
16
16
  switch (dbType) {
17
17
  case 'postgres': {
18
18
  debug('using postgres migration file')
19
- const mig: UpdatePresentationDefinitionItemNullablePG1741895824000 = new UpdatePresentationDefinitionItemNullablePG1741895824000()
19
+ const mig: CreateDcqlQueryItemPG1726588800000 = new CreateDcqlQueryItemPG1726588800000()
20
20
  await mig.up(queryRunner)
21
21
  debug('Migration statements executed')
22
22
  return
@@ -25,7 +25,7 @@ export class UpdatePresentationDefinitionItemNullable1741895824000 implements Mi
25
25
  case 'expo':
26
26
  case 'react-native': {
27
27
  debug('using sqlite/react-native migration file')
28
- const mig: UpdatePresentationDefinitionItemNullableSqlite1756975340000 = new UpdatePresentationDefinitionItemNullableSqlite1756975340000()
28
+ const mig: CreateDcqlQueryItemSQlite1726617600000 = new CreateDcqlQueryItemSQlite1726617600000()
29
29
  await mig.up(queryRunner)
30
30
  debug('Migration statements executed')
31
31
  return
@@ -44,7 +44,7 @@ export class UpdatePresentationDefinitionItemNullable1741895824000 implements Mi
44
44
  switch (dbType) {
45
45
  case 'postgres': {
46
46
  debug('using postgres migration file')
47
- const mig: UpdatePresentationDefinitionItemNullablePG1741895824000 = new UpdatePresentationDefinitionItemNullablePG1741895824000()
47
+ const mig: CreateDcqlQueryItemPG1726588800000 = new CreateDcqlQueryItemPG1726588800000()
48
48
  await mig.down(queryRunner)
49
49
  debug('Migration statements executed')
50
50
  return
@@ -53,7 +53,7 @@ export class UpdatePresentationDefinitionItemNullable1741895824000 implements Mi
53
53
  case 'expo':
54
54
  case 'react-native': {
55
55
  debug('using sqlite/react-native migration file')
56
- const mig: UpdatePresentationDefinitionItemNullableSqlite1756975340000 = new UpdatePresentationDefinitionItemNullableSqlite1756975340000()
56
+ const mig: CreateDcqlQueryItemSQlite1726617600000 = new CreateDcqlQueryItemSQlite1726617600000()
57
57
  await mig.down(queryRunner)
58
58
  debug('Migration statements executed')
59
59
  return
@@ -2,7 +2,7 @@ import { CreateContacts1659463079429 } from './1-CreateContacts'
2
2
  import { CreatePresentationDefinitions1716533767523 } from './10-CreatePresentationDefinitions'
3
3
  import { FixCredentialClaimsReferencesUuid1741895822987 } from './11-FixCredentialClaimsReferenceUuid'
4
4
  import { AddBitstringStatusListEnum1741895823000, CreateBitstringStatusList1741895823000 } from './12-CreateBitstringStatusList'
5
- import { UpdatePresentationDefinitionItemNullable1741895824000 } from './13-UpdatePresentationDefinitionItemNullable'
5
+ import { CreateDcqlQueryItem1726617600000 } from './13-CreateDcqlQueryItem'
6
6
  import { CreateIssuanceBranding1659463079429 } from './2-CreateIssuanceBranding'
7
7
  import { CreateContacts1690925872318 } from './3-CreateContacts'
8
8
  import { CreateStatusList1693866470000 } from './4-CreateStatusList'
@@ -36,10 +36,7 @@ export const DataStoreStatusListMigrations = [
36
36
  export const DataStoreEventLoggerMigrations = [CreateAuditEvents1701635835330]
37
37
  export const DataStoreDigitalCredentialMigrations = [CreateDigitalCredential1708525189000]
38
38
  export const DataStoreMachineStateMigrations = [CreateMachineStateStore1708098041262]
39
- export const DataStorePresentationDefinitionMigrations = [
40
- CreatePresentationDefinitions1716533767523,
41
- UpdatePresentationDefinitionItemNullable1741895824000,
42
- ]
39
+ export const DataStorePresentationDefinitionMigrations = [CreatePresentationDefinitions1716533767523, CreateDcqlQueryItem1726617600000]
43
40
 
44
41
  // All migrations together
45
42
  export const DataStoreMigrations = [
@@ -13,7 +13,7 @@ CREATE TABLE "PresentationDefinitionItem" (
13
13
  "version" TEXT NOT NULL,
14
14
  "purpose" TEXT,
15
15
  "definition_payload" TEXT NOT NULL,
16
- "dcql_payload" TEXT,
16
+ "query" TEXT,
17
17
  "created_at" TIMESTAMP NOT NULL DEFAULT now(),
18
18
  "last_updated_at" TIMESTAMP NOT NULL DEFAULT now(),
19
19
  CONSTRAINT "PK_PresentationDefinitionItem_id" PRIMARY KEY ("id"))
@@ -0,0 +1,25 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm'
2
+
3
+ export class CreateDcqlQueryItemPG1726588800000 implements MigrationInterface {
4
+ name = 'CreateDcqlQueryItemPG1726588800000'
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ await queryRunner.query(`
8
+ CREATE TABLE "DcqlQueryItem" (
9
+ "id" uuid NOT NULL DEFAULT uuid_generate_v4(),
10
+ "tenant_id" TEXT,
11
+ "query_id" TEXT NOT NULL,
12
+ "name" TEXT,
13
+ "version" TEXT NOT NULL,
14
+ "purpose" TEXT,
15
+ "query" TEXT NOT NULL,
16
+ "created_at" TIMESTAMP NOT NULL DEFAULT now(),
17
+ "last_updated_at" TIMESTAMP NOT NULL DEFAULT now(),
18
+ CONSTRAINT "PK_DcqlQueryItem_id" PRIMARY KEY ("id"))
19
+ `)
20
+ }
21
+
22
+ public async down(queryRunner: QueryRunner): Promise<void> {
23
+ await queryRunner.query(`DROP TABLE "DcqlQueryItem"`)
24
+ }
25
+ }
@@ -13,7 +13,7 @@ export class CreatePresentationDefinitions1716475165344 implements MigrationInte
13
13
  "version" varchar NOT NULL,
14
14
  "purpose" varchar,
15
15
  "definition_payload" varchar NOT NULL,
16
- "dcql_payload" varchar,
16
+ "query" varchar,
17
17
  "created_at" datetime NOT NULL DEFAULT (datetime('now')),
18
18
  "last_updated_at" datetime NOT NULL DEFAULT (datetime('now')))`,
19
19
  )
@@ -0,0 +1,24 @@
1
+ import { MigrationInterface, QueryRunner } from 'typeorm'
2
+
3
+ export class CreateDcqlQueryItemSQlite1726617600000 implements MigrationInterface {
4
+ name = 'CreateDcqlQueryItemSQlite1726617600000'
5
+
6
+ public async up(queryRunner: QueryRunner): Promise<void> {
7
+ await queryRunner.query(
8
+ `CREATE TABLE "DcqlQueryItem" (
9
+ "id" varchar PRIMARY KEY NOT NULL,
10
+ "tenant_id" varchar,
11
+ "query_id" varchar NOT NULL,
12
+ "name" varchar,
13
+ "version" varchar NOT NULL,
14
+ "purpose" varchar,
15
+ "query" varchar NOT NULL,
16
+ "created_at" datetime NOT NULL DEFAULT (datetime('now')),
17
+ "last_updated_at" datetime NOT NULL DEFAULT (datetime('now')))`,
18
+ )
19
+ }
20
+
21
+ public async down(queryRunner: QueryRunner): Promise<void> {
22
+ await queryRunner.query(`DROP TABLE "DcqlQueryItem"`)
23
+ }
24
+ }
@@ -2,7 +2,7 @@ import type {
2
2
  GetDefinitionArgs,
3
3
  GetDefinitionsArgs,
4
4
  DeleteDefinitionArgs,
5
- PresentationDefinitionItem,
5
+ DcqlQueryItem,
6
6
  AddDefinitionArgs,
7
7
  UpdateDefinitionArgs,
8
8
  DeleteDefinitionsArgs,
@@ -11,10 +11,10 @@ import type {
11
11
  export abstract class AbstractPDStore {
12
12
  abstract hasDefinition(args: GetDefinitionArgs): Promise<boolean>
13
13
  abstract hasDefinitions(args: GetDefinitionsArgs): Promise<boolean>
14
- abstract getDefinition(args: GetDefinitionArgs): Promise<PresentationDefinitionItem>
15
- abstract getDefinitions(args: GetDefinitionsArgs): Promise<Array<PresentationDefinitionItem>>
16
- abstract addDefinition(args: AddDefinitionArgs): Promise<PresentationDefinitionItem>
17
- abstract updateDefinition(args: UpdateDefinitionArgs): Promise<PresentationDefinitionItem>
14
+ abstract getDefinition(args: GetDefinitionArgs): Promise<DcqlQueryItem>
15
+ abstract getDefinitions(args: GetDefinitionsArgs): Promise<Array<DcqlQueryItem>>
16
+ abstract addDefinition(args: AddDefinitionArgs): Promise<DcqlQueryItem>
17
+ abstract updateDefinition(args: UpdateDefinitionArgs): Promise<DcqlQueryItem>
18
18
  abstract deleteDefinition(args: DeleteDefinitionArgs): Promise<void>
19
19
  abstract deleteDefinitions(args: DeleteDefinitionsArgs): Promise<number>
20
20
  }
@@ -9,12 +9,12 @@ import type {
9
9
  GetDefinitionsArgs,
10
10
  HasDefinitionArgs,
11
11
  HasDefinitionsArgs,
12
- NonPersistedPresentationDefinitionItem,
13
- PresentationDefinitionItem,
14
- PresentationDefinitionItemFilter,
12
+ NonPersistedDcqlQueryItem,
13
+ DcqlQueryItem,
14
+ DcqlQueryItemFilter,
15
15
  } from '../types'
16
- import { PresentationDefinitionItemEntity } from '../entities/presentationDefinition/PresentationDefinitionItemEntity'
17
- import { presentationDefinitionEntityItemFrom, presentationDefinitionItemFrom } from '../utils/presentationDefinition/MappingUtils'
16
+ import { DcqlQueryItemEntity } from '../entities/presentationDefinition/DcqlQueryItemEntity'
17
+ import { dcqlQueryEntityItemFrom, dcqlQueryItemFrom } from '../utils/presentationDefinition/MappingUtils'
18
18
 
19
19
  const debug: Debug.Debugger = Debug('sphereon:ssi-sdk:pd-store')
20
20
 
@@ -26,22 +26,22 @@ export class PDStore extends AbstractPDStore {
26
26
  this.dbConnection = dbConnection
27
27
  }
28
28
 
29
- getDefinition = async (args: GetDefinitionArgs): Promise<PresentationDefinitionItem> => {
29
+ getDefinition = async (args: GetDefinitionArgs): Promise<DcqlQueryItem> => {
30
30
  const { itemId } = args ?? {}
31
- const pdRepository = (await this.dbConnection).getRepository(PresentationDefinitionItemEntity)
32
- const result: PresentationDefinitionItemEntity | null = await pdRepository.findOne({
31
+ const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
32
+ const result: DcqlQueryItemEntity | null = await pdRepository.findOne({
33
33
  where: { id: itemId },
34
34
  })
35
35
  if (!result) {
36
36
  return Promise.reject(Error(`No presentation definition item found for id: ${itemId}`))
37
37
  }
38
38
 
39
- return presentationDefinitionItemFrom(result)
39
+ return dcqlQueryItemFrom(result)
40
40
  }
41
41
 
42
42
  hasDefinition = async (args: HasDefinitionArgs): Promise<boolean> => {
43
43
  const { itemId } = args ?? {}
44
- const pdRepository = (await this.dbConnection).getRepository(PresentationDefinitionItemEntity)
44
+ const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
45
45
 
46
46
  const resultCount: number = await pdRepository.count({
47
47
  where: { id: itemId },
@@ -52,7 +52,7 @@ export class PDStore extends AbstractPDStore {
52
52
 
53
53
  hasDefinitions = async (args: HasDefinitionsArgs): Promise<boolean> => {
54
54
  const { filter } = args
55
- const pdRepository = (await this.dbConnection).getRepository(PresentationDefinitionItemEntity)
55
+ const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
56
56
 
57
57
  const resultCount: number = await pdRepository.count({
58
58
  ...(filter && { where: cleanFilter(filter) }),
@@ -60,72 +60,67 @@ export class PDStore extends AbstractPDStore {
60
60
  return resultCount > 0
61
61
  }
62
62
 
63
- getDefinitions = async (args: GetDefinitionsArgs): Promise<Array<PresentationDefinitionItem>> => {
63
+ getDefinitions = async (args: GetDefinitionsArgs): Promise<Array<DcqlQueryItem>> => {
64
64
  const { filter } = args
65
- const pdRepository = (await this.dbConnection).getRepository(PresentationDefinitionItemEntity)
65
+ const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
66
66
  const initialResult = await this.findIds(pdRepository, filter)
67
- const result: Array<PresentationDefinitionItemEntity> = await pdRepository.find({
67
+ const result: Array<DcqlQueryItemEntity> = await pdRepository.find({
68
68
  where: {
69
- id: In(initialResult.map((entity: PresentationDefinitionItemEntity) => entity.id)),
69
+ id: In(initialResult.map((entity: DcqlQueryItemEntity) => entity.id)),
70
70
  },
71
71
  order: {
72
72
  version: 'DESC',
73
73
  },
74
74
  })
75
75
 
76
- return result.map((entity: PresentationDefinitionItemEntity) => presentationDefinitionItemFrom(entity))
76
+ return result.map((entity: DcqlQueryItemEntity) => dcqlQueryItemFrom(entity))
77
77
  }
78
78
 
79
- addDefinition = async (item: NonPersistedPresentationDefinitionItem): Promise<PresentationDefinitionItem> => {
80
- const pdRepository = (await this.dbConnection).getRepository(PresentationDefinitionItemEntity)
79
+ addDefinition = async (item: NonPersistedDcqlQueryItem): Promise<DcqlQueryItem> => {
80
+ const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
81
81
 
82
- const entity: PresentationDefinitionItemEntity = presentationDefinitionEntityItemFrom(item)
82
+ const entity: DcqlQueryItemEntity = dcqlQueryEntityItemFrom(item)
83
83
  debug('Adding presentation definition entity', item)
84
- const result: PresentationDefinitionItemEntity = await pdRepository.save(entity, {
84
+ const result: DcqlQueryItemEntity = await pdRepository.save(entity, {
85
85
  transaction: true,
86
86
  })
87
87
 
88
- return presentationDefinitionItemFrom(result)
88
+ return dcqlQueryItemFrom(result)
89
89
  }
90
90
 
91
- updateDefinition = async (item: PresentationDefinitionItem): Promise<PresentationDefinitionItem> => {
92
- const pdRepository = (await this.dbConnection).getRepository(PresentationDefinitionItemEntity)
91
+ updateDefinition = async (item: DcqlQueryItem): Promise<DcqlQueryItem> => {
92
+ const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
93
93
 
94
- const result: PresentationDefinitionItemEntity | null = await pdRepository.findOne({
94
+ const result: DcqlQueryItemEntity | null = await pdRepository.findOne({
95
95
  where: { id: item.id },
96
96
  })
97
97
  if (!result) {
98
98
  return Promise.reject(Error(`No presentation definition entity found for id: ${item.id}`))
99
99
  }
100
100
 
101
- const updatedEntity: Partial<PresentationDefinitionItemEntity> = {
101
+ const updatedEntity: Partial<DcqlQueryItemEntity> = {
102
102
  ...result,
103
103
  }
104
104
  updatedEntity.tenantId = item.tenantId
105
- updatedEntity.definitionId = item.definitionId!
105
+ updatedEntity.queryId = item.queryId!
106
106
  updatedEntity.version = item.version
107
107
  updatedEntity.name = item.name
108
108
  updatedEntity.purpose = item.purpose
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
- }
109
+ updatedEntity.query = JSON.stringify(item.query)
115
110
 
116
111
  debug('Updating presentation definition entity', updatedEntity)
117
- const updateResult: PresentationDefinitionItemEntity = await pdRepository.save(updatedEntity, {
112
+ const updateResult: DcqlQueryItemEntity = await pdRepository.save(updatedEntity, {
118
113
  transaction: true,
119
114
  })
120
115
 
121
- return presentationDefinitionItemFrom(updateResult)
116
+ return dcqlQueryItemFrom(updateResult)
122
117
  }
123
118
 
124
119
  deleteDefinition = async (args: DeleteDefinitionArgs): Promise<void> => {
125
120
  const { itemId } = args
126
121
 
127
- const pdRepository = (await this.dbConnection).getRepository(PresentationDefinitionItemEntity)
128
- const entity: PresentationDefinitionItemEntity | null = await pdRepository.findOne({
122
+ const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
123
+ const entity: DcqlQueryItemEntity | null = await pdRepository.findOne({
129
124
  where: { id: itemId },
130
125
  })
131
126
 
@@ -139,12 +134,12 @@ export class PDStore extends AbstractPDStore {
139
134
 
140
135
  deleteDefinitions = async (args: DeleteDefinitionsArgs): Promise<number> => {
141
136
  const { filter } = args
142
- const pdRepository = (await this.dbConnection).getRepository(PresentationDefinitionItemEntity)
137
+ const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
143
138
  const initialResult = await this.findIds(pdRepository, filter)
144
139
 
145
- const result: Array<PresentationDefinitionItemEntity> = await pdRepository.find({
140
+ const result: Array<DcqlQueryItemEntity> = await pdRepository.find({
146
141
  where: {
147
- id: In(initialResult.map((entity: PresentationDefinitionItemEntity) => entity.id)),
142
+ id: In(initialResult.map((entity: DcqlQueryItemEntity) => entity.id)),
148
143
  },
149
144
  })
150
145
 
@@ -156,9 +151,9 @@ export class PDStore extends AbstractPDStore {
156
151
  }
157
152
 
158
153
  findIds = async (
159
- pdRepository: Repository<PresentationDefinitionItemEntity>,
160
- filter: Array<PresentationDefinitionItemFilter> | undefined,
161
- ): Promise<Array<PresentationDefinitionItemEntity>> => {
154
+ pdRepository: Repository<DcqlQueryItemEntity>,
155
+ filter: Array<DcqlQueryItemFilter> | undefined,
156
+ ): Promise<Array<DcqlQueryItemEntity>> => {
162
157
  const idFilters = filter?.map((f) => f.id).filter((id) => id !== undefined && id !== null)
163
158
  if (idFilters && idFilters.length > 0 && idFilters.length === filter?.length) {
164
159
  return await pdRepository.find({
@@ -172,15 +167,15 @@ export class PDStore extends AbstractPDStore {
172
167
  }
173
168
  }
174
169
 
175
- const cleanFilter = (filter: Array<PresentationDefinitionItemFilter> | undefined): Array<PresentationDefinitionItemFilter> | undefined => {
170
+ const cleanFilter = (filter: Array<DcqlQueryItemFilter> | undefined): Array<DcqlQueryItemFilter> | undefined => {
176
171
  if (filter === undefined) {
177
172
  return undefined
178
173
  }
179
174
 
180
175
  return filter.map((item) => {
181
- const cleanedItem: PresentationDefinitionItemFilter = {}
176
+ const cleanedItem: DcqlQueryItemFilter = {}
182
177
  for (const key in item) {
183
- const value = item[key as keyof PresentationDefinitionItemFilter]
178
+ const value = item[key as keyof DcqlQueryItemFilter]
184
179
  if (value !== undefined) {
185
180
  ;(cleanedItem as any)[key] = value
186
181
  }
@@ -1,6 +1,6 @@
1
- import { NonPersistedPresentationDefinitionItem, PresentationDefinitionItem, PresentationDefinitionItemFilter } from './presentationDefinition'
1
+ import { NonPersistedDcqlQueryItem, DcqlQueryItem, DcqlQueryItemFilter } from './presentationDefinition'
2
2
 
3
- export type FindDefinitionArgs = Array<PresentationDefinitionItemFilter>
3
+ export type FindDcqlQueryArgs = Array<DcqlQueryItemFilter>
4
4
 
5
5
  export type GetDefinitionArgs = {
6
6
  itemId: string
@@ -9,14 +9,14 @@ export type GetDefinitionArgs = {
9
9
  export type HasDefinitionArgs = GetDefinitionArgs
10
10
 
11
11
  export type GetDefinitionsArgs = {
12
- filter?: FindDefinitionArgs
12
+ filter?: FindDcqlQueryArgs
13
13
  }
14
14
 
15
15
  export type HasDefinitionsArgs = GetDefinitionsArgs
16
16
 
17
- export type AddDefinitionArgs = NonPersistedPresentationDefinitionItem
17
+ export type AddDefinitionArgs = NonPersistedDcqlQueryItem
18
18
 
19
- export type UpdateDefinitionArgs = PresentationDefinitionItem
19
+ export type UpdateDefinitionArgs = DcqlQueryItem
20
20
 
21
21
  export type DeleteDefinitionArgs = {
22
22
  itemId: string
@@ -1,19 +1,18 @@
1
- import { IPresentationDefinition } from '@sphereon/pex'
2
- import { DcqlQueryPayload } from '@sphereon/ssi-types'
1
+ import { DcqlQuery } from 'dcql'
3
2
 
4
- export type PresentationDefinitionItem = {
3
+ export type DcqlQueryItem = {
5
4
  id: string
6
- definitionId: string
5
+ queryId: string
7
6
  tenantId?: string
8
7
  version: string
9
8
  name?: string
10
9
  purpose?: string
11
- definitionPayload?: IPresentationDefinition
12
- dcqlPayload?: DcqlQueryPayload
10
+ query: DcqlQuery
13
11
  createdAt: Date
14
12
  lastUpdatedAt: Date
15
13
  }
16
14
 
17
- export type NonPersistedPresentationDefinitionItem = Omit<PresentationDefinitionItem, 'id' | 'createdAt' | 'lastUpdatedAt'>
18
- export type PartialPresentationDefinitionItem = Partial<PresentationDefinitionItem>
19
- export type PresentationDefinitionItemFilter = Partial<Omit<PresentationDefinitionItem, 'definitionPayload' | 'dcqlPayload'>>
15
+ export type ImportDcqlQueryItem = Omit<DcqlQueryItem, 'id' | 'tenantId' | 'version' | 'createdAt' | 'lastUpdatedAt'>
16
+ export type NonPersistedDcqlQueryItem = Omit<DcqlQueryItem, 'id' | 'createdAt' | 'lastUpdatedAt'>
17
+ export type PartialDcqlQueryItem = Partial<DcqlQueryItem>
18
+ export type DcqlQueryItemFilter = Partial<Omit<DcqlQueryItem, 'query'>>
@@ -1,64 +1,52 @@
1
- import { DcqlQueryPayload } from '@sphereon/ssi-types'
2
- import { DcqlQuery } from 'dcql'
3
- import { PresentationDefinitionItemEntity } from '../../entities/presentationDefinition/PresentationDefinitionItemEntity'
4
1
  import type { IPresentationDefinition } from '@sphereon/pex'
5
- import type { NonPersistedPresentationDefinitionItem, PartialPresentationDefinitionItem, PresentationDefinitionItem } from '../../types'
6
2
  import * as blakepkg from 'blakejs'
3
+ import { DcqlQuery } from 'dcql'
4
+ import { DcqlQueryItemEntity } from '../../entities/presentationDefinition/DcqlQueryItemEntity'
5
+ import type { NonPersistedDcqlQueryItem, PartialDcqlQueryItem, DcqlQueryItem } from '../../types'
7
6
  import { replaceNullWithUndefined } from '../FormattingUtils'
8
7
 
9
- export const presentationDefinitionItemFrom = (entity: PresentationDefinitionItemEntity): PresentationDefinitionItem => {
10
- const result: PresentationDefinitionItem = {
8
+ export const dcqlQueryItemFrom = (entity: DcqlQueryItemEntity): DcqlQueryItem => {
9
+ const result: DcqlQueryItem = {
11
10
  id: entity.id,
12
11
  tenantId: entity.tenantId,
13
- definitionId: entity.definitionId,
12
+ queryId: entity.queryId,
14
13
  version: entity.version,
15
14
  name: entity.name,
16
15
  purpose: entity.purpose,
17
- definitionPayload: JSON.parse(entity.definitionPayload) as IPresentationDefinition,
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
- }),
16
+ query: DcqlQuery.parse(JSON.parse(entity.query)),
26
17
  createdAt: entity.createdAt,
27
18
  lastUpdatedAt: entity.lastUpdatedAt,
28
19
  }
29
20
 
30
- if (result.dcqlPayload?.dcqlQuery) {
31
- DcqlQuery.validate(result.dcqlPayload?.dcqlQuery)
21
+ if (result.query) {
22
+ DcqlQuery.validate(result.query)
32
23
  }
33
24
  return replaceNullWithUndefined(result)
34
25
  }
35
26
 
36
- export const presentationDefinitionEntityItemFrom = (item: NonPersistedPresentationDefinitionItem): PresentationDefinitionItemEntity => {
37
- const entity = new PresentationDefinitionItemEntity()
27
+ export const dcqlQueryEntityItemFrom = (item: NonPersistedDcqlQueryItem): DcqlQueryItemEntity => {
28
+ const entity = new DcqlQueryItemEntity()
38
29
 
39
30
  entity.tenantId = item.tenantId
40
- entity.definitionId = item.definitionId!
31
+ entity.queryId = item.queryId!
41
32
  entity.version = item.version
42
33
  entity.name = item.name
43
34
  entity.purpose = item.purpose
44
- if (item.definitionPayload) {
45
- entity.definitionPayload = JSON.stringify(item.definitionPayload)
46
- }
47
- if (item.dcqlPayload) {
48
- const dcqlQuery = DcqlQuery.parse(item.dcqlPayload.dcqlQuery)
35
+ if (item.query) {
36
+ const dcqlQuery = DcqlQuery.parse(item.query)
49
37
  DcqlQuery.validate(dcqlQuery)
50
- entity.dcqlPayload = JSON.stringify(item.dcqlPayload.dcqlQuery)
38
+ entity.query = JSON.stringify(item.query)
51
39
  }
52
40
  return entity
53
41
  }
54
42
 
55
- function hashPayload(payload: IPresentationDefinition | DcqlQueryPayload): string {
43
+ function hashPayload(payload: IPresentationDefinition | DcqlQuery): string {
56
44
  return blakepkg.blake2bHex(JSON.stringify(payload))
57
45
  }
58
46
 
59
- export function isPresentationDefinitionEqual(base: PartialPresentationDefinitionItem, compare: PartialPresentationDefinitionItem): boolean {
47
+ export function isPresentationDefinitionEqual(base: PartialDcqlQueryItem, compare: PartialDcqlQueryItem): boolean {
60
48
  if (
61
- base.definitionId !== compare.definitionId ||
49
+ base.queryId !== compare.queryId ||
62
50
  base.tenantId !== compare.tenantId ||
63
51
  base.version !== compare.version ||
64
52
  base.name !== compare.name ||
@@ -67,19 +55,11 @@ export function isPresentationDefinitionEqual(base: PartialPresentationDefinitio
67
55
  return false
68
56
  }
69
57
 
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
-
78
- if (base.definitionPayload && compare.definitionPayload) {
79
- if (hashPayload(base.definitionPayload) !== hashPayload(compare.definitionPayload)) {
58
+ if (base.query && compare.query) {
59
+ if (hashPayload(base.query) !== hashPayload(compare.query)) {
80
60
  return false
81
61
  }
82
- } else if (base.definitionPayload || compare.definitionPayload) {
62
+ } else if (base.query || compare.query) {
83
63
  return false
84
64
  }
85
65
 
@@ -1,15 +0,0 @@
1
- import { MigrationInterface, QueryRunner } from 'typeorm'
2
-
3
- export class UpdatePresentationDefinitionItemNullablePG1741895824000 implements MigrationInterface {
4
- name = 'UpdatePresentationDefinitionItemNullable1741895824000'
5
-
6
- public async up(queryRunner: QueryRunner): Promise<void> {
7
- // Make definition_payload nullable
8
- await queryRunner.query(`ALTER TABLE "PresentationDefinitionItem" ALTER COLUMN "definition_payload" DROP NOT NULL`)
9
- }
10
-
11
- public async down(queryRunner: QueryRunner): Promise<void> {
12
- // Make definition_payload NOT NULL again
13
- await queryRunner.query(`ALTER TABLE "PresentationDefinitionItem" ALTER COLUMN "definition_payload" SET NOT NULL`)
14
- }
15
- }
@@ -1,77 +0,0 @@
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
- }