@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.
- package/dist/index.cjs +1091 -1092
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +25 -2151
- package/dist/index.d.ts +25 -2151
- package/dist/index.js +1084 -1084
- package/dist/index.js.map +1 -1
- package/package.json +5 -8
- package/plugin.schema.json +26 -20
- package/src/agent/PDManager.ts +89 -107
- package/src/index.ts +2 -4
- package/src/types/IPDManager.ts +18 -17
package/src/agent/PDManager.ts
CHANGED
|
@@ -1,18 +1,22 @@
|
|
|
1
1
|
import { IAgentPlugin } from '@veramo/core'
|
|
2
2
|
import {
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
3
|
+
DeleteDefinitionItemArgs,
|
|
4
|
+
DeleteDefinitionItemsArgs,
|
|
5
|
+
GetDefinitionItemArgs,
|
|
6
|
+
GetDefinitionItemsArgs,
|
|
7
7
|
HasDefinitionItemArgs,
|
|
8
|
-
|
|
8
|
+
HasDefinitionItemsArgs,
|
|
9
9
|
IPDManager,
|
|
10
|
-
|
|
10
|
+
PersistDefinitionArgs,
|
|
11
11
|
schema,
|
|
12
12
|
} from '../index'
|
|
13
|
-
import {
|
|
14
|
-
|
|
15
|
-
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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.
|
|
77
|
-
acc[entity.
|
|
80
|
+
if (!acc[entity.definitionId]) {
|
|
81
|
+
acc[entity.definitionId] = []
|
|
78
82
|
}
|
|
79
|
-
acc[entity.
|
|
83
|
+
acc[entity.definitionId].push(entity)
|
|
80
84
|
return acc
|
|
81
85
|
},
|
|
82
|
-
{} as Record<string,
|
|
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:
|
|
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:
|
|
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:
|
|
109
|
-
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
|
|
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
|
-
|
|
121
|
-
|
|
122
|
-
|
|
123
|
-
|
|
123
|
+
const nonPersistedDefinitionItem: NonPersistedPresentationDefinitionItem = {
|
|
124
|
+
...definitionItem,
|
|
125
|
+
definitionId: definitionId,
|
|
126
|
+
version: version ?? '1',
|
|
127
|
+
}
|
|
124
128
|
|
|
125
|
-
|
|
126
|
-
|
|
129
|
+
const existing = await this.store.getDefinitions({ filter: [{ id, definitionId, tenantId, version }] })
|
|
130
|
+
const existingItem = existing[0]
|
|
127
131
|
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
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
|
-
|
|
137
|
+
let latestVersionItem: PresentationDefinitionItem | undefined = trulyLatestVersionItem
|
|
134
138
|
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
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
|
-
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
148
|
-
|
|
149
|
-
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
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:
|
|
164
|
-
definitionItem:
|
|
163
|
+
existingItem: PresentationDefinitionItem | undefined,
|
|
164
|
+
definitionItem: NonPersistedPresentationDefinitionItem,
|
|
165
165
|
version: string | undefined,
|
|
166
|
-
): Promise<
|
|
166
|
+
): Promise<PresentationDefinitionItem> {
|
|
167
167
|
if (existingItem) {
|
|
168
|
-
existingItem.
|
|
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.
|
|
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
|
-
|
|
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:
|
|
187
|
-
definitionItem:
|
|
188
|
-
): Promise<
|
|
182
|
+
latestVersionItem: PresentationDefinitionItem | undefined,
|
|
183
|
+
definitionItem: NonPersistedPresentationDefinitionItem,
|
|
184
|
+
): Promise<PresentationDefinitionItem> {
|
|
189
185
|
if (latestVersionItem) {
|
|
190
|
-
latestVersionItem.
|
|
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.
|
|
190
|
+
latestVersionItem.definitionPayload = definitionItem.definitionPayload
|
|
195
191
|
|
|
196
192
|
return await this.store.updateDefinition(latestVersionItem)
|
|
197
193
|
} else {
|
|
198
|
-
|
|
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:
|
|
208
|
-
definitionItem:
|
|
199
|
+
existingItem: PresentationDefinitionItem | undefined,
|
|
200
|
+
definitionItem: NonPersistedPresentationDefinitionItem,
|
|
209
201
|
tenantId: string | undefined,
|
|
210
202
|
version: string | undefined,
|
|
211
|
-
): Promise<
|
|
203
|
+
): Promise<PresentationDefinitionItem> {
|
|
212
204
|
if (existingItem && !isPresentationDefinitionEqual(existingItem, definitionItem)) {
|
|
213
205
|
throw Error(
|
|
214
|
-
`Cannot update definition ${definitionItem.
|
|
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:
|
|
223
|
-
definitionItem:
|
|
214
|
+
latestVersionItem: PresentationDefinitionItem | undefined,
|
|
215
|
+
definitionItem: NonPersistedPresentationDefinitionItem,
|
|
224
216
|
releaseType: ReleaseType,
|
|
225
|
-
): Promise<
|
|
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,
|
|
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
|
-
|
|
260
|
-
|
|
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
|
-
|
|
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
|
|
10
|
-
export type { ImportDcqlQueryItem } from '@sphereon/ssi-sdk.data-store-types'
|
|
11
|
-
export type { DcqlQuery } from 'dcql'
|
|
9
|
+
export { ReleaseType } from 'semver'
|
package/src/types/IPDManager.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { IAgentContext, IPluginMethodMap } from '@veramo/core'
|
|
2
|
-
import {
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
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:
|
|
47
|
+
pdmPersistDefinition(args: PersistDefinitionArgs): Promise<PresentationDefinitionItem>
|
|
48
48
|
}
|
|
49
49
|
|
|
50
50
|
export type VersionControlMode = 'AutoIncrement' | 'Manual' | 'Overwrite' | 'OverwriteLatest'
|
|
51
51
|
|
|
52
|
-
export type
|
|
52
|
+
export type GetDefinitionItemArgs = {
|
|
53
53
|
itemId: string
|
|
54
54
|
}
|
|
55
55
|
|
|
56
|
-
export type HasDefinitionItemArgs =
|
|
56
|
+
export type HasDefinitionItemArgs = GetDefinitionItemArgs
|
|
57
57
|
|
|
58
58
|
export type FetchOptions = {
|
|
59
59
|
showVersionHistory?: boolean
|
|
60
60
|
}
|
|
61
61
|
|
|
62
|
-
export type
|
|
63
|
-
filter?:
|
|
62
|
+
export type GetDefinitionItemsArgs = {
|
|
63
|
+
filter?: FindDefinitionArgs
|
|
64
64
|
opts?: FetchOptions
|
|
65
65
|
}
|
|
66
66
|
|
|
67
|
-
export type
|
|
67
|
+
export type HasDefinitionItemsArgs = GetDefinitionItemsArgs
|
|
68
68
|
|
|
69
|
-
export type
|
|
69
|
+
export type DeleteDefinitionItemArgs = {
|
|
70
70
|
itemId: string
|
|
71
71
|
}
|
|
72
72
|
|
|
73
|
-
export type
|
|
73
|
+
export type DeleteDefinitionItemsArgs = GetDefinitionItemsArgs
|
|
74
74
|
|
|
75
|
-
export type
|
|
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
|
|
86
|
-
definitionItem:
|
|
86
|
+
export type PersistDefinitionArgs = {
|
|
87
|
+
definitionItem: PersistPresentationDefinitionItem
|
|
87
88
|
opts?: PersistOptions
|
|
88
89
|
}
|
|
89
90
|
|