@cheqd/studio 3.16.0-develop.8 → 3.16.0
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/app.d.ts.map +1 -1
- package/dist/app.js +11 -0
- package/dist/app.js.map +1 -1
- package/dist/controllers/api/accreditation.d.ts +2 -10
- package/dist/controllers/api/accreditation.d.ts.map +1 -1
- package/dist/controllers/api/accreditation.js +110 -369
- package/dist/controllers/api/accreditation.js.map +1 -1
- package/dist/controllers/api/credential.d.ts +1 -1
- package/dist/controllers/api/credential.d.ts.map +1 -1
- package/dist/controllers/api/credential.js +2 -1
- package/dist/controllers/api/credential.js.map +1 -1
- package/dist/controllers/api/received-credential.d.ts +375 -0
- package/dist/controllers/api/received-credential.d.ts.map +1 -0
- package/dist/controllers/api/received-credential.js +650 -0
- package/dist/controllers/api/received-credential.js.map +1 -0
- package/dist/database/entities/issued-credential.entity.d.ts +18 -2
- package/dist/database/entities/issued-credential.entity.d.ts.map +1 -1
- package/dist/database/entities/issued-credential.entity.js +29 -0
- package/dist/database/entities/issued-credential.entity.js.map +1 -1
- package/dist/database/migrations/1766408271347-studio-migrations.d.ts +7 -0
- package/dist/database/migrations/1766408271347-studio-migrations.d.ts.map +1 -0
- package/dist/database/migrations/1766408271347-studio-migrations.js +16 -0
- package/dist/database/migrations/1766408271347-studio-migrations.js.map +1 -0
- package/dist/database/types/types.d.ts.map +1 -1
- package/dist/database/types/types.js +2 -0
- package/dist/database/types/types.js.map +1 -1
- package/dist/middleware/auth/routes/api/credential-auth.d.ts.map +1 -1
- package/dist/middleware/auth/routes/api/credential-auth.js +12 -0
- package/dist/middleware/auth/routes/api/credential-auth.js.map +1 -1
- package/dist/services/api/accreditation.d.ts +17 -2
- package/dist/services/api/accreditation.d.ts.map +1 -1
- package/dist/services/api/accreditation.js +400 -7
- package/dist/services/api/accreditation.js.map +1 -1
- package/dist/services/api/credentials.d.ts.map +1 -1
- package/dist/services/api/credentials.js +38 -6
- package/dist/services/api/credentials.js.map +1 -1
- package/dist/services/api/received-credentials.d.ts +129 -0
- package/dist/services/api/received-credentials.d.ts.map +1 -0
- package/dist/services/api/received-credentials.js +498 -0
- package/dist/services/api/received-credentials.js.map +1 -0
- package/dist/services/identity/abstract.d.ts +4 -0
- package/dist/services/identity/abstract.d.ts.map +1 -1
- package/dist/services/identity/abstract.js +12 -0
- package/dist/services/identity/abstract.js.map +1 -1
- package/dist/services/identity/index.d.ts +22 -0
- package/dist/services/identity/index.d.ts.map +1 -1
- package/dist/services/identity/index.js.map +1 -1
- package/dist/services/identity/providers/studio/agent.d.ts +15 -0
- package/dist/services/identity/providers/studio/agent.d.ts.map +1 -1
- package/dist/services/identity/providers/studio/agent.js +51 -9
- package/dist/services/identity/providers/studio/agent.js.map +1 -1
- package/dist/services/identity/providers/studio/local.d.ts +4 -0
- package/dist/services/identity/providers/studio/local.d.ts.map +1 -1
- package/dist/services/identity/providers/studio/local.js +12 -0
- package/dist/services/identity/providers/studio/local.js.map +1 -1
- package/dist/services/identity/providers/studio/postgres.d.ts +7 -0
- package/dist/services/identity/providers/studio/postgres.d.ts.map +1 -1
- package/dist/services/identity/providers/studio/postgres.js +19 -0
- package/dist/services/identity/providers/studio/postgres.js.map +1 -1
- package/dist/services/track/admin/account-submitter.d.ts.map +1 -1
- package/dist/services/track/admin/account-submitter.js +1 -3
- package/dist/services/track/admin/account-submitter.js.map +1 -1
- package/dist/static/swagger-api.json +526 -1
- package/dist/types/accreditation.d.ts +1 -1
- package/dist/types/accreditation.d.ts.map +1 -1
- package/package.json +4 -4
|
@@ -1,10 +1,252 @@
|
|
|
1
|
-
import { DIDAccreditationTypes } from '../../types/accreditation.js';
|
|
1
|
+
import { AccreditationRequestType, DIDAccreditationTypes, DIDAccreditationPolicyTypes, } from '../../types/accreditation.js';
|
|
2
2
|
import { isCredentialIssuerDidDeactivated } from '../helpers.js';
|
|
3
3
|
import { IdentityServiceStrategySetup } from '../identity/index.js';
|
|
4
4
|
import { StatusCodes } from 'http-status-codes';
|
|
5
5
|
import { parseDidFromDidUrl } from '../../helpers/helpers.js';
|
|
6
|
+
import { v4 } from 'uuid';
|
|
7
|
+
import { CredentialCategory, CredentialConnectors } from '../../types/credential.js';
|
|
8
|
+
import { Credentials } from './credentials.js';
|
|
9
|
+
import NodeCache from 'node-cache';
|
|
10
|
+
import { StatusListType } from '../../types/credential-status.js';
|
|
11
|
+
const ACCREDITATION_RESOLVE_CACHE_TTL_MS = 30_000;
|
|
12
|
+
const ACCREDITATION_RESOLVE_CACHE_MAX_ENTRIES = 200;
|
|
13
|
+
const ACCREDITATION_RESOLVE_CONCURRENCY = 8;
|
|
14
|
+
function buildCacheKey(url, customerId) {
|
|
15
|
+
return `${customerId ?? 'anonymous'}::${url}`;
|
|
16
|
+
}
|
|
17
|
+
const accreditationResolveCache = new NodeCache({
|
|
18
|
+
stdTTL: ACCREDITATION_RESOLVE_CACHE_TTL_MS / 1000,
|
|
19
|
+
checkperiod: 0,
|
|
20
|
+
useClones: false,
|
|
21
|
+
deleteOnExpire: true,
|
|
22
|
+
maxKeys: ACCREDITATION_RESOLVE_CACHE_MAX_ENTRIES,
|
|
23
|
+
});
|
|
24
|
+
const inFlightAccreditations = new Map();
|
|
25
|
+
function getCachedAccreditation(key) {
|
|
26
|
+
return accreditationResolveCache.get(key) ?? null;
|
|
27
|
+
}
|
|
28
|
+
function setCachedAccreditation(key, value) {
|
|
29
|
+
accreditationResolveCache.set(key, value);
|
|
30
|
+
}
|
|
6
31
|
export class AccreditationService {
|
|
7
32
|
static instance = new AccreditationService();
|
|
33
|
+
async issue_accreditation(accreditationType, issuerDid, subjectDid, schemas, body, customer) {
|
|
34
|
+
// Get strategy e.g. postgres or local
|
|
35
|
+
const identityServiceStrategySetup = new IdentityServiceStrategySetup();
|
|
36
|
+
// Handles string input instead of an array
|
|
37
|
+
let { type, '@context': context, parentAccreditation, rootAuthorization, trustFramework, trustFrameworkId, attributes, accreditationName, format, credentialStatus, } = body;
|
|
38
|
+
if (typeof type === 'string') {
|
|
39
|
+
type = [type];
|
|
40
|
+
}
|
|
41
|
+
if (typeof context === 'string') {
|
|
42
|
+
context = [context];
|
|
43
|
+
}
|
|
44
|
+
try {
|
|
45
|
+
// Validate issuer and subject DIDs in parallel only for authorize
|
|
46
|
+
// For attest, accredit they are validated in verify_accreditation
|
|
47
|
+
const [issuerDidRes, subjectDidRes] = await Promise.all([
|
|
48
|
+
identityServiceStrategySetup.agent.resolveDid(issuerDid),
|
|
49
|
+
identityServiceStrategySetup.agent.resolveDid(subjectDid),
|
|
50
|
+
]);
|
|
51
|
+
// Validate issuer DID
|
|
52
|
+
if (!issuerDidRes?.didDocument) {
|
|
53
|
+
return {
|
|
54
|
+
success: false,
|
|
55
|
+
status: StatusCodes.BAD_REQUEST,
|
|
56
|
+
error: `DID ${issuerDid} is not resolved because of error from resolver: ${issuerDidRes.didResolutionMetadata.error}.`,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
if (issuerDidRes.didDocumentMetadata.deactivated) {
|
|
60
|
+
return {
|
|
61
|
+
success: false,
|
|
62
|
+
status: StatusCodes.BAD_REQUEST,
|
|
63
|
+
error: `${issuerDid} is deactivated`,
|
|
64
|
+
};
|
|
65
|
+
}
|
|
66
|
+
// Validate subject DID
|
|
67
|
+
if (!subjectDidRes?.didDocument) {
|
|
68
|
+
return {
|
|
69
|
+
success: false,
|
|
70
|
+
status: StatusCodes.BAD_REQUEST,
|
|
71
|
+
error: `DID ${subjectDid} is not resolved because of error from resolver: ${subjectDidRes.didResolutionMetadata.error}.`,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
if (subjectDidRes.didDocumentMetadata.deactivated) {
|
|
75
|
+
return {
|
|
76
|
+
success: false,
|
|
77
|
+
status: StatusCodes.BAD_REQUEST,
|
|
78
|
+
error: `${subjectDid} is deactivated`,
|
|
79
|
+
};
|
|
80
|
+
}
|
|
81
|
+
const resourceId = v4();
|
|
82
|
+
const accreditedFor = schemas.map(({ url, types }) => ({
|
|
83
|
+
schemaId: url,
|
|
84
|
+
types: Array.isArray(types) ? types : [types],
|
|
85
|
+
}));
|
|
86
|
+
// construct credential request
|
|
87
|
+
const credentialRequest = {
|
|
88
|
+
subjectDid,
|
|
89
|
+
attributes: {
|
|
90
|
+
...attributes,
|
|
91
|
+
accreditedFor,
|
|
92
|
+
id: subjectDid,
|
|
93
|
+
},
|
|
94
|
+
issuerDid,
|
|
95
|
+
format: format || 'jwt',
|
|
96
|
+
connector: CredentialConnectors.Resource,
|
|
97
|
+
credentialId: resourceId,
|
|
98
|
+
credentialName: accreditationName,
|
|
99
|
+
credentialStatus,
|
|
100
|
+
category: CredentialCategory.ACCREDITATION,
|
|
101
|
+
};
|
|
102
|
+
let resourceType;
|
|
103
|
+
switch (accreditationType) {
|
|
104
|
+
case AccreditationRequestType.authorize:
|
|
105
|
+
resourceType = DIDAccreditationTypes.VerifiableAuthorizationForTrustChain;
|
|
106
|
+
credentialRequest.type = [...(type || []), resourceType];
|
|
107
|
+
credentialRequest.termsOfUse = {
|
|
108
|
+
type: DIDAccreditationPolicyTypes.Authorize,
|
|
109
|
+
trustFramework,
|
|
110
|
+
trustFrameworkId,
|
|
111
|
+
};
|
|
112
|
+
break;
|
|
113
|
+
case AccreditationRequestType.accredit:
|
|
114
|
+
resourceType = DIDAccreditationTypes.VerifiableAccreditationToAccredit;
|
|
115
|
+
credentialRequest.type = [...(type || []), resourceType];
|
|
116
|
+
credentialRequest.termsOfUse = {
|
|
117
|
+
type: DIDAccreditationPolicyTypes.Accredit,
|
|
118
|
+
parentAccreditation,
|
|
119
|
+
rootAuthorization,
|
|
120
|
+
};
|
|
121
|
+
break;
|
|
122
|
+
case AccreditationRequestType.attest:
|
|
123
|
+
resourceType = DIDAccreditationTypes.VerifiableAccreditationToAttest;
|
|
124
|
+
credentialRequest.type = [...(type || []), resourceType];
|
|
125
|
+
credentialRequest.termsOfUse = {
|
|
126
|
+
type: DIDAccreditationPolicyTypes.Accredit,
|
|
127
|
+
parentAccreditation,
|
|
128
|
+
rootAuthorization,
|
|
129
|
+
};
|
|
130
|
+
break;
|
|
131
|
+
}
|
|
132
|
+
// validate parent and root accreditations
|
|
133
|
+
if (accreditationType === AccreditationRequestType.accredit ||
|
|
134
|
+
accreditationType === AccreditationRequestType.attest) {
|
|
135
|
+
const result = await this.verify_accreditation(issuerDid, parentAccreditation, accreditedFor, true, false, customer, rootAuthorization);
|
|
136
|
+
if (result.success === false) {
|
|
137
|
+
return {
|
|
138
|
+
success: false,
|
|
139
|
+
status: result.status,
|
|
140
|
+
error: `Invalid Request: Root Authorization or parent Accreditation is not valid: ${result.error}`,
|
|
141
|
+
};
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
// issue accreditation
|
|
145
|
+
const accreditation = await Credentials.instance.issue_credential(credentialRequest, customer);
|
|
146
|
+
return {
|
|
147
|
+
success: true,
|
|
148
|
+
status: StatusCodes.OK,
|
|
149
|
+
data: {
|
|
150
|
+
didUrls: [
|
|
151
|
+
`${issuerDid}/resources/${resourceId}`,
|
|
152
|
+
`${issuerDid}?resourceName=${encodeURIComponent(accreditationName)}&resourceType=${resourceType}`,
|
|
153
|
+
],
|
|
154
|
+
accreditation,
|
|
155
|
+
},
|
|
156
|
+
};
|
|
157
|
+
}
|
|
158
|
+
catch (error) {
|
|
159
|
+
return {
|
|
160
|
+
success: false,
|
|
161
|
+
status: StatusCodes.INTERNAL_SERVER_ERROR,
|
|
162
|
+
error: `Internal error: ${error?.message || error}`,
|
|
163
|
+
};
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
async revoke_accreditation(didUrl, publish, symmetricKey, customer) {
|
|
167
|
+
const identityServiceStrategySetup = new IdentityServiceStrategySetup(customer.customerId);
|
|
168
|
+
try {
|
|
169
|
+
const res = await identityServiceStrategySetup.agent.resolve(didUrl);
|
|
170
|
+
const resource = await res.json();
|
|
171
|
+
if (resource.dereferencingMetadata) {
|
|
172
|
+
return {
|
|
173
|
+
success: false,
|
|
174
|
+
status: StatusCodes.NOT_FOUND,
|
|
175
|
+
error: `DID URL ${didUrl} is not found`,
|
|
176
|
+
};
|
|
177
|
+
}
|
|
178
|
+
const accreditation = resource;
|
|
179
|
+
const result = await identityServiceStrategySetup.agent.revokeCredentials(accreditation, StatusListType.Bitstring, publish, customer, symmetricKey);
|
|
180
|
+
return {
|
|
181
|
+
success: true,
|
|
182
|
+
status: StatusCodes.OK,
|
|
183
|
+
data: result,
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
catch (error) {
|
|
187
|
+
return {
|
|
188
|
+
success: false,
|
|
189
|
+
status: StatusCodes.INTERNAL_SERVER_ERROR,
|
|
190
|
+
error: `Internal error: ${error?.message || error}`,
|
|
191
|
+
};
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
async suspend_accreditation(didUrl, publish, symmetricKey, customer) {
|
|
195
|
+
const identityServiceStrategySetup = new IdentityServiceStrategySetup(customer.customerId);
|
|
196
|
+
try {
|
|
197
|
+
const res = await identityServiceStrategySetup.agent.resolve(didUrl);
|
|
198
|
+
const resource = await res.json();
|
|
199
|
+
if (resource.dereferencingMetadata) {
|
|
200
|
+
return {
|
|
201
|
+
success: false,
|
|
202
|
+
status: StatusCodes.NOT_FOUND,
|
|
203
|
+
error: `DID URL ${didUrl} is not found`,
|
|
204
|
+
};
|
|
205
|
+
}
|
|
206
|
+
const accreditation = resource;
|
|
207
|
+
const result = await identityServiceStrategySetup.agent.suspendCredentials(accreditation, StatusListType.Bitstring, publish, customer, symmetricKey);
|
|
208
|
+
return {
|
|
209
|
+
success: true,
|
|
210
|
+
status: StatusCodes.OK,
|
|
211
|
+
data: result,
|
|
212
|
+
};
|
|
213
|
+
}
|
|
214
|
+
catch (error) {
|
|
215
|
+
return {
|
|
216
|
+
success: false,
|
|
217
|
+
status: StatusCodes.INTERNAL_SERVER_ERROR,
|
|
218
|
+
error: `Internal error: ${error?.message || error}`,
|
|
219
|
+
};
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
async reinstate_accreditation(didUrl, publish, symmetricKey, customer) {
|
|
223
|
+
const identityServiceStrategySetup = new IdentityServiceStrategySetup(customer.customerId);
|
|
224
|
+
try {
|
|
225
|
+
const res = await identityServiceStrategySetup.agent.resolve(didUrl);
|
|
226
|
+
const resource = await res.json();
|
|
227
|
+
if (resource.dereferencingMetadata) {
|
|
228
|
+
return {
|
|
229
|
+
success: false,
|
|
230
|
+
status: StatusCodes.NOT_FOUND,
|
|
231
|
+
error: `DID URL ${didUrl} is not found`,
|
|
232
|
+
};
|
|
233
|
+
}
|
|
234
|
+
const accreditation = resource;
|
|
235
|
+
const result = await identityServiceStrategySetup.agent.reinstateCredentials(accreditation, StatusListType.Bitstring, publish, customer, symmetricKey);
|
|
236
|
+
return {
|
|
237
|
+
success: true,
|
|
238
|
+
status: StatusCodes.OK,
|
|
239
|
+
data: result,
|
|
240
|
+
};
|
|
241
|
+
}
|
|
242
|
+
catch (error) {
|
|
243
|
+
return {
|
|
244
|
+
success: false,
|
|
245
|
+
status: StatusCodes.INTERNAL_SERVER_ERROR,
|
|
246
|
+
error: `Internal error: ${error?.message || error}`,
|
|
247
|
+
};
|
|
248
|
+
}
|
|
249
|
+
}
|
|
8
250
|
async verify_accreditation(subjectDid, didUrl, accreditedFor = [], verifyStatus, allowDeactivatedDid, customer, rootAuthorization, policies) {
|
|
9
251
|
// Get strategy e.g. postgres or local
|
|
10
252
|
const identityServiceStrategySetup = new IdentityServiceStrategySetup();
|
|
@@ -14,8 +256,20 @@ export class AccreditationService {
|
|
|
14
256
|
let accreditorDids = [];
|
|
15
257
|
let deactivatedDidsCheckPromises = [];
|
|
16
258
|
while (true) {
|
|
17
|
-
const
|
|
18
|
-
const
|
|
259
|
+
const cacheKey = buildCacheKey(accreditationUrl, customer?.customerId);
|
|
260
|
+
const cached = getCachedAccreditation(cacheKey);
|
|
261
|
+
let result;
|
|
262
|
+
if (cached) {
|
|
263
|
+
result = cached;
|
|
264
|
+
}
|
|
265
|
+
else {
|
|
266
|
+
const res = await identityServiceStrategySetup.agent.resolve(accreditationUrl);
|
|
267
|
+
result = await res.json();
|
|
268
|
+
// Cache successful dereferenced results (skip caching not-found / dereferencing metadata)
|
|
269
|
+
if (!result?.dereferencingMetadata) {
|
|
270
|
+
setCachedAccreditation(cacheKey, result);
|
|
271
|
+
}
|
|
272
|
+
}
|
|
19
273
|
if (result.dereferencingMetadata) {
|
|
20
274
|
return {
|
|
21
275
|
success: false,
|
|
@@ -27,7 +281,6 @@ export class AccreditationService {
|
|
|
27
281
|
// Create credential object
|
|
28
282
|
const accreditation = result;
|
|
29
283
|
const accreditorDid = typeof accreditation.issuer === 'string' ? accreditation.issuer : accreditation.issuer.id;
|
|
30
|
-
accreditorDids.push(accreditorDid);
|
|
31
284
|
// Check if issuer DID is deactivated
|
|
32
285
|
if (!allowDeactivatedDid) {
|
|
33
286
|
deactivatedDidsCheckPromises.push(isCredentialIssuerDidDeactivated(accreditation));
|
|
@@ -41,9 +294,6 @@ export class AccreditationService {
|
|
|
41
294
|
error: `Error on verifying accreditation ${accreditationUrl}: Expected accreditation to be linked to subject DID ${accreditedSubject}, but found it linked to DID ${accreditation.credentialSubject.id} instead.`,
|
|
42
295
|
};
|
|
43
296
|
}
|
|
44
|
-
if (verifyStatus && !accreditation.credentialStatus) {
|
|
45
|
-
verifyStatus = false;
|
|
46
|
-
}
|
|
47
297
|
// Check if the accreditor has permission for the schema provided
|
|
48
298
|
if (!accreditedFor.every((schema) => accreditation.credentialSubject.accreditedFor.some((accredited) => schema.types.every((value) => (accredited.types || []).includes(value)) &&
|
|
49
299
|
accredited.schemaId === schema.schemaId))) {
|
|
@@ -69,6 +319,14 @@ export class AccreditationService {
|
|
|
69
319
|
error: `Error on verifying accreditation ${accreditationUrl}: ${verifyResult.error.message}`,
|
|
70
320
|
};
|
|
71
321
|
}
|
|
322
|
+
if (verifyStatus && verifyResult.valid === false) {
|
|
323
|
+
return {
|
|
324
|
+
success: false,
|
|
325
|
+
status: StatusCodes.OK,
|
|
326
|
+
data: initialVerifyResult,
|
|
327
|
+
error: `Error on verifying accreditation ${accreditationUrl}: ${accreditorDid} is ${verifyResult.message} in the trust chain`,
|
|
328
|
+
};
|
|
329
|
+
}
|
|
72
330
|
if (!Array.isArray(accreditation.type)) {
|
|
73
331
|
return {
|
|
74
332
|
success: false,
|
|
@@ -151,5 +409,140 @@ export class AccreditationService {
|
|
|
151
409
|
}
|
|
152
410
|
}
|
|
153
411
|
}
|
|
412
|
+
async list_accreditations(customer, accreditationType, network, did, page, limit) {
|
|
413
|
+
const identityServiceStrategySetup = new IdentityServiceStrategySetup(customer.customerId);
|
|
414
|
+
let resourceType;
|
|
415
|
+
switch (accreditationType) {
|
|
416
|
+
case AccreditationRequestType.authorize:
|
|
417
|
+
resourceType = DIDAccreditationTypes.VerifiableAuthorizationForTrustChain;
|
|
418
|
+
break;
|
|
419
|
+
case AccreditationRequestType.accredit:
|
|
420
|
+
resourceType = DIDAccreditationTypes.VerifiableAccreditationToAccredit;
|
|
421
|
+
break;
|
|
422
|
+
case AccreditationRequestType.attest:
|
|
423
|
+
resourceType = DIDAccreditationTypes.VerifiableAccreditationToAttest;
|
|
424
|
+
break;
|
|
425
|
+
default:
|
|
426
|
+
return {
|
|
427
|
+
success: false,
|
|
428
|
+
status: StatusCodes.BAD_REQUEST,
|
|
429
|
+
error: `Invalid accreditationType: ${accreditationType}. Must be one of: authorize, accredit, attest.`,
|
|
430
|
+
};
|
|
431
|
+
}
|
|
432
|
+
try {
|
|
433
|
+
// Fetch resources of accreditation resourceType associated with the account
|
|
434
|
+
const { resources } = await identityServiceStrategySetup.agent.findLatestResourcesVersionsByType(resourceType, customer, network, did, page, limit);
|
|
435
|
+
// Build resource URLs for resolution
|
|
436
|
+
const resourceUrls = resources.map((item) => `${item.did}/resources/${item.resourceId}`);
|
|
437
|
+
// No resources to resolve, return early
|
|
438
|
+
if (resourceUrls.length === 0) {
|
|
439
|
+
return {
|
|
440
|
+
success: true,
|
|
441
|
+
status: StatusCodes.OK,
|
|
442
|
+
data: {
|
|
443
|
+
total: 0,
|
|
444
|
+
accreditations: [],
|
|
445
|
+
},
|
|
446
|
+
};
|
|
447
|
+
}
|
|
448
|
+
// 1. Fetch all tracking records from the issued credentials table
|
|
449
|
+
const { credentials: trackingRecords } = await Credentials.instance.list(customer, {
|
|
450
|
+
category: CredentialCategory.ACCREDITATION,
|
|
451
|
+
providerCredentialId: resources.map((item) => item.resourceId),
|
|
452
|
+
});
|
|
453
|
+
// 2. OPTIMIZATION: Create a Map for O(1) tracking record lookup by providerCredentialId
|
|
454
|
+
const trackingMap = new Map();
|
|
455
|
+
for (const record of trackingRecords) {
|
|
456
|
+
trackingMap.set(record.providerCredentialId, record);
|
|
457
|
+
}
|
|
458
|
+
const resolveAccreditationWithCache = async (url) => {
|
|
459
|
+
const cacheKey = buildCacheKey(url, customer?.customerId);
|
|
460
|
+
const cached = getCachedAccreditation(cacheKey);
|
|
461
|
+
if (cached) {
|
|
462
|
+
return cached;
|
|
463
|
+
}
|
|
464
|
+
const inFlight = inFlightAccreditations.get(cacheKey);
|
|
465
|
+
if (inFlight) {
|
|
466
|
+
return inFlight;
|
|
467
|
+
}
|
|
468
|
+
const resolverPromise = (async () => {
|
|
469
|
+
try {
|
|
470
|
+
const res = await identityServiceStrategySetup.agent.resolve(url, true);
|
|
471
|
+
const credential = await res.json();
|
|
472
|
+
// Skip if the credential doesn't have contentStream
|
|
473
|
+
if (!credential.contentStream) {
|
|
474
|
+
return null;
|
|
475
|
+
}
|
|
476
|
+
const resourceId = credential.contentMetadata.resourceId;
|
|
477
|
+
const trackingRecord = trackingMap.get(resourceId);
|
|
478
|
+
if (trackingRecord) {
|
|
479
|
+
const { issuedCredentialId, providerId, providerCredentialId, status, statusUpdatedAt } = trackingRecord;
|
|
480
|
+
// Merge tracking metadata with credential
|
|
481
|
+
const accreditation = {
|
|
482
|
+
...credential.contentStream,
|
|
483
|
+
metadata: {
|
|
484
|
+
issuedCredentialId,
|
|
485
|
+
providerId,
|
|
486
|
+
providerCredentialId,
|
|
487
|
+
status,
|
|
488
|
+
statusUpdatedAt,
|
|
489
|
+
},
|
|
490
|
+
};
|
|
491
|
+
setCachedAccreditation(cacheKey, accreditation);
|
|
492
|
+
return accreditation;
|
|
493
|
+
}
|
|
494
|
+
else {
|
|
495
|
+
// No tracking record, return just the credential (legacy)
|
|
496
|
+
setCachedAccreditation(cacheKey, credential.contentStream);
|
|
497
|
+
return credential.contentStream;
|
|
498
|
+
}
|
|
499
|
+
}
|
|
500
|
+
catch (error) {
|
|
501
|
+
console.error(`Failed to process accreditation for URL: ${url}`, error);
|
|
502
|
+
return null;
|
|
503
|
+
}
|
|
504
|
+
finally {
|
|
505
|
+
inFlightAccreditations.delete(cacheKey);
|
|
506
|
+
}
|
|
507
|
+
})();
|
|
508
|
+
inFlightAccreditations.set(cacheKey, resolverPromise);
|
|
509
|
+
return resolverPromise;
|
|
510
|
+
};
|
|
511
|
+
// 3. Resolve resources and enhance with tracking metadata with bounded concurrency
|
|
512
|
+
const resolvedAccreditations = new Array(resourceUrls.length);
|
|
513
|
+
let currentIndex = 0;
|
|
514
|
+
const workers = Array.from({ length: Math.min(ACCREDITATION_RESOLVE_CONCURRENCY, resourceUrls.length) }, async () => {
|
|
515
|
+
// eslint-disable-next-line no-constant-condition
|
|
516
|
+
while (true) {
|
|
517
|
+
const index = currentIndex++;
|
|
518
|
+
if (index >= resourceUrls.length) {
|
|
519
|
+
break;
|
|
520
|
+
}
|
|
521
|
+
const accreditation = await resolveAccreditationWithCache(resourceUrls[index]);
|
|
522
|
+
if (accreditation) {
|
|
523
|
+
resolvedAccreditations[index] = accreditation;
|
|
524
|
+
}
|
|
525
|
+
}
|
|
526
|
+
});
|
|
527
|
+
// 4. Wait for all resolutions to complete and filter out any failed/skipped ones (null)
|
|
528
|
+
await Promise.all(workers);
|
|
529
|
+
const accreditations = resolvedAccreditations.filter(Boolean);
|
|
530
|
+
return {
|
|
531
|
+
success: true,
|
|
532
|
+
status: StatusCodes.OK,
|
|
533
|
+
data: {
|
|
534
|
+
total: accreditations.length,
|
|
535
|
+
accreditations: accreditations,
|
|
536
|
+
},
|
|
537
|
+
};
|
|
538
|
+
}
|
|
539
|
+
catch (error) {
|
|
540
|
+
return {
|
|
541
|
+
success: false,
|
|
542
|
+
status: StatusCodes.INTERNAL_SERVER_ERROR,
|
|
543
|
+
error: `Internal error: ${error?.message || error}`,
|
|
544
|
+
};
|
|
545
|
+
}
|
|
546
|
+
}
|
|
154
547
|
}
|
|
155
548
|
//# sourceMappingURL=accreditation.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"accreditation.js","sourceRoot":"","sources":["../../../src/services/api/accreditation.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"accreditation.js","sourceRoot":"","sources":["../../../src/services/api/accreditation.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/services/api/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE3F,OAAO,EAGN,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,MAAM,2BAA2B,CAAC;AAInC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAKjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AAiBzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAM5D,qBAAa,WAAW;IACvB,OAAc,QAAQ,cAAqB;IACpC,UAAU,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC/C,wBAAwB,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAC;;IAO5D,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"credentials.d.ts","sourceRoot":"","sources":["../../../src/services/api/credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAqB,aAAa,EAAE,oBAAoB,EAAE,MAAM,cAAc,CAAC;AAE3F,OAAO,EAGN,0BAA0B,EAC1B,6BAA6B,EAC7B,wBAAwB,EACxB,4BAA4B,EAC5B,KAAK,iBAAiB,EACtB,MAAM,2BAA2B,CAAC;AAInC,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAKjF,OAAO,EAAE,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAErC,OAAO,EAAE,oBAAoB,EAAE,MAAM,mDAAmD,CAAC;AAiBzF,OAAO,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AAM5D,qBAAa,WAAW;IACvB,OAAc,QAAQ,cAAqB;IACpC,UAAU,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;IAC/C,wBAAwB,EAAE,UAAU,CAAC,oBAAoB,CAAC,CAAC;;IAO5D,gBAAgB,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC;IAwQ3G;;;;OAIG;YACW,kBAAkB;IA6IhC;;OAEG;IACG,IAAI,CACT,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,4BAAiC,GACxC,OAAO,CAAC;QAAE,WAAW,EAAE,wBAAwB,EAAE,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAkEtE;;OAEG;IACG,GAAG,CACR,EAAE,EAAE,MAAM,EACV,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,0BAA+B,GACtC,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAiE3C;;OAEG;IACG,MAAM,CAAC,QAAQ,EAAE,cAAc,EAAE,OAAO,EAAE,6BAA6B,GAAG,OAAO,CAAC,sBAAsB,CAAC;IAmC/G;;OAEG;IACG,YAAY,CAAC,kBAAkB,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,OAAO,CAAC;IAe1G;;OAEG;IACG,MAAM,CACX,kBAAkB,EAAE,MAAM,EAC1B,UAAU,EAAE,OAAO,CAAC,IAAI,CAAC,sBAAsB,EAAE,sBAAsB,GAAG,QAAQ,GAAG,UAAU,CAAC,CAAC,EACjG,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC,wBAAwB,GAAG,IAAI,CAAC;IAgD3C;;OAEG;IACG,KAAK,CAAC,EAAE,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,sBAAsB,GAAG,IAAI,CAAC;IAkBzF;;OAEG;IACH,OAAO,CAAC,UAAU;IAyClB;;OAEG;YACW,sBAAsB;IA2EpC;;OAEG;YACW,2BAA2B;IAoCnC,iBAAiB,CACtB,UAAU,EAAE,oBAAoB,GAAG,MAAM,EACzC,mBAAmB,EAAE,mBAAmB,EACxC,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC,aAAa,CAAC;IAoDZ,KAAK,CAAC,QAAQ,EAAE,cAAc,EAAE,KAAK,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;CAQ3E"}
|
|
@@ -86,6 +86,8 @@ export class Credentials {
|
|
|
86
86
|
let verifiableCredential;
|
|
87
87
|
let providerCredentialId;
|
|
88
88
|
let credentialMetadata = {};
|
|
89
|
+
let isSubjectInDatabase = false;
|
|
90
|
+
let veramoHash;
|
|
89
91
|
switch (providerId || connector) {
|
|
90
92
|
case CredentialConnectors.Dock: {
|
|
91
93
|
const dock = new DockIdentityService();
|
|
@@ -112,7 +114,8 @@ export class Credentials {
|
|
|
112
114
|
case CredentialConnectors.Studio:
|
|
113
115
|
case CredentialConnectors.Verida:
|
|
114
116
|
default: {
|
|
115
|
-
const
|
|
117
|
+
const studioService = new IdentityServiceStrategySetup(customer.customerId);
|
|
118
|
+
const verifiable_credential = await studioService.agent.createCredential(credential, format, statusOptions, customer);
|
|
116
119
|
const isVeridaDid = new VeridaDIDValidator().validate(subjectDid);
|
|
117
120
|
let sendCredentialResponse;
|
|
118
121
|
if (ENABLE_VERIDA_CONNECTOR === 'true' &&
|
|
@@ -135,7 +138,16 @@ export class Credentials {
|
|
|
135
138
|
else {
|
|
136
139
|
providerCredentialId = verifiable_credential.id;
|
|
137
140
|
}
|
|
138
|
-
|
|
141
|
+
// Check if subject DID exists in Veramo's identifier store
|
|
142
|
+
isSubjectInDatabase = await studioService.agent.didExists(subjectDid, customer);
|
|
143
|
+
// If subject DID is in database, store credential in Veramo's dataStore
|
|
144
|
+
if (isSubjectInDatabase) {
|
|
145
|
+
// Store credential in Veramo's dataStore and get the hash
|
|
146
|
+
veramoHash = await studioService.agent.saveCredential(verifiable_credential, customer);
|
|
147
|
+
// Calculate offer expiration (e.g., 30 days from now)
|
|
148
|
+
const offerExpiresAt = new Date();
|
|
149
|
+
offerExpiresAt.setDate(offerExpiresAt.getDate() + 30);
|
|
150
|
+
}
|
|
139
151
|
credentialMetadata = {
|
|
140
152
|
schema: verifiable_credential.credentialSchema,
|
|
141
153
|
proof: verifiable_credential.proof,
|
|
@@ -144,6 +156,7 @@ export class Credentials {
|
|
|
144
156
|
termsOfUse: additionalData.termsOfUse,
|
|
145
157
|
contexts: [...(context || []), ...VC_CONTEXT],
|
|
146
158
|
};
|
|
159
|
+
verifiableCredential = verifiable_credential;
|
|
147
160
|
break;
|
|
148
161
|
}
|
|
149
162
|
}
|
|
@@ -151,13 +164,21 @@ export class Credentials {
|
|
|
151
164
|
const credentialType = Array.isArray(verifiableCredential.type)
|
|
152
165
|
? verifiableCredential.type
|
|
153
166
|
: [verifiableCredential.type || 'VerifiableCredential'];
|
|
167
|
+
// Determine status based on whether subject DID is in database
|
|
168
|
+
const currentStatus = isSubjectInDatabase ? 'offered' : 'issued';
|
|
169
|
+
// Calculate offer expiration if credential is offered
|
|
170
|
+
let offerExpiresAt;
|
|
171
|
+
if (isSubjectInDatabase) {
|
|
172
|
+
offerExpiresAt = new Date();
|
|
173
|
+
offerExpiresAt.setDate(offerExpiresAt.getDate() + 30); // 30 days from now
|
|
174
|
+
}
|
|
154
175
|
await this.update(trackingRecord.issuedCredentialId, {
|
|
155
176
|
providerCredentialId: providerCredentialId,
|
|
156
177
|
metadata: credentialMetadata,
|
|
157
|
-
status:
|
|
178
|
+
status: currentStatus,
|
|
158
179
|
}, customer);
|
|
159
|
-
//
|
|
160
|
-
|
|
180
|
+
// Build update payload for fields not covered by the update() method
|
|
181
|
+
const updatePayload = {
|
|
161
182
|
type: credentialType,
|
|
162
183
|
issuedAt: verifiableCredential.issuanceDate
|
|
163
184
|
? new Date(verifiableCredential.issuanceDate)
|
|
@@ -166,7 +187,18 @@ export class Credentials {
|
|
|
166
187
|
? new Date(verifiableCredential.expirationDate)
|
|
167
188
|
: undefined,
|
|
168
189
|
credentialStatus: verifiableCredential.credentialStatus,
|
|
169
|
-
}
|
|
190
|
+
};
|
|
191
|
+
// Add offer-specific fields if credential is offered
|
|
192
|
+
if (isSubjectInDatabase && offerExpiresAt) {
|
|
193
|
+
updatePayload.offerExpiresAt = offerExpiresAt;
|
|
194
|
+
}
|
|
195
|
+
// Set veramoHash if credential was stored in Veramo
|
|
196
|
+
if (veramoHash) {
|
|
197
|
+
// We need to set the FK column directly since we have the hash
|
|
198
|
+
updatePayload.veramoHash = veramoHash;
|
|
199
|
+
}
|
|
200
|
+
// Also update fields not covered by the update() method
|
|
201
|
+
await this.repository.update({ issuedCredentialId: trackingRecord.issuedCredentialId }, updatePayload);
|
|
170
202
|
return verifiableCredential;
|
|
171
203
|
}
|
|
172
204
|
catch (error) {
|