@sphereon/ssi-sdk.data-store 0.34.1-feature.SSISDK.58.host.nonce.endpoint.145 → 0.34.1-feature.SSISDK.58.host.nonce.endpoint.194
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.
- package/dist/index.cjs +105 -174
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +32 -33
- package/dist/index.d.ts +32 -33
- package/dist/index.js +105 -174
- package/dist/index.js.map +1 -1
- package/package.json +7 -7
- package/src/__tests__/pd-manager.entities.test.ts +21 -69
- package/src/__tests__/pd-manager.store.test.ts +111 -194
- package/src/entities/presentationDefinition/{PresentationDefinitionItemEntity.ts → DcqlQueryItemEntity.ts} +8 -12
- package/src/index.ts +3 -3
- package/src/migrations/generic/{13-UpdatePresentationDefinitionItemNullable.ts → 13-CreateDcqlQueryItem.ts} +8 -8
- package/src/migrations/generic/index.ts +2 -5
- package/src/migrations/postgres/1716475165345-CreatePresentationDefinitions.ts +1 -1
- package/src/migrations/postgres/1726588800000-CreateDcqlQueryItem.ts +25 -0
- package/src/migrations/sqlite/1716475165344-CreatePresentationDefinitions.ts +1 -1
- package/src/migrations/sqlite/1726617600000-CreateDcqlQueryItem.ts +24 -0
- package/src/presentationDefinition/AbstractPDStore.ts +5 -5
- package/src/presentationDefinition/PDStore.ts +40 -45
- package/src/types/presentationDefinition/IAbstractPDStore.ts +5 -5
- package/src/types/presentationDefinition/presentationDefinition.ts +8 -9
- package/src/utils/presentationDefinition/MappingUtils.ts +21 -41
- package/src/migrations/postgres/1756975509000-UpdatePresentationDefinitionItemNullable.ts +0 -15
- 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 {
|
|
5
|
-
import {
|
|
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
|
|
10
|
-
name = '
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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 {
|
|
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
|
-
"
|
|
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
|
-
"
|
|
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
|
-
|
|
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<
|
|
15
|
-
abstract getDefinitions(args: GetDefinitionsArgs): Promise<Array<
|
|
16
|
-
abstract addDefinition(args: AddDefinitionArgs): Promise<
|
|
17
|
-
abstract updateDefinition(args: UpdateDefinitionArgs): Promise<
|
|
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
|
-
|
|
13
|
-
|
|
14
|
-
|
|
12
|
+
NonPersistedDcqlQueryItem,
|
|
13
|
+
DcqlQueryItem,
|
|
14
|
+
DcqlQueryItemFilter,
|
|
15
15
|
} from '../types'
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
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<
|
|
29
|
+
getDefinition = async (args: GetDefinitionArgs): Promise<DcqlQueryItem> => {
|
|
30
30
|
const { itemId } = args ?? {}
|
|
31
|
-
const pdRepository = (await this.dbConnection).getRepository(
|
|
32
|
-
const result:
|
|
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
|
|
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(
|
|
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(
|
|
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<
|
|
63
|
+
getDefinitions = async (args: GetDefinitionsArgs): Promise<Array<DcqlQueryItem>> => {
|
|
64
64
|
const { filter } = args
|
|
65
|
-
const pdRepository = (await this.dbConnection).getRepository(
|
|
65
|
+
const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
|
|
66
66
|
const initialResult = await this.findIds(pdRepository, filter)
|
|
67
|
-
const result: Array<
|
|
67
|
+
const result: Array<DcqlQueryItemEntity> = await pdRepository.find({
|
|
68
68
|
where: {
|
|
69
|
-
id: In(initialResult.map((entity:
|
|
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:
|
|
76
|
+
return result.map((entity: DcqlQueryItemEntity) => dcqlQueryItemFrom(entity))
|
|
77
77
|
}
|
|
78
78
|
|
|
79
|
-
addDefinition = async (item:
|
|
80
|
-
const pdRepository = (await this.dbConnection).getRepository(
|
|
79
|
+
addDefinition = async (item: NonPersistedDcqlQueryItem): Promise<DcqlQueryItem> => {
|
|
80
|
+
const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
|
|
81
81
|
|
|
82
|
-
const entity:
|
|
82
|
+
const entity: DcqlQueryItemEntity = dcqlQueryEntityItemFrom(item)
|
|
83
83
|
debug('Adding presentation definition entity', item)
|
|
84
|
-
const result:
|
|
84
|
+
const result: DcqlQueryItemEntity = await pdRepository.save(entity, {
|
|
85
85
|
transaction: true,
|
|
86
86
|
})
|
|
87
87
|
|
|
88
|
-
return
|
|
88
|
+
return dcqlQueryItemFrom(result)
|
|
89
89
|
}
|
|
90
90
|
|
|
91
|
-
updateDefinition = async (item:
|
|
92
|
-
const pdRepository = (await this.dbConnection).getRepository(
|
|
91
|
+
updateDefinition = async (item: DcqlQueryItem): Promise<DcqlQueryItem> => {
|
|
92
|
+
const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
|
|
93
93
|
|
|
94
|
-
const result:
|
|
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<
|
|
101
|
+
const updatedEntity: Partial<DcqlQueryItemEntity> = {
|
|
102
102
|
...result,
|
|
103
103
|
}
|
|
104
104
|
updatedEntity.tenantId = item.tenantId
|
|
105
|
-
updatedEntity.
|
|
105
|
+
updatedEntity.queryId = item.queryId!
|
|
106
106
|
updatedEntity.version = item.version
|
|
107
107
|
updatedEntity.name = item.name
|
|
108
108
|
updatedEntity.purpose = item.purpose
|
|
109
|
-
|
|
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:
|
|
112
|
+
const updateResult: DcqlQueryItemEntity = await pdRepository.save(updatedEntity, {
|
|
118
113
|
transaction: true,
|
|
119
114
|
})
|
|
120
115
|
|
|
121
|
-
return
|
|
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(
|
|
128
|
-
const entity:
|
|
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(
|
|
137
|
+
const pdRepository = (await this.dbConnection).getRepository(DcqlQueryItemEntity)
|
|
143
138
|
const initialResult = await this.findIds(pdRepository, filter)
|
|
144
139
|
|
|
145
|
-
const result: Array<
|
|
140
|
+
const result: Array<DcqlQueryItemEntity> = await pdRepository.find({
|
|
146
141
|
where: {
|
|
147
|
-
id: In(initialResult.map((entity:
|
|
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<
|
|
160
|
-
filter: Array<
|
|
161
|
-
): Promise<Array<
|
|
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<
|
|
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:
|
|
176
|
+
const cleanedItem: DcqlQueryItemFilter = {}
|
|
182
177
|
for (const key in item) {
|
|
183
|
-
const value = item[key as keyof
|
|
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 {
|
|
1
|
+
import { NonPersistedDcqlQueryItem, DcqlQueryItem, DcqlQueryItemFilter } from './presentationDefinition'
|
|
2
2
|
|
|
3
|
-
export type
|
|
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?:
|
|
12
|
+
filter?: FindDcqlQueryArgs
|
|
13
13
|
}
|
|
14
14
|
|
|
15
15
|
export type HasDefinitionsArgs = GetDefinitionsArgs
|
|
16
16
|
|
|
17
|
-
export type AddDefinitionArgs =
|
|
17
|
+
export type AddDefinitionArgs = NonPersistedDcqlQueryItem
|
|
18
18
|
|
|
19
|
-
export type UpdateDefinitionArgs =
|
|
19
|
+
export type UpdateDefinitionArgs = DcqlQueryItem
|
|
20
20
|
|
|
21
21
|
export type DeleteDefinitionArgs = {
|
|
22
22
|
itemId: string
|
|
@@ -1,19 +1,18 @@
|
|
|
1
|
-
import {
|
|
2
|
-
import { DcqlQueryPayload } from '@sphereon/ssi-types'
|
|
1
|
+
import { DcqlQuery } from 'dcql'
|
|
3
2
|
|
|
4
|
-
export type
|
|
3
|
+
export type DcqlQueryItem = {
|
|
5
4
|
id: string
|
|
6
|
-
|
|
5
|
+
queryId: string
|
|
7
6
|
tenantId?: string
|
|
8
7
|
version: string
|
|
9
8
|
name?: string
|
|
10
9
|
purpose?: string
|
|
11
|
-
|
|
12
|
-
dcqlPayload?: DcqlQueryPayload
|
|
10
|
+
query: DcqlQuery
|
|
13
11
|
createdAt: Date
|
|
14
12
|
lastUpdatedAt: Date
|
|
15
13
|
}
|
|
16
14
|
|
|
17
|
-
export type
|
|
18
|
-
export type
|
|
19
|
-
export type
|
|
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
|
|
10
|
-
const result:
|
|
8
|
+
export const dcqlQueryItemFrom = (entity: DcqlQueryItemEntity): DcqlQueryItem => {
|
|
9
|
+
const result: DcqlQueryItem = {
|
|
11
10
|
id: entity.id,
|
|
12
11
|
tenantId: entity.tenantId,
|
|
13
|
-
|
|
12
|
+
queryId: entity.queryId,
|
|
14
13
|
version: entity.version,
|
|
15
14
|
name: entity.name,
|
|
16
15
|
purpose: entity.purpose,
|
|
17
|
-
|
|
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.
|
|
31
|
-
DcqlQuery.validate(result.
|
|
21
|
+
if (result.query) {
|
|
22
|
+
DcqlQuery.validate(result.query)
|
|
32
23
|
}
|
|
33
24
|
return replaceNullWithUndefined(result)
|
|
34
25
|
}
|
|
35
26
|
|
|
36
|
-
export const
|
|
37
|
-
const entity = new
|
|
27
|
+
export const dcqlQueryEntityItemFrom = (item: NonPersistedDcqlQueryItem): DcqlQueryItemEntity => {
|
|
28
|
+
const entity = new DcqlQueryItemEntity()
|
|
38
29
|
|
|
39
30
|
entity.tenantId = item.tenantId
|
|
40
|
-
entity.
|
|
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.
|
|
45
|
-
|
|
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.
|
|
38
|
+
entity.query = JSON.stringify(item.query)
|
|
51
39
|
}
|
|
52
40
|
return entity
|
|
53
41
|
}
|
|
54
42
|
|
|
55
|
-
function hashPayload(payload: IPresentationDefinition |
|
|
43
|
+
function hashPayload(payload: IPresentationDefinition | DcqlQuery): string {
|
|
56
44
|
return blakepkg.blake2bHex(JSON.stringify(payload))
|
|
57
45
|
}
|
|
58
46
|
|
|
59
|
-
export function isPresentationDefinitionEqual(base:
|
|
47
|
+
export function isPresentationDefinitionEqual(base: PartialDcqlQueryItem, compare: PartialDcqlQueryItem): boolean {
|
|
60
48
|
if (
|
|
61
|
-
base.
|
|
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.
|
|
71
|
-
if (hashPayload(base.
|
|
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.
|
|
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
|
-
}
|