@sphereon/ssi-sdk.pd-manager 0.34.1-feature.FIDES.1.274 → 0.34.1-feature.IDK.11.48

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.
@@ -1,18 +1,22 @@
1
1
  import { IAgentPlugin } from '@veramo/core'
2
2
  import {
3
- DeleteDcqlQueryItemArgs,
4
- DeleteDcqlQueryItemsArgs,
5
- GetDcqlQueryItemArgs,
6
- GetDcqlQueryItemsArgs,
3
+ DeleteDefinitionItemArgs,
4
+ DeleteDefinitionItemsArgs,
5
+ GetDefinitionItemArgs,
6
+ GetDefinitionItemsArgs,
7
7
  HasDefinitionItemArgs,
8
- HasDcqlQueryItemsArgs,
8
+ HasDefinitionItemsArgs,
9
9
  IPDManager,
10
- PersistDcqlQueryArgs,
10
+ PersistDefinitionArgs,
11
11
  schema,
12
12
  } from '../index'
13
- import { AbstractPDStore, NonPersistedDcqlQueryItem, DcqlQueryItem, AddDefinitionArgs } from '@sphereon/ssi-sdk.data-store-types'
14
- import { isPresentationDefinitionEqual } from '@sphereon/ssi-sdk.data-store'
15
- import semver from 'semver/preload.js'
13
+ import {
14
+ AbstractPDStore,
15
+ isPresentationDefinitionEqual,
16
+ NonPersistedPresentationDefinitionItem,
17
+ PresentationDefinitionItem,
18
+ } from '@sphereon/ssi-sdk.data-store'
19
+ import semver from 'semver/preload'
16
20
  import { ReleaseType } from 'semver'
17
21
 
18
22
  // Exposing the methods here for any REST implementation
@@ -54,32 +58,32 @@ export class PDManager implements IAgentPlugin {
54
58
  }
55
59
 
56
60
  /** {@inheritDoc IPDManager.pdmHasDefinitions} */
