@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.
Files changed (61) hide show
  1. package/dist/app.d.ts.map +1 -1
  2. package/dist/app.js +11 -0
  3. package/dist/app.js.map +1 -1
  4. package/dist/controllers/api/accreditation.js +1 -1
  5. package/dist/controllers/api/accreditation.js.map +1 -1
  6. package/dist/controllers/api/credential.d.ts +1 -1
  7. package/dist/controllers/api/credential.d.ts.map +1 -1
  8. package/dist/controllers/api/credential.js +2 -1
  9. package/dist/controllers/api/credential.js.map +1 -1
  10. package/dist/controllers/api/received-credential.d.ts +375 -0
  11. package/dist/controllers/api/received-credential.d.ts.map +1 -0
  12. package/dist/controllers/api/received-credential.js +650 -0
  13. package/dist/controllers/api/received-credential.js.map +1 -0
  14. package/dist/database/entities/issued-credential.entity.d.ts +18 -2
  15. package/dist/database/entities/issued-credential.entity.d.ts.map +1 -1
  16. package/dist/database/entities/issued-credential.entity.js +29 -0
  17. package/dist/database/entities/issued-credential.entity.js.map +1 -1
  18. package/dist/database/migrations/1766408271347-studio-migrations.d.ts +7 -0
  19. package/dist/database/migrations/1766408271347-studio-migrations.d.ts.map +1 -0
  20. package/dist/database/migrations/1766408271347-studio-migrations.js +16 -0
  21. package/dist/database/migrations/1766408271347-studio-migrations.js.map +1 -0
  22. package/dist/database/types/types.d.ts.map +1 -1
  23. package/dist/database/types/types.js +2 -0
  24. package/dist/database/types/types.js.map +1 -1
  25. package/dist/middleware/auth/routes/api/credential-auth.d.ts.map +1 -1
  26. package/dist/middleware/auth/routes/api/credential-auth.js +12 -0
  27. package/dist/middleware/auth/routes/api/credential-auth.js.map +1 -1
  28. package/dist/services/api/accreditation.d.ts.map +1 -1
  29. package/dist/services/api/accreditation.js +8 -1
  30. package/dist/services/api/accreditation.js.map +1 -1
  31. package/dist/services/api/credentials.d.ts.map +1 -1
  32. package/dist/services/api/credentials.js +38 -6
  33. package/dist/services/api/credentials.js.map +1 -1
  34. package/dist/services/api/received-credentials.d.ts +129 -0
  35. package/dist/services/api/received-credentials.d.ts.map +1 -0
  36. package/dist/services/api/received-credentials.js +498 -0
  37. package/dist/services/api/received-credentials.js.map +1 -0
  38. package/dist/services/identity/abstract.d.ts +4 -0
  39. package/dist/services/identity/abstract.d.ts.map +1 -1
  40. package/dist/services/identity/abstract.js +12 -0
  41. package/dist/services/identity/abstract.js.map +1 -1
  42. package/dist/services/identity/index.d.ts +22 -0
  43. package/dist/services/identity/index.d.ts.map +1 -1
  44. package/dist/services/identity/index.js.map +1 -1
  45. package/dist/services/identity/providers/studio/agent.d.ts +15 -0
  46. package/dist/services/identity/providers/studio/agent.d.ts.map +1 -1
  47. package/dist/services/identity/providers/studio/agent.js +51 -9
  48. package/dist/services/identity/providers/studio/agent.js.map +1 -1
  49. package/dist/services/identity/providers/studio/local.d.ts +4 -0
  50. package/dist/services/identity/providers/studio/local.d.ts.map +1 -1
  51. package/dist/services/identity/providers/studio/local.js +12 -0
  52. package/dist/services/identity/providers/studio/local.js.map +1 -1
  53. package/dist/services/identity/providers/studio/postgres.d.ts +7 -0
  54. package/dist/services/identity/providers/studio/postgres.d.ts.map +1 -1
  55. package/dist/services/identity/providers/studio/postgres.js +19 -0
  56. package/dist/services/identity/providers/studio/postgres.js.map +1 -1
  57. package/dist/services/track/admin/account-submitter.d.ts.map +1 -1
  58. package/dist/services/track/admin/account-submitter.js +1 -3
  59. package/dist/services/track/admin/account-submitter.js.map +1 -1
  60. package/dist/static/swagger-api.json +526 -1
  61. 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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"}