@cheqd/studio 3.16.0-develop.11 → 3.16.0-develop.13

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 (51) 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/credential.d.ts +1 -1
  5. package/dist/controllers/api/credential.js +1 -1
  6. package/dist/controllers/api/received-credential.d.ts +375 -0
  7. package/dist/controllers/api/received-credential.d.ts.map +1 -0
  8. package/dist/controllers/api/received-credential.js +650 -0
  9. package/dist/controllers/api/received-credential.js.map +1 -0
  10. package/dist/database/entities/issued-credential.entity.d.ts +18 -2
  11. package/dist/database/entities/issued-credential.entity.d.ts.map +1 -1
  12. package/dist/database/entities/issued-credential.entity.js +29 -0
  13. package/dist/database/entities/issued-credential.entity.js.map +1 -1
  14. package/dist/database/migrations/1766408271347-studio-migrations.d.ts +7 -0
  15. package/dist/database/migrations/1766408271347-studio-migrations.d.ts.map +1 -0
  16. package/dist/database/migrations/1766408271347-studio-migrations.js +16 -0
  17. package/dist/database/migrations/1766408271347-studio-migrations.js.map +1 -0
  18. package/dist/database/types/types.d.ts.map +1 -1
  19. package/dist/database/types/types.js +2 -0
  20. package/dist/database/types/types.js.map +1 -1
  21. package/dist/middleware/auth/routes/api/credential-auth.d.ts.map +1 -1
  22. package/dist/middleware/auth/routes/api/credential-auth.js +12 -0
  23. package/dist/middleware/auth/routes/api/credential-auth.js.map +1 -1
  24. package/dist/services/api/credentials.d.ts.map +1 -1
  25. package/dist/services/api/credentials.js +38 -6
  26. package/dist/services/api/credentials.js.map +1 -1
  27. package/dist/services/api/received-credentials.d.ts +129 -0
  28. package/dist/services/api/received-credentials.d.ts.map +1 -0
  29. package/dist/services/api/received-credentials.js +498 -0
  30. package/dist/services/api/received-credentials.js.map +1 -0
  31. package/dist/services/identity/abstract.d.ts +4 -0
  32. package/dist/services/identity/abstract.d.ts.map +1 -1
  33. package/dist/services/identity/abstract.js +12 -0
  34. package/dist/services/identity/abstract.js.map +1 -1
  35. package/dist/services/identity/index.d.ts +22 -0
  36. package/dist/services/identity/index.d.ts.map +1 -1
  37. package/dist/services/identity/index.js.map +1 -1
  38. package/dist/services/identity/providers/studio/agent.d.ts +15 -0
  39. package/dist/services/identity/providers/studio/agent.d.ts.map +1 -1
  40. package/dist/services/identity/providers/studio/agent.js +51 -4
  41. package/dist/services/identity/providers/studio/agent.js.map +1 -1
  42. package/dist/services/identity/providers/studio/local.d.ts +4 -0
  43. package/dist/services/identity/providers/studio/local.d.ts.map +1 -1
  44. package/dist/services/identity/providers/studio/local.js +12 -0
  45. package/dist/services/identity/providers/studio/local.js.map +1 -1
  46. package/dist/services/identity/providers/studio/postgres.d.ts +7 -0
  47. package/dist/services/identity/providers/studio/postgres.d.ts.map +1 -1
  48. package/dist/services/identity/providers/studio/postgres.js +19 -0
  49. package/dist/services/identity/providers/studio/postgres.js.map +1 -1
  50. package/dist/static/swagger-api.json +526 -1
  51. package/package.json +1 -1