57
- private async pdmHasDefinitions(args: HasDcqlQueryItemsArgs): Promise<boolean> {
61
+ private async pdmHasDefinitions(args: HasDefinitionItemsArgs): Promise<boolean> {
58
62
  const { filter } = args
59
63
  return this.store.hasDefinitions({ filter })
60
64
  }
61
65
 
62
66
  /** {@inheritDoc IPDManager.pdmGetDefinition} */
63
- private async pdmGetDefinition(args: GetDcqlQueryItemArgs): Promise<DcqlQueryItem> {
67
+ private async pdmGetDefinition(args: GetDefinitionItemArgs): Promise<PresentationDefinitionItem> {
64
68
  const { itemId } = args
65
69
  return this.store.getDefinition({ itemId })
66
70
  }
67
71
 
68
72
  /** {@inheritDoc IPDManager.pdmGetDefinitions} */
69
- private async pdmGetDefinitions(args: GetDcqlQueryItemsArgs): Promise<Array<DcqlQueryItem>> {
73
+ private async pdmGetDefinitions(args: GetDefinitionItemsArgs): Promise<Array<PresentationDefinitionItem>> {
70
74
  const { filter, opts } = args
71
75
  const allDefinitions = await this.store.getDefinitions({ filter })
72
- let definitions: DcqlQueryItem[] = []
76
+ let definitions: PresentationDefinitionItem[] = []
73
77
  if (opts == undefined || opts.showVersionHistory !== true) {
74
78
  const groupedByDefinitionId = allDefinitions.reduce(
75
79
  (acc, entity) => {
76
- if (!acc[entity.queryId]) {
77
- acc[entity.queryId] = []
80
+ if (!acc[entity.definitionId]) {
81
+ acc[entity.definitionId] = []
78
82
  }
79
- acc[entity.queryId].push(entity)
83
+ acc[entity.definitionId].push(entity)
80
84
  return acc
81
85
  },
82
- {} as Record<string, DcqlQueryItem[]>,
86
+ {} as Record<string, PresentationDefinitionItem[]>,
83
87
  )
84
88
  definitions = Object.values(groupedByDefinitionId).map((entities) =>
85
89
  entities.reduce((highestVersionItem, baseItem) => {
@@ -95,123 +99,111 @@ export class PDManager implements IAgentPlugin {
95
99
  }
96
100
 
97
101
  /** {@inheritDoc IPDManager.pdmDeleteDefinition} */
98
- private async pdmDeleteDefinition(args: DeleteDcqlQueryItemArgs): Promise<boolean> {
102
+ private async pdmDeleteDefinition(args: DeleteDefinitionItemArgs): Promise<boolean> {
99
103
  return this.store.deleteDefinition(args).then((value) => true)
100
104
  }
101
105
 
102
106
  /** {@inheritDoc IPDManager.pdmDeleteDefinitions} */
103
- private async pdmDeleteDefinitions(args: DeleteDcqlQueryItemsArgs): Promise<number> {
107
+ private async pdmDeleteDefinitions(args: DeleteDefinitionItemsArgs): Promise<number> {
104
108
  return this.store.deleteDefinitions(args)
105
109
  }
106
110
 
107
111
  /** {@inheritDoc IPDManager.pdmPersistDefinition} */
108
- private async pdmPersistDefinition(args: PersistDcqlQueryArgs): Promise<DcqlQueryItem> {
109
- try {
110
- const { definitionItem, opts } = args
111
- const { versionControlMode, versionIncrementReleaseType } = opts ?? { versionControlMode: 'AutoIncrement' }
112
- const { version, tenantId } = definitionItem
113
- const definitionId = definitionItem.queryId
114
-
115
- let { id } = definitionItem
116
- if (id !== undefined && versionControlMode !== 'Overwrite') {
117
- id = undefined
118
- }
112
+ private async pdmPersistDefinition(args: PersistDefinitionArgs): Promise<PresentationDefinitionItem> {
113
+ const { definitionItem, opts } = args
114
+ const { versionControlMode, versionIncrementReleaseType } = opts ?? { versionControlMode: 'AutoIncrement' }
115
+ const { version, tenantId } = definitionItem
116
+ const definitionId = definitionItem.definitionId ?? definitionItem.definitionPayload.id
117
+
118
+ let { id } = definitionItem
119
+ if (id !== undefined && versionControlMode !== 'Overwrite') {
120
+ id = undefined
121
+ }
119
122
 
120
- const nonPersistedDefinitionItem: NonPersistedDcqlQueryItem = {
121
- ...definitionItem,
122
- version: version ?? '1',
123
- }
123
+ const nonPersistedDefinitionItem: NonPersistedPresentationDefinitionItem = {
124
+ ...definitionItem,
125
+ definitionId: definitionId,
126
+ version: version ?? '1',
127
+ }
124
128
 
125
- const existing = await this.store.getDefinitions({ filter: [{ id, queryId: definitionId, tenantId, version }] })
126
- const existingItem = existing[0]
129
+ const existing = await this.store.getDefinitions({ filter: [{ id, definitionId, tenantId, version }] })
130
+ const existingItem = existing[0]
127
131
 
128
- // Always fetch all definitions for the definitionId/tenantId and determine the truly latest version
129
- const allDefinitions = await this.store.getDefinitions({ filter: [{ queryId: definitionId, tenantId }] })
130
- allDefinitions.sort((a, b) => semver.compare(this.normalizeToSemverVersionFormat(a.version), this.normalizeToSemverVersionFormat(b.version)))
131
- const trulyLatestVersionItem = allDefinitions[allDefinitions.length - 1]
132
+ // Always fetch all definitions for the definitionId/tenantId and determine the truly latest version
133
+ const allDefinitions = await this.store.getDefinitions({ filter: [{ definitionId, tenantId }] })
134
+ allDefinitions.sort((a, b) => semver.compare(this.normalizeToSemverVersionFormat(a.version), this.normalizeToSemverVersionFormat(b.version)))
135
+ const trulyLatestVersionItem = allDefinitions[allDefinitions.length - 1]
132
136
 
133
- let latestVersionItem: DcqlQueryItem | undefined = trulyLatestVersionItem
137
+ let latestVersionItem: PresentationDefinitionItem | undefined = trulyLatestVersionItem
134
138
 
135
- // If a specific version exists and matches existingItem, we keep that as a base.
136
- // Otherwise we use the trulyLatestVersionItem
137
- if (existingItem && version) {
138
- latestVersionItem = trulyLatestVersionItem ?? existingItem
139
- }
139
+ // If a specific version exists and matches existingItem, we keep that as a base.
140
+ // Otherwise we use the trulyLatestVersionItem
141
+ if (existingItem && version) {
142
+ latestVersionItem = trulyLatestVersionItem ?? existingItem
143
+ }
140
144
 
141
- const isPayloadModified = !existingItem || !isPresentationDefinitionEqual(existingItem, definitionItem)
142
- if (!isPayloadModified) return existingItem
143
-
144
- switch (versionControlMode) {
145
- case 'Overwrite':
146
- return this.handleOverwriteMode(existingItem, nonPersistedDefinitionItem, version)
147
- case 'OverwriteLatest':
148
- return this.handleOverwriteLatestMode(latestVersionItem, nonPersistedDefinitionItem)
149
- case 'Manual':
150
- return this.handleManualMode(existingItem, nonPersistedDefinitionItem, tenantId, version)
151
- case 'AutoIncrement':
152
- return this.handleAutoIncrementMode(latestVersionItem, nonPersistedDefinitionItem, versionIncrementReleaseType ?? 'major')
153
- default:
154
- throw new Error(`Unknown version control mode: ${versionControlMode}`)
155
- }
156
- } catch (e) {
157
- console.log('pdmPersistDefinition failed', e)
158
- throw e
145
+ const isPayloadModified = !existingItem || !isPresentationDefinitionEqual(existingItem, definitionItem)
146
+ if (!isPayloadModified) return existingItem
147
+
148
+ switch (versionControlMode) {
149
+ case 'Overwrite':
150
+ return this.handleOverwriteMode(existingItem, nonPersistedDefinitionItem, version)
151
+ case 'OverwriteLatest':
152
+ return this.handleOverwriteLatestMode(latestVersionItem, nonPersistedDefinitionItem)
153
+ case 'Manual':
154
+ return this.handleManualMode(existingItem, nonPersistedDefinitionItem, tenantId, version)
155
+ case 'AutoIncrement':
156
+ return this.handleAutoIncrementMode(latestVersionItem, nonPersistedDefinitionItem, versionIncrementReleaseType ?? 'major')
157
+ default:
158
+ throw new Error(`Unknown version control mode: ${versionControlMode}`)
159
159
  }
160
160
  }
161
161
 
162
162
  private async handleOverwriteMode(
163
- existingItem: DcqlQueryItem | undefined,
164
- definitionItem: NonPersistedDcqlQueryItem,
163
+ existingItem: PresentationDefinitionItem | undefined,
164
+ definitionItem: NonPersistedPresentationDefinitionItem,
165
165
  version: string | undefined,
166
- ): Promise<DcqlQueryItem> {
166
+ ): Promise<PresentationDefinitionItem> {
167
167
  if (existingItem) {
168
- existingItem.queryId = definitionItem.queryId
168
+ existingItem.definitionId = definitionItem.definitionId
169
169
  existingItem.version = version ?? existingItem.version ?? '1'
170
170
  existingItem.tenantId = definitionItem.tenantId
171
- existingItem.name = definitionItem.name
172
- existingItem.purpose = definitionItem.purpose
173
- existingItem.query = definitionItem.query
171
+ existingItem.name = definitionItem.definitionPayload.name ?? definitionItem.name
172
+ existingItem.purpose = definitionItem.definitionPayload.purpose ?? definitionItem.purpose
173
+ existingItem.definitionPayload = definitionItem.definitionPayload
174
174
 
175
175
  return await this.store.updateDefinition(existingItem)
176
176
  } else {
177
- // Apply the same field extraction logic for new items
178
- const newDefinitionItem = {
179
- ...definitionItem,
180
- } satisfies AddDefinitionArgs
181
- return await this.store.addDefinition(newDefinitionItem)
177
+ return await this.store.addDefinition(definitionItem)
182
178
  }
183
179
  }
184
180
 
185
181
  private async handleOverwriteLatestMode(
186
- latestVersionItem: DcqlQueryItem | undefined,
187
- definitionItem: NonPersistedDcqlQueryItem,
188
- ): Promise<DcqlQueryItem> {
182
+ latestVersionItem: PresentationDefinitionItem | undefined,
183
+ definitionItem: NonPersistedPresentationDefinitionItem,
184
+ ): Promise<PresentationDefinitionItem> {
189
185
  if (latestVersionItem) {
190
- latestVersionItem.queryId = definitionItem.queryId
186
+ latestVersionItem.definitionId = definitionItem.definitionId
191
187
  latestVersionItem.tenantId = definitionItem.tenantId
192
188
  latestVersionItem.name = definitionItem.name
193
189
  latestVersionItem.purpose = definitionItem.purpose
194
- latestVersionItem.query = definitionItem.query
190
+ latestVersionItem.definitionPayload = definitionItem.definitionPayload
195
191
 
196
192
  return await this.store.updateDefinition(latestVersionItem)
197
193
  } else {
198
- // Apply the same field extraction logic for new items
199
- const newDefinitionItem = {
200
- ...definitionItem,
201
- } satisfies AddDefinitionArgs
202
- return await this.store.addDefinition(newDefinitionItem)
194
+ return await this.store.addDefinition(definitionItem)
203
195
  }
204
196
  }
205
197
 
206
198
  private async handleManualMode(
207
- existingItem: DcqlQueryItem | undefined,
208
- definitionItem: NonPersistedDcqlQueryItem,
199
+ existingItem: PresentationDefinitionItem | undefined,
200
+ definitionItem: NonPersistedPresentationDefinitionItem,
209
201
  tenantId: string | undefined,
210
202
  version: string | undefined,
211
- ): Promise<DcqlQueryItem> {
203
+ ): Promise<PresentationDefinitionItem> {
212
204
  if (existingItem && !isPresentationDefinitionEqual(existingItem, definitionItem)) {
213
205
  throw Error(
214
- `Cannot update definition ${definitionItem.queryId} for tenant ${tenantId} version ${version} because definition exists and manual version control is enabled.`,
206
+ `Cannot update definition ${definitionItem.definitionId} for tenant ${tenantId} version ${version} because definition exists and manual version control is enabled.`,
215
207
  )
216
208
  } else {
217
209
  return await this.store.addDefinition(definitionItem)
@@ -219,10 +211,10 @@ export class PDManager implements IAgentPlugin {
219
211
  }
220
212
 
221
213
  private async handleAutoIncrementMode(
222
- latestVersionItem: DcqlQueryItem | undefined,
223
- definitionItem: NonPersistedDcqlQueryItem,
214
+ latestVersionItem: PresentationDefinitionItem | undefined,
215
+ definitionItem: NonPersistedPresentationDefinitionItem,
224
216
  releaseType: ReleaseType,
225
- ): Promise<DcqlQueryItem> {
217
+ ): Promise<PresentationDefinitionItem> {
226
218
  const defaultVersion = '1'
227
219
  let currentVersion = latestVersionItem?.version ?? definitionItem.version ?? defaultVersion
228
220
  let resultVersion: string
@@ -238,7 +230,7 @@ export class PDManager implements IAgentPlugin {
238
230
  let fullVersionToIncrement = preReleaseIdentifier ? `${normalizedBaseVersion}-${preReleaseSuffix}` : normalizedBaseVersion
239
231
 
240
232
  // Use semver to increment the version
241
- let incrementedVersion = semver.inc(fullVersionToIncrement, releaseType, undefined, preReleaseIdentifier)
233
+ let incrementedVersion = semver.inc(fullVersionToIncrement, releaseType, preReleaseIdentifier)
242
234
  if (!incrementedVersion) {
243
235
  throw new Error(`Could not increment ${releaseType} version on ${currentVersion} ${preReleaseSuffix}`)
244
236
  }
@@ -256,20 +248,10 @@ export class PDManager implements IAgentPlugin {
256
248
  }
257
249
  }
258
250
 
259
- // Apply field extraction logic before adding
260
- const newDefinitionItem = {
261
- ...definitionItem,
262
- version: resultVersion,
263
- } satisfies AddDefinitionArgs
264
-
265
- try {
266
- const dcqlQueryItem = await this.store.addDefinition(newDefinitionItem)
267
- return dcqlQueryItem
268
- } catch (e) {
269
- console.log(e)
270
- throw e
271
- }
251
+ definitionItem.version = resultVersion
252
+ return await this.store.addDefinition(definitionItem)
272
253
  }
254
+
273
255
  private normalizeToSemverVersionFormat(version: string): string {
274
256
  const defaultVersion = '1.0.0'
275
257
  let [baseVersion, preReleaseSuffix] = version.split(/-(.+)/)
package/src/index.ts CHANGED
@@ -1,11 +1,9 @@
1
1
  /**
2
2
  * @public
3
3
  */
4
- import schema from '../plugin.schema.json'
4
+ const schema = require('../plugin.schema.json')
5
5
  export { schema }
6
6
  export { PDManager, pdManagerMethods } from './agent/PDManager'
7
7
  export * from './types/IPDManager'
8
8
 
9
- export type { ReleaseType } from 'semver'
10
- export type { ImportDcqlQueryItem } from '@sphereon/ssi-sdk.data-store-types'
11
- export type { DcqlQuery } from 'dcql'
9
+ export { ReleaseType } from 'semver'
@@ -1,5 +1,5 @@
1
1
  import { IAgentContext, IPluginMethodMap } from '@veramo/core'
2
- import { FindDcqlQueryArgs, NonPersistedDcqlQueryItem, DcqlQueryItem } from '@sphereon/ssi-sdk.data-store-types'
2
+ import { FindDefinitionArgs, NonPersistedPresentationDefinitionItem, PresentationDefinitionItem } from '@sphereon/ssi-sdk.data-store'
3
3
  import { ReleaseType } from 'semver'
4
4
 
5
5
  export interface IPDManager extends IPluginMethodMap {
@@ -7,13 +7,13 @@ export interface IPDManager extends IPluginMethodMap {
7
7
  * Get a single presentation definition records by primary key
8
8
  * @param args
9
9
  */
10
- pdmGetDefinition(args: GetDcqlQueryItemArgs): Promise<DcqlQueryItem>
10
+ pdmGetDefinition(args: GetDefinitionItemArgs): Promise<PresentationDefinitionItem>
11
11
 
12
12
  /**
13
13
  * Find one or more presentation definition records using filters
14
14
  * @param args
15
15
  */
16
- pdmGetDefinitions(args: GetDcqlQueryItemsArgs): Promise<Array<DcqlQueryItem>>
16
+ pdmGetDefinitions(args: GetDefinitionItemsArgs): Promise<Array<PresentationDefinitionItem>>
17
17
 
18
18
  /**
19
19
  * Checks whether a presentation definition record exists by primary key
@@ -25,55 +25,56 @@ export interface IPDManager extends IPluginMethodMap {
25
25
  * Checks whether one or more presentation definition records exist using filters
26
26
  * @param args
27
27
  */
28
- pdmHasDefinitions(args: HasDcqlQueryItemsArgs): Promise<boolean>
28
+ pdmHasDefinitions(args: HasDefinitionItemsArgs): Promise<boolean>
29
29
 
30
30
  /**
31
31
  * Delete a single presentation definition records by primary key
32
32
  * @param args
33
33
  */
34
- pdmDeleteDefinition(args: DeleteDcqlQueryItemArgs): Promise<boolean>
34
+ pdmDeleteDefinition(args: DeleteDefinitionItemArgs): Promise<boolean>
35
35
 
36
36
  /**
37
37
  * Delete multiple presentation definitions records using filters
38
38
  * @param args
39
39
  */
40
- pdmDeleteDefinitions(args: DeleteDcqlQueryItemsArgs): Promise<number>
40
+ pdmDeleteDefinitions(args: DeleteDefinitionItemsArgs): Promise<number>
41
41
 
42
42
  /**
43
43
  * Check in a presentation definition.
44
44
  * It has version control logic which will add or update presentation definition records and has settings for automatic version numbering.
45
45
  * @param args
46
46
  */
47
- pdmPersistDefinition(args: PersistDcqlQueryArgs): Promise<DcqlQueryItem>
47
+ pdmPersistDefinition(args: PersistDefinitionArgs): Promise<PresentationDefinitionItem>
48
48
  }
49
49
 
50
50
  export type VersionControlMode = 'AutoIncrement' | 'Manual' | 'Overwrite' | 'OverwriteLatest'
51
51
 
52
- export type GetDcqlQueryItemArgs = {
52
+ export type GetDefinitionItemArgs = {
53
53
  itemId: string
54
54
  }
55
55
 
56
- export type HasDefinitionItemArgs = GetDcqlQueryItemArgs
56
+ export type HasDefinitionItemArgs = GetDefinitionItemArgs
57
57
 
58
58
  export type FetchOptions = {
59
59
  showVersionHistory?: boolean
60
60
  }
61
61
 
62
- export type GetDcqlQueryItemsArgs = {
63
- filter?: FindDcqlQueryArgs
62
+ export type GetDefinitionItemsArgs = {
63
+ filter?: FindDefinitionArgs
64
64
  opts?: FetchOptions
65
65
  }
66
66
 
67
- export type HasDcqlQueryItemsArgs = GetDcqlQueryItemsArgs
67
+ export type HasDefinitionItemsArgs = GetDefinitionItemsArgs
68
68
 
69
- export type DeleteDcqlQueryItemArgs = {
69
+ export type DeleteDefinitionItemArgs = {
70
70
  itemId: string
71
71
  }
72
72
 
73
- export type DeleteDcqlQueryItemsArgs = GetDcqlQueryItemsArgs
73
+ export type DeleteDefinitionItemsArgs = GetDefinitionItemsArgs
74
74
 
75
- export type PersistDcqlQueryItem = Omit<NonPersistedDcqlQueryItem, 'version'> & {
75
+ export type PersistPresentationDefinitionItem = Omit<NonPersistedPresentationDefinitionItem, 'definitionId' | 'version'> & {
76
76
  id?: string
77
+ definitionId?: string
77
78
  version?: string
78
79
  }
79
80
 
@@ -82,8 +83,8 @@ export type PersistOptions = {
82
83
  versionIncrementReleaseType?: ReleaseType
83
84
  }
84
85
 
85
- export type PersistDcqlQueryArgs = {
86
- definitionItem: PersistDcqlQueryItem
86
+ export type PersistDefinitionArgs = {
87
+ definitionItem: PersistPresentationDefinitionItem
87
88
  opts?: PersistOptions
88
89
  }
89
90