@cheqd/studio 3.16.0-develop.9 → 3.16.1-develop.1
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.js +1 -1
- 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.map +1 -1
- package/dist/services/api/accreditation.js +8 -1
- 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/package.json +4 -4
|
@@ -0,0 +1,650 @@
|
|
|
1
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
2
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
3
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
4
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
5
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
6
|
+
};
|
|
7
|
+
import { StatusCodes } from 'http-status-codes';
|
|
8
|
+
import { check, param, query } from '../validator/index.js';
|
|
9
|
+
import { validate } from '../validator/decorator.js';
|
|
10
|
+
import { ReceivedCredentials } from '../../services/api/received-credentials.js';
|
|
11
|
+
export class ReceivedCredentialController {
|
|
12
|
+
static listOffersValidator = [
|
|
13
|
+
query('holderDid').optional().isDID().withMessage('Invalid holderDid format').bail(),
|
|
14
|
+
query('category')
|
|
15
|
+
.optional()
|
|
16
|
+
.isIn(['credential', 'accreditation'])
|
|
17
|
+
.withMessage('category must be either "credential" or "accreditation"')
|
|
18
|
+
.bail(),
|
|
19
|
+
query('page').optional().isInt({ min: 1 }).withMessage('page must be a positive integer').toInt().bail(),
|
|
20
|
+
query('limit')
|
|
21
|
+
.optional()
|
|
22
|
+
.isInt({ min: 1, max: 100 })
|
|
23
|
+
.withMessage('limit must be between 1 and 100')
|
|
24
|
+
.toInt()
|
|
25
|
+
.bail(),
|
|
26
|
+
];
|
|
27
|
+
static getOfferValidator = [
|
|
28
|
+
param('credentialId')
|
|
29
|
+
.exists()
|
|
30
|
+
.withMessage('credentialId is required')
|
|
31
|
+
.bail()
|
|
32
|
+
.isUUID()
|
|
33
|
+
.withMessage('Invalid credentialId format')
|
|
34
|
+
.bail(),
|
|
35
|
+
query('holderDid')
|
|
36
|
+
.exists()
|
|
37
|
+
.withMessage('holderDid is required')
|
|
38
|
+
.bail()
|
|
39
|
+
.isDID()
|
|
40
|
+
.withMessage('Invalid holderDid format')
|
|
41
|
+
.bail(),
|
|
42
|
+
];
|
|
43
|
+
static acceptOfferValidator = [
|
|
44
|
+
param('credentialId')
|
|
45
|
+
.exists()
|
|
46
|
+
.withMessage('credentialId is required')
|
|
47
|
+
.bail()
|
|
48
|
+
.isUUID()
|
|
49
|
+
.withMessage('Invalid credentialId format')
|
|
50
|
+
.bail(),
|
|
51
|
+
check('holderDid')
|
|
52
|
+
.exists()
|
|
53
|
+
.withMessage('holderDid is required')
|
|
54
|
+
.bail()
|
|
55
|
+
.isDID()
|
|
56
|
+
.withMessage('Invalid holderDid format')
|
|
57
|
+
.bail(),
|
|
58
|
+
check('createPresentation')
|
|
59
|
+
.optional()
|
|
60
|
+
.isBoolean()
|
|
61
|
+
.withMessage('createPresentation must be a boolean')
|
|
62
|
+
.toBoolean()
|
|
63
|
+
.bail(),
|
|
64
|
+
check('presentationDomain').optional().isString().withMessage('presentationDomain must be a string').bail(),
|
|
65
|
+
];
|
|
66
|
+
static rejectOfferValidator = [
|
|
67
|
+
param('credentialId')
|
|
68
|
+
.exists()
|
|
69
|
+
.withMessage('credentialId is required')
|
|
70
|
+
.bail()
|
|
71
|
+
.isUUID()
|
|
72
|
+
.withMessage('Invalid credentialId format')
|
|
73
|
+
.bail(),
|
|
74
|
+
check('holderDid')
|
|
75
|
+
.exists()
|
|
76
|
+
.withMessage('holderDid is required')
|
|
77
|
+
.bail()
|
|
78
|
+
.isDID()
|
|
79
|
+
.withMessage('Invalid holderDid format')
|
|
80
|
+
.bail(),
|
|
81
|
+
];
|
|
82
|
+
static importValidator = [
|
|
83
|
+
check('credential')
|
|
84
|
+
.exists()
|
|
85
|
+
.withMessage('credential is required')
|
|
86
|
+
.bail()
|
|
87
|
+
.custom((value) => {
|
|
88
|
+
// Check if it's a valid object or string
|
|
89
|
+
if (typeof value === 'string') {
|
|
90
|
+
return true; // JWT string
|
|
91
|
+
}
|
|
92
|
+
if (typeof value === 'object' && value !== null) {
|
|
93
|
+
return true; // JSON object
|
|
94
|
+
}
|
|
95
|
+
return false;
|
|
96
|
+
})
|
|
97
|
+
.withMessage('credential must be a valid JSON object or JWT string')
|
|
98
|
+
.bail(),
|
|
99
|
+
check('holderDid')
|
|
100
|
+
.exists()
|
|
101
|
+
.withMessage('holderDid is required')
|
|
102
|
+
.bail()
|
|
103
|
+
.isDID()
|
|
104
|
+
.withMessage('Invalid holderDid format')
|
|
105
|
+
.bail(),
|
|
106
|
+
];
|
|
107
|
+
static listReceivedValidator = [
|
|
108
|
+
query('holderDid').optional().isDID().withMessage('Invalid holderDid format').bail(),
|
|
109
|
+
query('category')
|
|
110
|
+
.optional()
|
|
111
|
+
.isIn(['credential', 'accreditation'])
|
|
112
|
+
.withMessage('category must be either "credential" or "accreditation"')
|
|
113
|
+
.bail(),
|
|
114
|
+
query('page').optional().isInt({ min: 1 }).withMessage('page must be a positive integer').toInt().bail(),
|
|
115
|
+
query('limit')
|
|
116
|
+
.optional()
|
|
117
|
+
.isInt({ min: 1, max: 100 })
|
|
118
|
+
.withMessage('limit must be between 1 and 100')
|
|
119
|
+
.toInt()
|
|
120
|
+
.bail(),
|
|
121
|
+
];
|
|
122
|
+
static getReceivedValidator = [
|
|
123
|
+
check('credentialHash')
|
|
124
|
+
.exists()
|
|
125
|
+
.withMessage('credentialHash is required')
|
|
126
|
+
.bail()
|
|
127
|
+
.isString()
|
|
128
|
+
.withMessage('credentialHash must be a string')
|
|
129
|
+
.bail(),
|
|
130
|
+
];
|
|
131
|
+
/**
|
|
132
|
+
* @openapi
|
|
133
|
+
*
|
|
134
|
+
* /credentials/offers:
|
|
135
|
+
* get:
|
|
136
|
+
* tags: [ Credential Offers ]
|
|
137
|
+
* summary: List pending credential offers
|
|
138
|
+
* description: Retrieves a list of pending credential offers. If holderDid is not provided, returns all offers for all DIDs owned by the customer.
|
|
139
|
+
* parameters:
|
|
140
|
+
* - in: query
|
|
141
|
+
* name: holderDid
|
|
142
|
+
* required: false
|
|
143
|
+
* schema:
|
|
144
|
+
* type: string
|
|
145
|
+
* description: Optional DID of the credential holder. If not provided, returns offers for all customer DIDs.
|
|
146
|
+
* - in: query
|
|
147
|
+
* name: category
|
|
148
|
+
* required: false
|
|
149
|
+
* schema:
|
|
150
|
+
* type: string
|
|
151
|
+
* enum: [credential, accreditation]
|
|
152
|
+
* description: Optional category to filter by credential type
|
|
153
|
+
* - in: query
|
|
154
|
+
* name: page
|
|
155
|
+
* schema:
|
|
156
|
+
* type: integer
|
|
157
|
+
* minimum: 1
|
|
158
|
+
* default: 1
|
|
159
|
+
* description: Page number for pagination
|
|
160
|
+
* - in: query
|
|
161
|
+
* name: limit
|
|
162
|
+
* schema:
|
|
163
|
+
* type: integer
|
|
164
|
+
* minimum: 1
|
|
165
|
+
* maximum: 100
|
|
166
|
+
* default: 10
|
|
167
|
+
* description: Number of results per page
|
|
168
|
+
* responses:
|
|
169
|
+
* 200:
|
|
170
|
+
* description: List of pending credential offers
|
|
171
|
+
* content:
|
|
172
|
+
* application/json:
|
|
173
|
+
* schema:
|
|
174
|
+
* type: object
|
|
175
|
+
* properties:
|
|
176
|
+
* total:
|
|
177
|
+
* type: integer
|
|
178
|
+
* offers:
|
|
179
|
+
* type: array
|
|
180
|
+
* items:
|
|
181
|
+
* $ref: '#/components/schemas/IssuedCredentialResponse'
|
|
182
|
+
* page:
|
|
183
|
+
* type: integer
|
|
184
|
+
* limit:
|
|
185
|
+
* type: integer
|
|
186
|
+
* 400:
|
|
187
|
+
* $ref: '#/components/schemas/InvalidRequest'
|
|
188
|
+
* 401:
|
|
189
|
+
* $ref: '#/components/schemas/UnauthorizedError'
|
|
190
|
+
* 500:
|
|
191
|
+
* $ref: '#/components/schemas/InternalError'
|
|
192
|
+
*/
|
|
193
|
+
async listOffers(request, response) {
|
|
194
|
+
try {
|
|
195
|
+
const { holderDid, category, page, limit } = request.query;
|
|
196
|
+
const customer = response.locals.customer;
|
|
197
|
+
const result = await ReceivedCredentials.instance.listPendingOffers({
|
|
198
|
+
holderDid: holderDid,
|
|
199
|
+
category: category,
|
|
200
|
+
page: page ? Number(page) : undefined,
|
|
201
|
+
limit: limit ? Number(limit) : undefined,
|
|
202
|
+
}, customer);
|
|
203
|
+
return response.status(StatusCodes.OK).json(result);
|
|
204
|
+
}
|
|
205
|
+
catch (error) {
|
|
206
|
+
return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
207
|
+
error: `${error}`,
|
|
208
|
+
});
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
/**
|
|
212
|
+
* @openapi
|
|
213
|
+
*
|
|
214
|
+
* /credentials/offers/{credentialId}:
|
|
215
|
+
* get:
|
|
216
|
+
* tags: [ Credential Offers ]
|
|
217
|
+
* summary: Get credential offer details
|
|
218
|
+
* description: Retrieves detailed information about a specific credential offer
|
|
219
|
+
* parameters:
|
|
220
|
+
* - in: path
|
|
221
|
+
* name: credentialId
|
|
222
|
+
* required: true
|
|
223
|
+
* schema:
|
|
224
|
+
* type: string
|
|
225
|
+
* format: uuid
|
|
226
|
+
* description: ID of the credential offer
|
|
227
|
+
* - in: query
|
|
228
|
+
* name: holderDid
|
|
229
|
+
* required: true
|
|
230
|
+
* schema:
|
|
231
|
+
* type: string
|
|
232
|
+
* description: DID of the credential holder
|
|
233
|
+
* responses:
|
|
234
|
+
* 200:
|
|
235
|
+
* description: Credential offer details
|
|
236
|
+
* content:
|
|
237
|
+
* application/json:
|
|
238
|
+
* schema:
|
|
239
|
+
* $ref: '#/components/schemas/IssuedCredentialResponse'
|
|
240
|
+
* 400:
|
|
241
|
+
* $ref: '#/components/schemas/InvalidRequest'
|
|
242
|
+
* 401:
|
|
243
|
+
* $ref: '#/components/schemas/UnauthorizedError'
|
|
244
|
+
* 404:
|
|
245
|
+
* description: Credential offer not found
|
|
246
|
+
* 500:
|
|
247
|
+
* $ref: '#/components/schemas/InternalError'
|
|
248
|
+
*/
|
|
249
|
+
async getOfferDetails(request, response) {
|
|
250
|
+
try {
|
|
251
|
+
const { credentialId } = request.params;
|
|
252
|
+
const { holderDid } = request.query;
|
|
253
|
+
const customer = response.locals.customer;
|
|
254
|
+
const offer = await ReceivedCredentials.instance.getOfferDetails(credentialId, holderDid, customer);
|
|
255
|
+
return response.status(StatusCodes.OK).json(offer);
|
|
256
|
+
}
|
|
257
|
+
catch (error) {
|
|
258
|
+
const errorMessage = `${error}`;
|
|
259
|
+
if (errorMessage.includes('not found') || errorMessage.includes('expired')) {
|
|
260
|
+
return response.status(StatusCodes.NOT_FOUND).json({
|
|
261
|
+
error: errorMessage,
|
|
262
|
+
});
|
|
263
|
+
}
|
|
264
|
+
return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
265
|
+
error: errorMessage,
|
|
266
|
+
});
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
/**
|
|
270
|
+
* @openapi
|
|
271
|
+
*
|
|
272
|
+
* /credentials/offers/{credentialId}/accept:
|
|
273
|
+
* post:
|
|
274
|
+
* tags: [ Credential Offers ]
|
|
275
|
+
* summary: Accept a credential offer
|
|
276
|
+
* description: Accepts a pending credential offer. The credential is verified and status is updated to issued.
|
|
277
|
+
* parameters:
|
|
278
|
+
* - in: path
|
|
279
|
+
* name: credentialId
|
|
280
|
+
* required: true
|
|
281
|
+
* schema:
|
|
282
|
+
* type: string
|
|
283
|
+
* format: uuid
|
|
284
|
+
* description: ID of the credential offer to accept
|
|
285
|
+
* requestBody:
|
|
286
|
+
* required: true
|
|
287
|
+
* content:
|
|
288
|
+
* application/json:
|
|
289
|
+
* schema:
|
|
290
|
+
* type: object
|
|
291
|
+
* required:
|
|
292
|
+
* - holderDid
|
|
293
|
+
* properties:
|
|
294
|
+
* holderDid:
|
|
295
|
+
* type: string
|
|
296
|
+
* description: DID of the credential holder
|
|
297
|
+
* createPresentation:
|
|
298
|
+
* type: boolean
|
|
299
|
+
* default: false
|
|
300
|
+
* description: Whether to create a verifiable presentation
|
|
301
|
+
* presentationDomain:
|
|
302
|
+
* type: string
|
|
303
|
+
* description: Optional domain for the presentation
|
|
304
|
+
* responses:
|
|
305
|
+
* 200:
|
|
306
|
+
* description: Credential offer accepted successfully
|
|
307
|
+
* content:
|
|
308
|
+
* application/json:
|
|
309
|
+
* schema:
|
|
310
|
+
* type: object
|
|
311
|
+
* properties:
|
|
312
|
+
* success:
|
|
313
|
+
* type: boolean
|
|
314
|
+
* credential:
|
|
315
|
+
* type: object
|
|
316
|
+
* presentation:
|
|
317
|
+
* type: string
|
|
318
|
+
* description: JWT presentation (if createPresentation was true)
|
|
319
|
+
* 400:
|
|
320
|
+
* $ref: '#/components/schemas/InvalidRequest'
|
|
321
|
+
* 401:
|
|
322
|
+
* $ref: '#/components/schemas/UnauthorizedError'
|
|
323
|
+
* 404:
|
|
324
|
+
* description: Credential offer not found
|
|
325
|
+
* 500:
|
|
326
|
+
* $ref: '#/components/schemas/InternalError'
|
|
327
|
+
*/
|
|
328
|
+
async acceptOffer(request, response) {
|
|
329
|
+
try {
|
|
330
|
+
const { credentialId } = request.params;
|
|
331
|
+
const { holderDid, createPresentation, presentationDomain } = request.body;
|
|
332
|
+
const customer = response.locals.customer;
|
|
333
|
+
const result = await ReceivedCredentials.instance.acceptOffer(credentialId, holderDid, customer, {
|
|
334
|
+
createPresentation,
|
|
335
|
+
presentationDomain,
|
|
336
|
+
});
|
|
337
|
+
return response.status(StatusCodes.OK).json(result);
|
|
338
|
+
}
|
|
339
|
+
catch (error) {
|
|
340
|
+
const errorMessage = `${error}`;
|
|
341
|
+
if (errorMessage.includes('not found') || errorMessage.includes('expired')) {
|
|
342
|
+
return response.status(StatusCodes.NOT_FOUND).json({
|
|
343
|
+
error: errorMessage,
|
|
344
|
+
});
|
|
345
|
+
}
|
|
346
|
+
if (errorMessage.includes('Invalid credential') || errorMessage.includes('does not match')) {
|
|
347
|
+
return response.status(StatusCodes.BAD_REQUEST).json({
|
|
348
|
+
error: errorMessage,
|
|
349
|
+
});
|
|
350
|
+
}
|
|
351
|
+
return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
352
|
+
error: errorMessage,
|
|
353
|
+
});
|
|
354
|
+
}
|
|
355
|
+
}
|
|
356
|
+
/**
|
|
357
|
+
* @openapi
|
|
358
|
+
*
|
|
359
|
+
* /credentials/offers/{credentialId}/reject:
|
|
360
|
+
* post:
|
|
361
|
+
* tags: [ Credential Offers ]
|
|
362
|
+
* summary: Reject a credential offer
|
|
363
|
+
* description: Rejects a pending credential offer. The credential is deleted and status is updated to rejected.
|
|
364
|
+
* parameters:
|
|
365
|
+
* - in: path
|
|
366
|
+
* name: credentialId
|
|
367
|
+
* required: true
|
|
368
|
+
* schema:
|
|
369
|
+
* type: string
|
|
370
|
+
* format: uuid
|
|
371
|
+
* description: ID of the credential offer to reject
|
|
372
|
+
* requestBody:
|
|
373
|
+
* required: true
|
|
374
|
+
* content:
|
|
375
|
+
* application/json:
|
|
376
|
+
* schema:
|
|
377
|
+
* type: object
|
|
378
|
+
* required:
|
|
379
|
+
* - holderDid
|
|
380
|
+
* properties:
|
|
381
|
+
* holderDid:
|
|
382
|
+
* type: string
|
|
383
|
+
* description: DID of the credential holder
|
|
384
|
+
* responses:
|
|
385
|
+
* 200:
|
|
386
|
+
* description: Credential offer rejected successfully
|
|
387
|
+
* content:
|
|
388
|
+
* application/json:
|
|
389
|
+
* schema:
|
|
390
|
+
* type: object
|
|
391
|
+
* properties:
|
|
392
|
+
* success:
|
|
393
|
+
* type: boolean
|
|
394
|
+
* message:
|
|
395
|
+
* type: string
|
|
396
|
+
* 400:
|
|
397
|
+
* $ref: '#/components/schemas/InvalidRequest'
|
|
398
|
+
* 401:
|
|
399
|
+
* $ref: '#/components/schemas/UnauthorizedError'
|
|
400
|
+
* 404:
|
|
401
|
+
* description: Credential offer not found
|
|
402
|
+
* 500:
|
|
403
|
+
* $ref: '#/components/schemas/InternalError'
|
|
404
|
+
*/
|
|
405
|
+
async rejectOffer(request, response) {
|
|
406
|
+
try {
|
|
407
|
+
const { credentialId } = request.params;
|
|
408
|
+
const { holderDid } = request.body;
|
|
409
|
+
const customer = response.locals.customer;
|
|
410
|
+
const result = await ReceivedCredentials.instance.rejectOffer(credentialId, holderDid, customer);
|
|
411
|
+
return response.status(StatusCodes.OK).json(result);
|
|
412
|
+
}
|
|
413
|
+
catch (error) {
|
|
414
|
+
const errorMessage = `${error}`;
|
|
415
|
+
if (errorMessage.includes('not found') || errorMessage.includes('expired')) {
|
|
416
|
+
return response.status(StatusCodes.NOT_FOUND).json({
|
|
417
|
+
error: errorMessage,
|
|
418
|
+
});
|
|
419
|
+
}
|
|
420
|
+
return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
421
|
+
error: errorMessage,
|
|
422
|
+
});
|
|
423
|
+
}
|
|
424
|
+
}
|
|
425
|
+
/**
|
|
426
|
+
* @openapi
|
|
427
|
+
*
|
|
428
|
+
* /credentials/import:
|
|
429
|
+
* post:
|
|
430
|
+
* tags: [ Verifiable Credentials ]
|
|
431
|
+
* summary: Import an externally issued credential
|
|
432
|
+
* description: Imports a credential issued by a third party (not in Studio) and stores it in the holder's dataStore
|
|
433
|
+
* requestBody:
|
|
434
|
+
* required: true
|
|
435
|
+
* content:
|
|
436
|
+
* application/json:
|
|
437
|
+
* schema:
|
|
438
|
+
* type: object
|
|
439
|
+
* required:
|
|
440
|
+
* - credential
|
|
441
|
+
* - holderDid
|
|
442
|
+
* properties:
|
|
443
|
+
* credential:
|
|
444
|
+
* oneOf:
|
|
445
|
+
* - type: object
|
|
446
|
+
* description: Verifiable credential as JSON object
|
|
447
|
+
* - type: string
|
|
448
|
+
* description: Verifiable credential as JWT string
|
|
449
|
+
* holderDid:
|
|
450
|
+
* type: string
|
|
451
|
+
* description: DID of the credential holder
|
|
452
|
+
* responses:
|
|
453
|
+
* 200:
|
|
454
|
+
* description: Credential imported successfully
|
|
455
|
+
* content:
|
|
456
|
+
* application/json:
|
|
457
|
+
* schema:
|
|
458
|
+
* type: object
|
|
459
|
+
* properties:
|
|
460
|
+
* success:
|
|
461
|
+
* type: boolean
|
|
462
|
+
* credentialHash:
|
|
463
|
+
* type: string
|
|
464
|
+
* description: Hash of the stored credential
|
|
465
|
+
* credential:
|
|
466
|
+
* type: object
|
|
467
|
+
* description: The imported credential
|
|
468
|
+
* 400:
|
|
469
|
+
* $ref: '#/components/schemas/InvalidRequest'
|
|
470
|
+
* 401:
|
|
471
|
+
* $ref: '#/components/schemas/UnauthorizedError'
|
|
472
|
+
* 500:
|
|
473
|
+
* $ref: '#/components/schemas/InternalError'
|
|
474
|
+
*/
|
|
475
|
+
async importCredential(request, response) {
|
|
476
|
+
try {
|
|
477
|
+
const { credential, holderDid } = request.body;
|
|
478
|
+
const customer = response.locals.customer;
|
|
479
|
+
const result = await ReceivedCredentials.instance.importCredential(credential, customer, holderDid);
|
|
480
|
+
return response.status(StatusCodes.OK).json(result);
|
|
481
|
+
}
|
|
482
|
+
catch (error) {
|
|
483
|
+
const errorMessage = `${error}`;
|
|
484
|
+
if (errorMessage.includes('Invalid credential') ||
|
|
485
|
+
errorMessage.includes('does not match') ||
|
|
486
|
+
errorMessage.includes('does not exist') ||
|
|
487
|
+
errorMessage.includes('does not have a valid')) {
|
|
488
|
+
return response.status(StatusCodes.BAD_REQUEST).json({
|
|
489
|
+
error: errorMessage,
|
|
490
|
+
});
|
|
491
|
+
}
|
|
492
|
+
return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
493
|
+
error: errorMessage,
|
|
494
|
+
});
|
|
495
|
+
}
|
|
496
|
+
}
|
|
497
|
+
/**
|
|
498
|
+
* @openapi
|
|
499
|
+
*
|
|
500
|
+
* /credentials/received:
|
|
501
|
+
* get:
|
|
502
|
+
* tags: [ Verifiable Credentials ]
|
|
503
|
+
* summary: List received credentials
|
|
504
|
+
* description: Retrieves all credentials stored in the holder's dataStore (accepted offers + imported credentials)
|
|
505
|
+
* parameters:
|
|
506
|
+
* - in: query
|
|
507
|
+
* name: holderDid
|
|
508
|
+
* schema:
|
|
509
|
+
* type: string
|
|
510
|
+
* description: Optional DID to filter credentials by subject
|
|
511
|
+
* - in: query
|
|
512
|
+
* name: category
|
|
513
|
+
* required: false
|
|
514
|
+
* schema:
|
|
515
|
+
* type: string
|
|
516
|
+
* enum: [credential, accreditation]
|
|
517
|
+
* description: Optional category to filter by credential type. Note that imported credentials without IssuedCredentialEntity will be excluded when filtering by category.
|
|
518
|
+
* - in: query
|
|
519
|
+
* name: page
|
|
520
|
+
* schema:
|
|
521
|
+
* type: integer
|
|
522
|
+
* minimum: 1
|
|
523
|
+
* default: 1
|
|
524
|
+
* description: Page number for pagination
|
|
525
|
+
* - in: query
|
|
526
|
+
* name: limit
|
|
527
|
+
* schema:
|
|
528
|
+
* type: integer
|
|
529
|
+
* minimum: 1
|
|
530
|
+
* maximum: 100
|
|
531
|
+
* default: 10
|
|
532
|
+
* description: Number of results per page
|
|
533
|
+
* responses:
|
|
534
|
+
* 200:
|
|
535
|
+
* description: List of received credentials
|
|
536
|
+
* content:
|
|
537
|
+
* application/json:
|
|
538
|
+
* schema:
|
|
539
|
+
* type: object
|
|
540
|
+
* properties:
|
|
541
|
+
* total:
|
|
542
|
+
* type: integer
|
|
543
|
+
* description: Total number of credentials
|
|
544
|
+
* credentials:
|
|
545
|
+
* type: array
|
|
546
|
+
* items:
|
|
547
|
+
* type: object
|
|
548
|
+
* properties:
|
|
549
|
+
* hash:
|
|
550
|
+
* type: string
|
|
551
|
+
* description: Hash of the credential
|
|
552
|
+
* credential:
|
|
553
|
+
* type: object
|
|
554
|
+
* description: Verifiable Credential
|
|
555
|
+
* page:
|
|
556
|
+
* type: integer
|
|
557
|
+
* description: Current page number
|
|
558
|
+
* limit:
|
|
559
|
+
* type: integer
|
|
560
|
+
* description: Number of results per page
|
|
561
|
+
* 401:
|
|
562
|
+
* $ref: '#/components/schemas/UnauthorizedError'
|
|
563
|
+
* 500:
|
|
564
|
+
* $ref: '#/components/schemas/InternalError'
|
|
565
|
+
*/
|
|
566
|
+
async listReceivedCredentials(request, response) {
|
|
567
|
+
try {
|
|
568
|
+
const { holderDid, category, page, limit } = request.query;
|
|
569
|
+
const customer = response.locals.customer;
|
|
570
|
+
const result = await ReceivedCredentials.instance.listReceivedCredentials(customer, holderDid, category, page ? Number(page) : undefined, limit ? Number(limit) : undefined);
|
|
571
|
+
return response.status(StatusCodes.OK).json(result);
|
|
572
|
+
}
|
|
573
|
+
catch (error) {
|
|
574
|
+
return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
575
|
+
error: `${error}`,
|
|
576
|
+
});
|
|
577
|
+
}
|
|
578
|
+
}
|
|
579
|
+
/**
|
|
580
|
+
* @openapi
|
|
581
|
+
*
|
|
582
|
+
* /credentials/received/{credentialHash}:
|
|
583
|
+
* get:
|
|
584
|
+
* tags: [ Verifiable Credentials ]
|
|
585
|
+
* summary: Get a specific received credential
|
|
586
|
+
* description: Retrieves a specific credential from the holder's dataStore by its hash
|
|
587
|
+
* parameters:
|
|
588
|
+
* - in: path
|
|
589
|
+
* name: credentialHash
|
|
590
|
+
* required: true
|
|
591
|
+
* schema:
|
|
592
|
+
* type: string
|
|
593
|
+
* description: Hash of the credential
|
|
594
|
+
* responses:
|
|
595
|
+
* 200:
|
|
596
|
+
* description: Received credential
|
|
597
|
+
* content:
|
|
598
|
+
* application/json:
|
|
599
|
+
* schema:
|
|
600
|
+
* type: object
|
|
601
|
+
* description: Verifiable Credential
|
|
602
|
+
* 401:
|
|
603
|
+
* $ref: '#/components/schemas/UnauthorizedError'
|
|
604
|
+
* 404:
|
|
605
|
+
* description: Credential not found
|
|
606
|
+
* 500:
|
|
607
|
+
* $ref: '#/components/schemas/InternalError'
|
|
608
|
+
*/
|
|
609
|
+
async getReceivedCredential(request, response) {
|
|
610
|
+
try {
|
|
611
|
+
const { credentialHash } = request.params;
|
|
612
|
+
const customer = response.locals.customer;
|
|
613
|
+
const credential = await ReceivedCredentials.instance.getReceivedCredential(credentialHash, customer);
|
|
614
|
+
return response.status(StatusCodes.OK).json(credential);
|
|
615
|
+
}
|
|
616
|
+
catch (error) {
|
|
617
|
+
const errorMessage = `${error}`;
|
|
618
|
+
if (errorMessage.includes('not found')) {
|
|
619
|
+
return response.status(StatusCodes.NOT_FOUND).json({
|
|
620
|
+
error: errorMessage,
|
|
621
|
+
});
|
|
622
|
+
}
|
|
623
|
+
return response.status(StatusCodes.INTERNAL_SERVER_ERROR).json({
|
|
624
|
+
error: errorMessage,
|
|
625
|
+
});
|
|
626
|
+
}
|
|
627
|
+
}
|
|
628
|
+
}
|
|
629
|
+
__decorate([
|
|
630
|
+
validate
|
|
631
|
+
], ReceivedCredentialController.prototype, "listOffers", null);
|
|
632
|
+
__decorate([
|
|
633
|
+
validate
|
|
634
|
+
], ReceivedCredentialController.prototype, "getOfferDetails", null);
|
|
635
|
+
__decorate([
|
|
636
|
+
validate
|
|
637
|
+
], ReceivedCredentialController.prototype, "acceptOffer", null);
|
|
638
|
+
__decorate([
|
|
639
|
+
validate
|
|
640
|
+
], ReceivedCredentialController.prototype, "rejectOffer", null);
|
|
641
|
+
__decorate([
|
|
642
|
+
validate
|
|
643
|
+
], ReceivedCredentialController.prototype, "importCredential", null);
|
|
644
|
+
__decorate([
|
|
645
|
+
validate
|
|
646
|
+
], ReceivedCredentialController.prototype, "listReceivedCredentials", null);
|
|
647
|
+
__decorate([
|
|
648
|
+
validate
|
|
649
|
+
], ReceivedCredentialController.prototype, "getReceivedCredential", null);
|
|
650
|
+
//# sourceMappingURL=received-credential.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"received-credential.js","sourceRoot":"","sources":["../../../src/controllers/api/received-credential.ts"],"names":[],"mappings":"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"}
|