@@ -0,0 +1,129 @@
1
+ import type { VerifiableCredential } from '@veramo/core';
2
+ import { Repository } from 'typeorm';
3
+ import { IssuedCredentialEntity } from '../../database/entities/issued-credential.entity.js';
4
+ import type { CustomerEntity } from '../../database/entities/customer.entity.js';
5
+ export interface ListOffersOptions {
6
+ holderDid?: string;
7
+ category?: 'credential' | 'accreditation';
8
+ page?: number;
9
+ limit?: number;
10
+ }
11
+ export interface ListOffersResponse {
12
+ total: number;
13
+ offers: IssuedCredentialEntity[];
14
+ page: number;
15
+ limit: number;
16
+ }
17
+ export interface AcceptOfferOptions {
18
+ createPresentation?: boolean;
19
+ presentationDomain?: string;
20
+ }
21
+ export interface AcceptOfferResponse {
22
+ success: boolean;
23
+ credential: VerifiableCredential;
24
+ presentation?: string;
25
+ }
26
+ export interface RejectOfferResponse {
27
+ success: boolean;
28
+ message: string;
29
+ }
30
+ export declare class ReceivedCredentials {
31
+ static instance: ReceivedCredentials;
32
+ repository: Repository<IssuedCredentialEntity>;
33
+ constructor();
34
+ /**
35
+ * List pending credential offers for a holder
36
+ * @param options - Filter options including optional holderDid
37
+ * @param customer - Customer entity
38
+ * @returns List of pending offers
39
+ */
40
+ listPendingOffers(options: ListOffersOptions, customer: CustomerEntity): Promise<ListOffersResponse>;
41
+ /**
42
+ * Get details of a specific credential offer
43
+ * @param issuedCredentialId - ID of the issued credential
44
+ * @param holderDid - DID of the holder requesting the offer
45
+ * @param customer - Customer entity
46
+ * @returns Credential offer details
47
+ */
48
+ getOfferDetails(issuedCredentialId: string, holderDid: string, customer: CustomerEntity): Promise<IssuedCredentialEntity>;
49
+ /**
50
+ * Accept a credential offer
51
+ * Verifies the credential, checks subject DID, and updates status
52
+ * @param issuedCredentialId - ID of the issued credential
53
+ * @param holderDid - DID of the holder accepting the offer
54
+ * @param customer - Customer entity
55
+ * @param options - Additional options for acceptance
56
+ * @returns Acceptance response with credential and optional presentation
57
+ */
58
+ acceptOffer(issuedCredentialId: string, holderDid: string, customer: CustomerEntity, options?: AcceptOfferOptions): Promise<AcceptOfferResponse>;
59
+ /**
60
+ * Reject a credential offer
61
+ * Updates status and deletes credential from dataStore
62
+ * @param issuedCredentialId - ID of the issued credential
63
+ * @param holderDid - DID of the holder rejecting the offer
64
+ * @param customer - Customer entity
65
+ * @returns Rejection response
66
+ */
67
+ rejectOffer(issuedCredentialId: string, holderDid: string, customer: CustomerEntity): Promise<RejectOfferResponse>;
68
+ /**
69
+ * Cleanup expired credential offers
70
+ * Deletes credentials from dataStore and updates status
71
+ * This should be run as a cron job
72
+ * @param customer - Optional customer entity to filter by
73
+ * @returns Number of offers cleaned up
74
+ */
75
+ cleanupExpiredOffers(customer?: CustomerEntity): Promise<number>;
76
+ /**
77
+ * Helper: Get all DIDs belonging to the holder/customer
78
+ * @param customer - Customer entity
79
+ * @returns Array of DID strings
80
+ */
81
+ private getHolderDids;
82
+ /**
83
+ * Helper: Create a verifiable presentation
84
+ * @param credential - Verifiable credential to include
85
+ * @param holderDid - DID of the holder
86
+ * @param customer - Customer entity
87
+ * @param domain - Optional domain for the presentation
88
+ * @returns JWT presentation string
89
+ */
90
+ private createPresentation;
91
+ /**
92
+ * Import an externally issued credential into the dataStore
93
+ * @param credential - Verifiable credential (JSON object or JWT string)
94
+ * @param customer - Customer entity
95
+ * @param holderDid - DID of the holder importing the credential
96
+ * @returns Imported credential details
97
+ */
98
+ importCredential(credential: VerifiableCredential | string, customer: CustomerEntity, holderDid: string): Promise<{
99
+ success: boolean;
100
+ credentialHash: string;
101
+ credential: VerifiableCredential;
102
+ }>;
103
+ /**
104
+ * List received credentials (accepted offers + imported credentials)
105
+ * @param customer - Customer entity
106
+ * @param holderDid - Optional DID to filter by subject
107
+ * @param category - Optional category to filter by ('credential' or 'accreditation')
108
+ * @param page - Page number for pagination (default: 1)
109
+ * @param limit - Number of results per page (default: 10)
110
+ * @returns Paginated list of received credentials with their hashes
111
+ */
112
+ listReceivedCredentials(customer: CustomerEntity, holderDid?: string, category?: 'credential' | 'accreditation', page?: number, limit?: number): Promise<{
113
+ total: number;
114
+ credentials: Array<{
115
+ hash: string;
116
+ credential: VerifiableCredential;
117
+ }>;
118
+ page: number;
119
+ limit: number;
120
+ }>;
121
+ /**
122
+ * Get a specific received credential by hash
123
+ * @param credentialHash - Hash of the credential
124
+ * @param customer - Customer entity
125
+ * @returns Verifiable credential
126
+ */
127
+ getReceivedCredential(credentialHash: string, customer: CustomerEntity): Promise<VerifiableCredential>;
128
+ }
129
+ //# sourceMappingURL=received-credentials.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"received-credentials.d.ts","sourceRoot":"","sources":["../../../src/services/api/received-credentials.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,oBAAoB,EAAsC,MAAM,cAAc,CAAC;AAC7F,OAAO,EAAE,UAAU,EAAY,MAAM,SAAS,CAAC;AAE/C,OAAO,EAAE,sBAAsB,EAAE,MAAM,qDAAqD,CAAC;AAC7F,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,4CAA4C,CAAC;AAgBjF,MAAM,WAAW,iBAAiB;IACjC,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,YAAY,GAAG,eAAe,CAAC;IAC1C,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,KAAK,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,kBAAkB;IAClC,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,sBAAsB,EAAE,CAAC;IACjC,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;CACd;AAED,MAAM,WAAW,kBAAkB;IAClC,kBAAkB,CAAC,EAAE,OAAO,CAAC;IAC7B,kBAAkB,CAAC,EAAE,MAAM,CAAC;CAC5B;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,UAAU,EAAE,oBAAoB,CAAC;IACjC,YAAY,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,mBAAmB;IACnC,OAAO,EAAE,OAAO,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;CAChB;AAED,qBAAa,mBAAmB;IAC/B,OAAc,QAAQ,sBAA6B;IAC5C,UAAU,EAAE,UAAU,CAAC,sBAAsB,CAAC,CAAC;;IAMtD;;;;;OAKG;IACG,iBAAiB,CAAC,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,kBAAkB,CAAC;IA0D1G;;;;;;OAMG;IACG,eAAe,CACpB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC,sBAAsB,CAAC;IAkClC;;;;;;;;OAQG;IACG,WAAW,CAChB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,EACxB,OAAO,GAAE,kBAAuB,GAC9B,OAAO,CAAC,mBAAmB,CAAC;IA2F/B;;;;;;;OAOG;IACG,WAAW,CAChB,kBAAkB,EAAE,MAAM,EAC1B,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,cAAc,GACtB,OAAO,CAAC,mBAAmB,CAAC;IAwB/B;;;;;;OAMG;IACG,oBAAoB,CAAC,QAAQ,CAAC,EAAE,cAAc,GAAG,OAAO,CAAC,MAAM,CAAC;IA6CtE;;;;OAIG;YACW,aAAa;IAiB3B;;;;;;;OAOG;YACW,kBAAkB;IA8BhC;;;;;;OAMG;IACG,gBAAgB,CACrB,UAAU,EAAE,oBAAoB,GAAG,MAAM,EACzC,QAAQ,EAAE,cAAc,EACxB,SAAS,EAAE,MAAM,GACf,OAAO,CAAC;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,cAAc,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,oBAAoB,CAAA;KAAE,CAAC;IAkD1F;;;;;;;;OAQG;IACG,uBAAuB,CAC5B,QAAQ,EAAE,cAAc,EACxB,SAAS,CAAC,EAAE,MAAM,EAClB,QAAQ,CAAC,EAAE,YAAY,GAAG,eAAe,EACzC,IAAI,GAAE,MAAU,EAChB,KAAK,GAAE,MAAW,GAChB,OAAO,CAAC;QACV,KAAK,EAAE,MAAM,CAAC;QACd,WAAW,EAAE,KAAK,CAAC;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,UAAU,EAAE,oBAAoB,CAAA;SAAE,CAAC,CAAC;QACvE,IAAI,EAAE,MAAM,CAAC;QACb,KAAK,EAAE,MAAM,CAAC;KACd,CAAC;IAiHF;;;;;OAKG;IACG,qBAAqB,CAAC,cAAc,EAAE,MAAM,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,oBAAoB,CAAC;CAgC5G"}
@@ -0,0 +1,498 @@
1
+ import { LessThan } from 'typeorm';
2
+ import { Connection } from '../../database/connection/connection.js';
3
+ import { IssuedCredentialEntity } from '../../database/entities/issued-credential.entity.js';
4
+ import { IdentityServiceStrategySetup } from '../identity/index.js';
5
+ import { CheqdW3CVerifiableCredential } from '../w3c-credential.js';
6
+ import { Credential } from '@veramo/data-store';
7
+ import * as dotenv from 'dotenv';
8
+ dotenv.config();
9
+ // Accreditation types for category inference
10
+ const ACCREDITATION_TYPES = [
11
+ 'VerifiableAccreditationToAccredit',
12
+ 'VerifiableAccreditationToAttest',
13
+ 'VerifiableAuthorizationForTrustChain',
14
+ ];
15
+ export class ReceivedCredentials {
16
+ static instance = new ReceivedCredentials();
17
+ repository;
18
+ constructor() {
19
+ this.repository = Connection.instance.dbConnection.getRepository(IssuedCredentialEntity);
20
+ }
21
+ /**
22
+ * List pending credential offers for a holder
23
+ * @param options - Filter options including optional holderDid
24
+ * @param customer - Customer entity
25
+ * @returns List of pending offers
26
+ */
27
+ async listPendingOffers(options, customer) {
28
+ try {
29
+ const { holderDid, category, page = 1, limit = 10 } = options;
30
+ let subjectDids = [];
31
+ // If holderDid not provided, get all DIDs for this customer
32
+ if (!holderDid) {
33
+ subjectDids = await this.getHolderDids(customer);
34
+ if (subjectDids.length === 0) {
35
+ // No DIDs found for customer, return empty result
36
+ return {
37
+ total: 0,
38
+ offers: [],
39
+ page,
40
+ limit,
41
+ };
42
+ }
43
+ }
44
+ else {
45
+ // Verify the provided holderDid belongs to this customer
46
+ const customerDids = await this.getHolderDids(customer);
47
+ if (!customerDids.includes(holderDid)) {
48
+ throw new Error(`DID ${holderDid} not found in your wallet`);
49
+ }
50
+ subjectDids = [holderDid];
51
+ }
52
+ // Query for offered credentials where subject matches any of the holder's DIDs
53
+ // Note: Don't filter by customer because the issuer could be a different customer
54
+ const queryBuilder = this.repository
55
+ .createQueryBuilder('credential')
56
+ .leftJoinAndSelect('credential.statusRegistry', 'statusRegistry')
57
+ .leftJoinAndSelect('credential.veramoCredential', 'veramoCredential')
58
+ .where('credential.status = :status', { status: 'offered' })
59
+ .andWhere('credential.subjectId IN (:...subjectDids)', { subjectDids });
60
+ // Add category filter if provided
61
+ if (category) {
62
+ queryBuilder.andWhere('credential.category = :category', { category });
63
+ }
64
+ queryBuilder
65
+ .orderBy('credential.createdAt', 'DESC')
66
+ .skip((page - 1) * limit)
67
+ .take(limit);
68
+ const [offers, total] = await queryBuilder.getManyAndCount();
69
+ return {
70
+ total,
71
+ offers,
72
+ page,
73
+ limit,
74
+ };
75
+ }
76
+ catch (error) {
77
+ throw new Error(`Failed to list pending offers: ${error}`);
78
+ }
79
+ }
80
+ /**
81
+ * Get details of a specific credential offer
82
+ * @param issuedCredentialId - ID of the issued credential
83
+ * @param holderDid - DID of the holder requesting the offer
84
+ * @param customer - Customer entity
85
+ * @returns Credential offer details
86
+ */
87
+ async getOfferDetails(issuedCredentialId, holderDid, customer) {
88
+ try {
89
+ const customerDids = await this.getHolderDids(customer);
90
+ // Check if holderDid is owned by this customer
91
+ if (!customerDids.includes(holderDid)) {
92
+ throw new Error(`DID ${holderDid} not found in your wallet`);
93
+ }
94
+ // Query offer without customer filter (issuer could be different customer)
95
+ const offer = await this.repository.findOne({
96
+ where: {
97
+ issuedCredentialId,
98
+ subjectId: holderDid,
99
+ status: 'offered',
100
+ },
101
+ relations: ['statusRegistry', 'veramoCredential'],
102
+ });
103
+ if (!offer) {
104
+ throw new Error('Credential offer not found or expired');
105
+ }
106
+ // Check if offer has expired
107
+ if (offer.offerExpiresAt && new Date() > offer.offerExpiresAt) {
108
+ throw new Error('Credential offer has expired');
109
+ }
110
+ return offer;
111
+ }
112
+ catch (error) {
113
+ throw new Error(`Failed to get offer details: ${error}`);
114
+ }
115
+ }
116
+ /**
117
+ * Accept a credential offer
118
+ * Verifies the credential, checks subject DID, and updates status
119
+ * @param issuedCredentialId - ID of the issued credential
120
+ * @param holderDid - DID of the holder accepting the offer
121
+ * @param customer - Customer entity
122
+ * @param options - Additional options for acceptance
123
+ * @returns Acceptance response with credential and optional presentation
124
+ */
125
+ async acceptOffer(issuedCredentialId, holderDid, customer, options = {}) {
126
+ try {
127
+ // Get all DIDs for this customer once (to avoid duplicate calls)
128
+ const holderDids = await this.getHolderDids(customer);
129
+ // Check if holderDid is owned by this customer
130
+ if (!holderDids.includes(holderDid)) {
131
+ throw new Error(`DID ${holderDid} not found in your wallet`);
132
+ }
133
+ // Query offer without customer filter (issuer could be different customer)
134
+ const offer = await this.repository.findOne({
135
+ where: {
136
+ issuedCredentialId,
137
+ subjectId: holderDid,
138
+ status: 'offered',
139
+ },
140
+ relations: ['statusRegistry', 'veramoCredential'],
141
+ });
142
+ if (!offer) {
143
+ throw new Error('Credential offer not found or expired');
144
+ }
145
+ // Check if offer has expired
146
+ if (offer.offerExpiresAt && new Date() > offer.offerExpiresAt) {
147
+ throw new Error('Credential offer has expired');
148
+ }
149
+ // Get the credential from the loaded relation
150
+ if (!offer.veramoCredential) {
151
+ throw new Error('Credential not found in dataStore');
152
+ }
153
+ const identityService = new IdentityServiceStrategySetup(customer.customerId);
154
+ // Extract the verifiable credential from Veramo's Credential entity
155
+ const credential = offer.veramoCredential.raw;
156
+ // Verify the credential
157
+ const verificationOptions = {
158
+ verifyStatus: true,
159
+ };
160
+ const verification = await identityService.agent.verifyCredential(credential, verificationOptions, customer);
161
+ if (!verification.verified) {
162
+ throw new Error(`Invalid credential: ${verification.error}`);
163
+ }
164
+ // Parse credential to get subject
165
+ const parsedCredential = new CheqdW3CVerifiableCredential(credential);
166
+ const credentialSubject = parsedCredential.credentialSubject;
167
+ // Verify subject matches one of holder's DIDs (using cached holderDids)
168
+ const subjectId = typeof credentialSubject === 'object' && 'id' in credentialSubject ? credentialSubject.id : null;
169
+ if (!subjectId || !holderDids.includes(subjectId)) {
170
+ throw new Error('Credential subject does not match any of your DIDs');
171
+ }
172
+ // Update the IssuedCredentialEntity
173
+ offer.status = 'issued';
174
+ offer.subjectAcceptedAt = new Date();
175
+ await this.repository.save(offer);
176
+ // Create and publish Verifiable Presentation if requested
177
+ let presentation;
178
+ if (options.createPresentation) {
179
+ presentation = await this.createPresentation(credential, holderDid, customer, options.presentationDomain);
180
+ }
181
+ return {
182
+ success: true,
183
+ credential,
184
+ presentation,
185
+ };
186
+ }
187
+ catch (error) {
188
+ throw new Error(`Failed to accept offer: ${error}`);
189
+ }
190
+ }
191
+ /**
192
+ * Reject a credential offer
193
+ * Updates status and deletes credential from dataStore
194
+ * @param issuedCredentialId - ID of the issued credential
195
+ * @param holderDid - DID of the holder rejecting the offer
196
+ * @param customer - Customer entity
197
+ * @returns Rejection response
198
+ */
199
+ async rejectOffer(issuedCredentialId, holderDid, customer) {
200
+ try {
201
+ // Get the offer
202
+ const offer = await this.getOfferDetails(issuedCredentialId, holderDid, customer);
203
+ // Update status to rejected
204
+ offer.status = 'rejected';
205
+ await this.repository.save(offer);
206
+ // Delete credential from Veramo dataStore
207
+ if (offer.veramoHash) {
208
+ const identityService = new IdentityServiceStrategySetup(customer.customerId).agent;
209
+ await identityService.deleteCredential(offer.veramoHash, customer);
210
+ }
211
+ return {
212
+ success: true,
213
+ message: 'Credential offer rejected successfully',
214
+ };
215
+ }
216
+ catch (error) {
217
+ throw new Error(`Failed to reject offer: ${error}`);
218
+ }
219
+ }
220
+ /**
221
+ * Cleanup expired credential offers
222
+ * Deletes credentials from dataStore and updates status
223
+ * This should be run as a cron job
224
+ * @param customer - Optional customer entity to filter by
225
+ * @returns Number of offers cleaned up
226
+ */
227
+ async cleanupExpiredOffers(customer) {
228
+ try {
229
+ const now = new Date();
230
+ // Find expired offers
231
+ const whereCondition = {
232
+ status: 'offered',
233
+ offerExpiresAt: LessThan(now),
234
+ };
235
+ if (customer) {
236
+ whereCondition.customer = { customerId: customer.customerId };
237
+ }
238
+ const expiredOffers = await this.repository.find({
239
+ where: whereCondition,
240
+ });
241
+ let cleanedCount = 0;
242
+ for (const offer of expiredOffers) {
243
+ try {
244
+ // Update status to rejected
245
+ offer.status = 'rejected';
246
+ offer.lastError = 'Offer expired';
247
+ await this.repository.save(offer);
248
+ // Delete from dataStore if exists
249
+ if (offer.veramoHash && customer) {
250
+ const identityService = new IdentityServiceStrategySetup(customer.customerId).agent;
251
+ await identityService.deleteCredential(offer.veramoHash, customer);
252
+ }
253
+ cleanedCount++;
254
+ }
255
+ catch (error) {
256
+ console.error(`Failed to cleanup offer ${offer.issuedCredentialId}:`, error);
257
+ }
258
+ }
259
+ return cleanedCount;
260
+ }
261
+ catch (error) {
262
+ throw new Error(`Failed to cleanup expired offers: ${error}`);
263
+ }
264
+ }
265
+ /**
266
+ * Helper: Get all DIDs belonging to the holder/customer
267
+ * @param customer - Customer entity
268
+ * @returns Array of DID strings
269
+ */
270
+ async getHolderDids(customer) {
271
+ try {
272
+ const identityService = new IdentityServiceStrategySetup(customer.customerId);
273
+ const agent = identityService.agent;
274
+ if (!agent) {
275
+ throw new Error('Agent not initialized');
276
+ }
277
+ // Get all DIDs for this customer
278
+ const identifiers = await agent.listDids({ page: 1, limit: 1000 }, customer);
279
+ return identifiers.dids.map((d) => (typeof d === 'string' ? d : d.did));
280
+ }
281
+ catch (error) {
282
+ throw new Error(`Failed to get holder DIDs: ${error}`);
283
+ }
284
+ }
285
+ /**
286
+ * Helper: Create a verifiable presentation
287
+ * @param credential - Verifiable credential to include
288
+ * @param holderDid - DID of the holder
289
+ * @param customer - Customer entity
290
+ * @param domain - Optional domain for the presentation
291
+ * @returns JWT presentation string
292
+ */
293
+ async createPresentation(credential, holderDid, customer, domain) {
294
+ try {
295
+ const identityService = new IdentityServiceStrategySetup(customer.customerId).agent;
296
+ const presentationPayload = {
297
+ holder: holderDid,
298
+ verifiableCredential: [credential],
299
+ '@context': ['https://www.w3.org/2018/credentials/v1'],
300
+ type: ['VerifiablePresentation'],
301
+ };
302
+ const verificationOptions = domain ? { domain } : {};
303
+ const presentation = await identityService.createPresentation(presentationPayload, verificationOptions, customer);
304
+ // Return as JWT string if available, otherwise stringify
305
+ return typeof presentation === 'string' ? presentation : JSON.stringify(presentation);
306
+ }
307
+ catch (error) {
308
+ throw new Error(`Failed to create presentation: ${error}`);
309
+ }
310
+ }
311
+ /**
312
+ * Import an externally issued credential into the dataStore
313
+ * @param credential - Verifiable credential (JSON object or JWT string)
314
+ * @param customer - Customer entity
315
+ * @param holderDid - DID of the holder importing the credential
316
+ * @returns Imported credential details
317
+ */
318
+ async importCredential(credential, customer, holderDid) {
319
+ try {
320
+ const identityService = new IdentityServiceStrategySetup(customer.customerId).agent;
321
+ // Verify the credential first
322
+ const verificationOptions = {
323
+ verifyStatus: false, // Don't verify status for external credentials
324
+ };
325
+ const verification = await identityService.verifyCredential(credential, verificationOptions, customer);
326
+ if (!verification.verified) {
327
+ throw new Error(`Invalid credential: ${verification.error}`);
328
+ }
329
+ // Parse the credential to get details
330
+ const parsedCredential = new CheqdW3CVerifiableCredential(credential);
331
+ const credentialSubject = parsedCredential.credentialSubject;
332
+ // Verify subject matches holder DID
333
+ const subjectId = typeof credentialSubject === 'object' && 'id' in credentialSubject ? credentialSubject.id : null;
334
+ if (!subjectId) {
335
+ throw new Error('Credential does not have a valid subject ID');
336
+ }
337
+ // Check if holder DID exists in customer's wallet
338
+ const holderDids = await this.getHolderDids(customer);
339
+ if (!holderDids.includes(holderDid)) {
340
+ throw new Error('Holder DID does not exist in your wallet');
341
+ }
342
+ // Verify subject matches holder DID
343
+ if (subjectId !== holderDid) {
344
+ throw new Error('Credential subject does not match holder DID');
345
+ }
346
+ // Save to Veramo dataStore only
347
+ const credentialHash = await identityService.saveCredential(parsedCredential, customer);
348
+ return {
349
+ success: true,
350
+ credentialHash,
351
+ credential: parsedCredential,
352
+ };
353
+ }
354
+ catch (error) {
355
+ throw new Error(`Failed to import credential: ${error}`);
356
+ }
357
+ }
358
+ /**
359
+ * List received credentials (accepted offers + imported credentials)
360
+ * @param customer - Customer entity
361
+ * @param holderDid - Optional DID to filter by subject
362
+ * @param category - Optional category to filter by ('credential' or 'accreditation')
363
+ * @param page - Page number for pagination (default: 1)
364
+ * @param limit - Number of results per page (default: 10)
365
+ * @returns Paginated list of received credentials with their hashes
366
+ */
367
+ async listReceivedCredentials(customer, holderDid, category, page = 1, limit = 10) {
368
+ try {
369
+ // Get all DIDs owned by this customer
370
+ let subjectDids = [];
371
+ if (!holderDid) {
372
+ subjectDids = await this.getHolderDids(customer);
373
+ if (subjectDids.length === 0) {
374
+ // No DIDs found for customer, return empty result
375
+ return {
376
+ total: 0,
377
+ credentials: [],
378
+ page,
379
+ limit,
380
+ };
381
+ }
382
+ }
383
+ else {
384
+ // Verify the provided holderDid belongs to this customer
385
+ const customerDids = await this.getHolderDids(customer);
386
+ if (!customerDids.includes(holderDid)) {
387
+ throw new Error(`DID ${holderDid} not found in your wallet`);
388
+ }
389
+ subjectDids = [holderDid];
390
+ }
391
+ // Use direct TypeORM query on Credential entity to avoid beta dataStoreORM
392
+ // Left join with IssuedCredentialEntity to include both accepted offers and imported credentials
393
+ const credentialRepository = Connection.instance.dbConnection.getRepository(Credential);
394
+ const queryBuilder = credentialRepository
395
+ .createQueryBuilder('credential')
396
+ .leftJoin(IssuedCredentialEntity, 'issued', 'issued.veramoHash = credential.hash')
397
+ .addSelect('issued.category')
398
+ .where('credential.subjectDid IN (:...subjectDids)', { subjectDids })
399
+ .andWhere('(issued.status NOT IN (:...excludedStatuses) OR issued.status IS NULL)', {
400
+ excludedStatuses: ['offered', 'rejected'],
401
+ });
402
+ // Add category filter if provided
403
+ // Include both credentials matching the category AND imported credentials (which have issued.category = NULL)
404
+ if (category) {
405
+ queryBuilder.andWhere('(issued.category = :category OR issued.category IS NULL)', { category });
406
+ }
407
+ let total;
408
+ let finalCredentials;
409
+ // Handle two cases differently for correct pagination and total count
410
+ if (!category) {
411
+ // No category filter: Use efficient SQL pagination with count
412
+ queryBuilder.skip((page - 1) * limit).take(limit);
413
+ const [credentialRecords, count] = await queryBuilder.getManyAndCount();
414
+ total = count;
415
+ finalCredentials = credentialRecords.map((record) => ({
416
+ hash: record.hash,
417
+ credential: record.raw,
418
+ }));
419
+ }
420
+ else {
421
+ // Category filter applied: Fetch all records to filter by type in TypeScript, then manually paginate
422
+ const credentialRecords = await queryBuilder.getRawAndEntities();
423
+ // Extract credentials with category information from the join
424
+ let credentials = credentialRecords.entities.map((record, index) => {
425
+ const rawRecord = credentialRecords.raw[index];
426
+ return {
427
+ hash: record.hash,
428
+ credential: record.raw,
429
+ issuedCategory: rawRecord.issued_category,
430
+ };
431
+ });
432
+ // Filter imported credentials by their type
433
+ credentials = credentials.filter((item) => {
434
+ // If credential has IssuedCredentialEntity with category, it's already filtered by SQL
435
+ if (item.issuedCategory !== null) {
436
+ return true;
437
+ }
438
+ // For imported credentials (issuedCategory = null), check the credential type
439
+ const credentialType = Array.isArray(item.credential.type)
440
+ ? item.credential.type
441
+ : [item.credential.type];
442
+ const isAccreditation = credentialType.some((type) => typeof type === 'string' && ACCREDITATION_TYPES.includes(type));
443
+ // Keep credential if category matches
444
+ return category === 'accreditation' ? isAccreditation : !isAccreditation;
445
+ });
446
+ // Get total count after filtering
447
+ total = credentials.length;
448
+ // Apply manual pagination
449
+ const startIndex = (page - 1) * limit;
450
+ credentials = credentials.slice(startIndex, startIndex + limit);
451
+ // Remove the temporary issuedCategory field
452
+ finalCredentials = credentials.map(({ hash, credential }) => ({ hash, credential }));
453
+ }
454
+ return {
455
+ total,
456
+ credentials: finalCredentials,
457
+ page,
458
+ limit,
459
+ };
460
+ }
461
+ catch (error) {
462
+ throw new Error(`Failed to list received credentials: ${error}`);
463
+ }
464
+ }
465
+ /**
466
+ * Get a specific received credential by hash
467
+ * @param credentialHash - Hash of the credential
468
+ * @param customer - Customer entity
469
+ * @returns Verifiable credential
470
+ */
471
+ async getReceivedCredential(credentialHash, customer) {
472
+ try {
473
+ const identityService = new IdentityServiceStrategySetup(customer.customerId).agent;
474
+ // Use the new retrieveCredential() method instead of beta dataStore method
475
+ const credential = await identityService.retrieveCredential(credentialHash, customer);
476
+ if (!credential) {
477
+ throw new Error(`Credential with hash ${credentialHash} not found`);
478
+ }
479
+ // Verify the credential subject belongs to customer's wallet
480
+ const parsedCredential = new CheqdW3CVerifiableCredential(credential);
481
+ const credentialSubject = parsedCredential.credentialSubject;
482
+ const subjectId = typeof credentialSubject === 'object' && 'id' in credentialSubject ? credentialSubject.id : null;
483
+ if (!subjectId) {
484
+ throw new Error('Credential does not have a valid subject ID');
485
+ }
486
+ // Check if subject DID belongs to this customer
487
+ const holderDids = await this.getHolderDids(customer);
488
+ if (!holderDids.includes(subjectId)) {
489
+ throw new Error('Credential subject does not belong to your wallet');
490
+ }
491
+ return credential;
492
+ }
493
+ catch (error) {
494
+ throw new Error(`Failed to get received credential: ${error}`);
495
+ }
496
+ }
497
+ }
498
+ //# sourceMappingURL=received-credentials.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"received-credentials.js","sourceRoot":"","sources":["../../../src/services/api/received-credentials.ts"],"names":[],"mappings":"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"}
@@ -61,5 +61,9 @@ export declare abstract class AbstractIdentityService implements IIdentityServic
61
61
  getAPIKey(customer: CustomerEntity, user: UserEntity): Promise<APIKeyEntity | null>;
62
62
  decryptAPIKey(apiKey: string): Promise<string>;
63
63
  listOperations(where: ListOperationOptions, customer: CustomerEntity): Promise<any>;
64
+ didExists(did: string, customer: CustomerEntity): Promise<boolean>;
65
+ saveCredential(credential: VerifiableCredential, customer: CustomerEntity): Promise<string>;
66
+ deleteCredential(hash: string, customer: CustomerEntity): Promise<boolean>;
67
+ retrieveCredential(hash: string, customer: CustomerEntity): Promise<VerifiableCredential | null>;
64
68
  }
65
69
  //# sourceMappingURL=abstract.d.ts.map