@cooperation/vc-storage 1.0.10 → 1.0.12

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,6 +1,6 @@
1
1
  import { Ed25519VerificationKey2020 } from '@digitalbazaar/ed25519-verification-key-2020';
2
2
  import { Ed25519Signature2020 } from '@digitalbazaar/ed25519-signature-2020';
3
- import * as vc from '@digitalbazaar/vc';
3
+ import * as dbVc from '@digitalbazaar/vc';
4
4
  import { v4 as uuidv4 } from 'uuid';
5
5
  import { extractKeyPairFromCredential, generateDIDSchema, generateUnsignedRecommendation, generateUnsignedVC, } from '../utils/credential.js';
6
6
  import { customDocumentLoader } from '../utils/digitalbazaar.js';
@@ -19,11 +19,9 @@ import { GoogleDriveStorage } from './GoogleDriveStorage.js';
19
19
  * @method signPresentation - Sign a Verifiable Presentation (VP).
20
20
  */
21
21
  export class CredentialEngine {
22
- uuid;
23
22
  storage;
24
23
  keyPair;
25
24
  constructor(accessToken) {
26
- this.uuid = uuidv4();
27
25
  this.storage = new GoogleDriveStorage(accessToken);
28
26
  }
29
27
  async getKeyPair(vc) {
@@ -75,8 +73,11 @@ export class CredentialEngine {
75
73
  async createDID() {
76
74
  try {
77
75
  const keyPair = await this.generateKeyPair();
78
- const keyFile = await saveToGoogleDrive(this.storage, keyPair, 'KEYPAIR', this.uuid);
79
- console.log('🚀 ~ CredentialEngine ~ createDID ~ keyFile:', keyFile);
76
+ const keyFile = await saveToGoogleDrive({
77
+ storage: this.storage,
78
+ data: keyPair,
79
+ type: 'KEYPAIR',
80
+ });
80
81
  const didDocument = await generateDIDSchema(keyPair);
81
82
  return { didDocument, keyPair };
82
83
  }
@@ -85,6 +86,23 @@ export class CredentialEngine {
85
86
  throw error;
86
87
  }
87
88
  }
89
+ async findKeysAndDIDs() {
90
+ // find the DID document for the current user
91
+ const keyPairs = (await this.storage.getAllFilesByType('KEYPAIRs'));
92
+ console.log('🚀 ~ CredentialEngine ~ findDid ~ keyPairs:', keyPairs[0].data);
93
+ const DIDs = (await this.storage.getAllFilesByType('DIDs'));
94
+ console.log('🚀 ~ CredentialEngine ~ findKeysAndDIDs ~ DIDs:', DIDs);
95
+ console.log('🚀 ~ CredentialEngine ~ findKeysAndDIDs ~ DIDs:', DIDs[0]);
96
+ if (DIDs.length === 0 || keyPairs.length === 0)
97
+ return null;
98
+ const keyPair = keyPairs[0].data;
99
+ const didDocument = DIDs[0].data.didDocument;
100
+ console.log('🚀 ~ CredentialEngine ~ findKeysAndDIDs ~ didDocument:', didDocument);
101
+ return {
102
+ didDocument,
103
+ keyPair,
104
+ };
105
+ }
88
106
  /**
89
107
  * Create a new DID with user metamask address as controller
90
108
  * @param walletrAddress
@@ -94,7 +112,11 @@ export class CredentialEngine {
94
112
  async createWalletDID(walletrAddress) {
95
113
  try {
96
114
  const keyPair = await this.generateKeyPair(walletrAddress);
97
- const keyFile = await saveToGoogleDrive(this.storage, keyPair, 'KEYPAIR', this.uuid);
115
+ const keyFile = await saveToGoogleDrive({
116
+ storage: this.storage,
117
+ data: keyPair,
118
+ type: 'KEYPAIR',
119
+ });
98
120
  console.log('🚀 ~ CredentialEngine ~ createWalletDID ~ keyFile:', keyFile);
99
121
  const didDocument = await generateDIDSchema(keyPair);
100
122
  return { didDocument, keyPair };
@@ -109,20 +131,33 @@ export class CredentialEngine {
109
131
  * @param {'VC' | 'RECOMMENDATION'} type - The signature type.
110
132
  * @param {string} issuerId - The ID of the issuer [currently we put it as the did id]
111
133
  * @param {KeyPair} keyPair - The key pair to use for signing.
134
+ * @param {FormDataI | RecommendationFormDataI} formData - The form data to include in the VC.
135
+ * @param {string} VCId - The ID of the credential when the type is RECOMMENDATION
112
136
  * @returns {Promise<Credential>} The signed VC.
113
137
  * @throws Will throw an error if VC signing fails.
114
138
  */
115
- async signVC(formData, type, keyPair, issuerId) {
116
- let credential;
117
- if (type == 'VC') {
118
- credential = generateUnsignedVC(formData, issuerId, this.uuid);
119
- }
120
- else if (type == 'RECOMMENDATION') {
121
- credential = generateUnsignedRecommendation(formData, issuerId);
139
+ async signVC({ data, type, keyPair, issuerId, vcFileId }) {
140
+ console.log('🚀 ~ CredentialEngine ~ signVC ~ { data, type, keyPair, issuerId, vcFileId }:', {
141
+ data,
142
+ type,
143
+ keyPair,
144
+ issuerId,
145
+ vcFileId,
146
+ });
147
+ let vc;
148
+ let credential = generateUnsignedVC({ formData: data, issuerDid: issuerId });
149
+ if (type == 'RECOMMENDATION' && vcFileId) {
150
+ console.log('WOW');
151
+ vc = (await this.storage.retrieve(vcFileId));
152
+ credential = generateUnsignedRecommendation({ vc, recommendation: data, issuerDid: issuerId });
122
153
  }
123
- const suite = new Ed25519Signature2020({ key: keyPair, verificationMethod: keyPair.id });
124
154
  try {
125
- const signedVC = await vc.issue({ credential, suite, documentLoader: customDocumentLoader });
155
+ console.log('🚀 ~ CredentialEngine ~ signVC ~ credential:', credential);
156
+ if (!credential)
157
+ throw new Error('Invalid credential type');
158
+ const suite = new Ed25519Signature2020({ key: keyPair, verificationMethod: keyPair.id });
159
+ console.log('before');
160
+ const signedVC = await dbVc.issue({ credential, suite, documentLoader: customDocumentLoader });
126
161
  return signedVC;
127
162
  }
128
163
  catch (error) {
@@ -143,7 +178,7 @@ export class CredentialEngine {
143
178
  key: keyPair,
144
179
  verificationMethod: keyPair.id,
145
180
  });
146
- const result = await vc.verifyCredential({
181
+ const result = await dbVc.verifyCredential({
147
182
  credential,
148
183
  suite,
149
184
  documentLoader: customDocumentLoader,
@@ -169,7 +204,7 @@ export class CredentialEngine {
169
204
  const id = `urn:uuid:${uuidv4()}`;
170
205
  const keyPair = await this.getKeyPair(verifiableCredential[0]);
171
206
  console.log('🚀 ~ CredentialEngine ~ createPresentation ~ keyPair:', keyPair);
172
- const VP = await vc.createPresentation({ verifiableCredential, id, holder: keyPair.controller });
207
+ const VP = await dbVc.createPresentation({ verifiableCredential, id, holder: keyPair.controller });
173
208
  return VP;
174
209
  }
175
210
  catch (error) {
@@ -198,7 +233,7 @@ export class CredentialEngine {
198
233
  verificationMethod: this.keyPair.id,
199
234
  });
200
235
  // Sign the presentation
201
- const signedVP = await vc.signPresentation({
236
+ const signedVP = await dbVc.signPresentation({
202
237
  presentation,
203
238
  suite,
204
239
  documentLoader: customDocumentLoader,
@@ -1,4 +1,3 @@
1
- import { generateViewLink } from '../utils/google.js';
2
1
  /**
3
2
  * @class GoogleDriveStorage
4
3
  * @description Class to interact with Google Drive API
@@ -19,7 +18,6 @@ export class GoogleDriveStorage {
19
18
  constructor(accessToken) {
20
19
  this.accessToken = accessToken;
21
20
  }
22
- // Method to fetch data from Google Drive API
23
21
  async fetcher({ method, headers, body, url }) {
24
22
  try {
25
23
  const res = await fetch(url, {
@@ -30,26 +28,39 @@ export class GoogleDriveStorage {
30
28
  }),
31
29
  body,
32
30
  });
33
- // Check for errors in the response
34
- const data = await res.json();
31
+ // Check the Content-Type to ensure it's JSON before parsing
32
+ const contentType = res.headers.get('Content-Type') || '';
33
+ let data;
34
+ if (contentType.includes('application/json')) {
35
+ data = await res.json();
36
+ }
37
+ else {
38
+ const text = await res.text();
39
+ console.error('Unexpected Response Type:', text);
40
+ throw new Error(`Expected JSON response but got: ${contentType}`);
41
+ }
42
+ // Handle non-200 HTTP responses
35
43
  if (!res.ok) {
36
44
  console.error('Error Response:', JSON.stringify(data));
37
- throw new Error(data.error.message || 'Unknown error');
45
+ throw new Error(data?.error?.message || 'Unknown error occurred');
38
46
  }
39
47
  return data;
40
48
  }
41
49
  catch (error) {
42
- console.error('Error fetching data:', error.message);
50
+ console.error('Error fetching data:', error.message || error);
43
51
  throw error;
44
52
  }
45
53
  }
46
- // Method to search for files in Google Drive by query
47
54
  async searchFiles(query) {
48
55
  const result = await this.fetcher({
49
56
  method: 'GET',
50
57
  headers: {},
51
58
  url: `https://www.googleapis.com/drive/v3/files?q=${encodeURIComponent(query)}&trashed=false&fields=files(id,name,mimeType,parents)`,
52
59
  });
60
+ if (!result.files) {
61
+ console.error('No files found:', result);
62
+ return [];
63
+ }
53
64
  return result.files;
54
65
  }
55
66
  async createFolder(folderName, parentFolderId) {
@@ -67,7 +78,7 @@ export class GoogleDriveStorage {
67
78
  console.log('Folder ID:', folder.id);
68
79
  return folder.id;
69
80
  }
70
- async save(data, folderId) {
81
+ async saveFile({ data, folderId }) {
71
82
  try {
72
83
  // Define file metadata, ensure correct folder is assigned
73
84
  const fileMetadata = {
@@ -79,86 +90,32 @@ export class GoogleDriveStorage {
79
90
  const formData = new FormData();
80
91
  formData.append('metadata', new Blob([JSON.stringify(fileMetadata)], { type: 'application/json' }));
81
92
  formData.append('file', new Blob([data.body], { type: fileMetadata.mimeType })); // Set file data and MIME type
93
+ // Upload file to Google Drive
82
94
  const file = await this.fetcher({
83
95
  method: 'POST',
84
96
  headers: {},
85
97
  body: formData,
86
- url: uploadUrl,
87
- });
88
- console.log('File uploaded successfully:', file.id);
89
- return file;
90
- }
91
- catch (error) {
92
- console.error('Error uploading file:', error.message);
93
- return null;
94
- }
95
- }
96
- /**
97
- * Add comment to VC
98
- * @param fileId - th id of VC file
99
- * @returns
100
- */
101
- async addCommentToFile(vcFileId, recommendationFileId) {
102
- if (!recommendationFileId || !vcFileId || !this.accessToken) {
103
- throw new Error('Missing required parameters: fileId, commentText, or accessToken');
104
- }
105
- const url = `https://www.googleapis.com/drive/v3/files/${vcFileId}/comments?fields=id,content,createdTime`;
106
- const body = {
107
- content: generateViewLink(recommendationFileId),
108
- };
109
- try {
110
- const response = await fetch(url, {
111
- method: 'POST',
112
- headers: {
113
- Authorization: `Bearer ${this.accessToken}`,
114
- 'Content-Type': 'application/json',
115
- },
116
- body: JSON.stringify(body),
98
+ url: `${uploadUrl}&fields=id,parents`, // Request the file ID and parent folder IDs
117
99
  });
118
- if (!response.ok) {
119
- const errorDetails = await response.json();
120
- throw new Error(`Failed to add comment: ${JSON.stringify(errorDetails)}`);
121
- }
122
- const result = await response.json();
123
- console.log('Comment added successfully:', result);
124
- return result;
125
- }
126
- catch (error) {
127
- console.error('Error adding comment to file:', error);
128
- throw error;
129
- }
130
- }
131
- /**
132
- * Add commenter role to a file
133
- * @param fileId
134
- * @returns
135
- */
136
- async addCommenterRoleToFile(fileId) {
137
- const url = `https://www.googleapis.com/drive/v3/files/${fileId}/permissions`;
138
- const body = {
139
- role: 'commenter',
140
- type: 'anyone',
141
- };
142
- try {
143
- const response = await fetch(url, {
100
+ // Set the file permission to "Anyone with the link" can view
101
+ const permissionUrl = `https://www.googleapis.com/drive/v3/files/${file.id}/permissions`;
102
+ const permissionData = {
103
+ role: 'reader',
104
+ type: 'anyone', // Public access
105
+ };
106
+ await this.fetcher({
144
107
  method: 'POST',
145
- headers: {
146
- Authorization: `Bearer ${this.accessToken}`,
147
- 'Content-Type': 'application/json',
148
- },
149
- body: JSON.stringify(body),
108
+ url: permissionUrl,
109
+ headers: {},
110
+ body: JSON.stringify(permissionData),
150
111
  });
151
- if (!response.ok) {
152
- const errorDetails = await response.json();
153
- throw new Error(`Failed to add permission: ${JSON.stringify(errorDetails)}`);
154
- }
155
- const result = await response.json();
156
- console.log('Permission added successfully:', result);
157
- return result;
112
+ console.log('Permission set to public for file:', file.id);
113
+ console.log('Parent folder IDs:', file.parents);
114
+ return file;
158
115
  }
159
116
  catch (error) {
160
- console.error('Error adding permission:', error.message);
161
- throw error;
117
+ console.error('Error uploading file or setting permission:', error.message);
118
+ return null;
162
119
  }
163
120
  }
164
121
  /**
@@ -167,25 +124,24 @@ export class GoogleDriveStorage {
167
124
  * @returns file content
168
125
  */
169
126
  async retrieve(id) {
170
- const metadataUrl = `https://www.googleapis.com/drive/v3/files/${id}?fields=name`;
127
+ const metadataUrl = `https://www.googleapis.com/drive/v3/files/${id}?fields=id,name`;
171
128
  const dataUrl = `https://www.googleapis.com/drive/v3/files/${id}?alt=media`;
172
129
  try {
173
- console.log(`Starting retrieval for file ID: ${id}`);
174
- // Fetch file metadata to get the name
175
- const metadataResponse = await fetch(metadataUrl, {
130
+ // Initial "touch" request to ensure file accessibility for the current user
131
+ const touchResponse = await fetch(metadataUrl, {
176
132
  method: 'GET',
177
133
  headers: {
178
134
  Authorization: `Bearer ${this.accessToken}`,
179
135
  },
180
136
  });
181
- if (!metadataResponse.ok) {
182
- const errorData = await metadataResponse.json();
183
- console.error(`Failed to retrieve metadata for file ID ${id}:`, errorData);
137
+ if (!touchResponse.ok) {
138
+ const errorData = await touchResponse.json();
139
+ console.error(`Failed to "touch" file for accessibility with ID ${id}:`, errorData);
184
140
  return null;
185
141
  }
186
- const metadata = await metadataResponse.json();
142
+ // Fetch file metadata to get the name
143
+ const metadata = await touchResponse.json();
187
144
  const fileName = metadata.name;
188
- console.log(`File name retrieved: ${fileName}`);
189
145
  // Fetch actual file data
190
146
  const dataResponse = await fetch(dataUrl, {
191
147
  method: 'GET',
@@ -221,9 +177,8 @@ export class GoogleDriveStorage {
221
177
  else {
222
178
  fileData = await dataResponse.arrayBuffer(); // Fallback for other binary types
223
179
  }
224
- console.log('🚀 ~ GoogleDriveStorage ~ retrieve ~ fileData:', fileData);
225
180
  // Return file ID, name, and data
226
- return { id, name: fileName, data: fileData };
181
+ return { id: metadata.id, name: fileName, data: fileData };
227
182
  }
228
183
  catch (error) {
229
184
  console.error(`Error retrieving file with ID ${id}:`, error.message);
@@ -232,7 +187,7 @@ export class GoogleDriveStorage {
232
187
  }
233
188
  /**
234
189
  * Get folder by folderId, if folderId == null you will have them all
235
- * @param id [Optional]
190
+ * @param folderId [Optional]
236
191
  * @returns
237
192
  */
238
193
  findFolders = async (folderId) => {
@@ -294,22 +249,6 @@ export class GoogleDriveStorage {
294
249
  return null;
295
250
  }
296
251
  };
297
- async getFileComments(fileId) {
298
- try {
299
- // Fetch comments on the file using Google Drive API
300
- const commentsResponse = await this.fetcher({
301
- method: 'GET',
302
- headers: {},
303
- url: `https://www.googleapis.com/drive/v3/files/${fileId}/comments?fields=comments(content,author/displayName,createdTime)`,
304
- });
305
- // Return the comments data if available
306
- return commentsResponse.comments || []; // Return an empty array if no comments
307
- }
308
- catch (error) {
309
- console.error(`Failed to fetch comments for file ID: ${fileId}`, error);
310
- return []; // Handle errors by returning an empty array or some error indication
311
- }
312
- }
313
252
  /**
314
253
  * Get all files content for the specified type ('KEYPAIRs' | 'VCs' | 'SESSIONs' | 'DIDs' | 'RECOMMENDATIONs')
315
254
  * @param type
@@ -317,42 +256,60 @@ export class GoogleDriveStorage {
317
256
  */
318
257
  async getAllFilesByType(type) {
319
258
  try {
320
- // Step 1: Find all root folders
259
+ // Step 1: Find the root 'Credentials' folder
321
260
  const rootFolders = await this.findFolders();
322
261
  const credentialsFolder = rootFolders.find((f) => f.name === 'Credentials');
323
- if (!credentialsFolder)
262
+ if (!credentialsFolder) {
263
+ console.error('Credentials folder not found.');
324
264
  return [];
265
+ }
325
266
  const credentialsFolderId = credentialsFolder.id;
326
- // Step 2: Find the subfolder corresponding to the specified type
267
+ // Step 2: Handle special case for 'VCs'
268
+ if (type === 'VCs') {
269
+ // Find the 'VCs' folder under 'Credentials'
270
+ const subfolders = await this.findFolders(credentialsFolderId);
271
+ const targetFolder = subfolders.find((f) => f.name === 'VCs');
272
+ if (!targetFolder) {
273
+ console.error(`Folder for type ${type} not found.`);
274
+ return [];
275
+ }
276
+ const targetFolderId = targetFolder.id;
277
+ // Fetch all 'VC-timestamp' subfolders under 'VCs'
278
+ const vcSubfolders = await this.findFolders(targetFolderId);
279
+ // Retrieve all 'VC.json' files from each 'VC-timestamp' subfolder
280
+ const fileContents = [];
281
+ for (const folder of vcSubfolders) {
282
+ const files = await this.findFilesUnderFolder(folder.id);
283
+ // Fetch the content of each file
284
+ for (const file of files) {
285
+ try {
286
+ const content = await this.retrieve(file.id);
287
+ fileContents.push(content);
288
+ }
289
+ catch (error) {
290
+ console.error(`Error retrieving content for file ${file.id}:`, error);
291
+ }
292
+ }
293
+ }
294
+ return fileContents;
295
+ }
296
+ // Step 3: Generic handling for other types
327
297
  const subfolders = await this.findFolders(credentialsFolderId);
328
298
  const targetFolder = subfolders.find((f) => f.name === type);
329
- if (!targetFolder)
299
+ if (!targetFolder) {
300
+ console.error(`Folder for type ${type} not found.`);
330
301
  return [];
331
- // Step 3: Fetch all files in the specified folder
302
+ }
332
303
  const filesResponse = await this.fetcher({
333
304
  method: 'GET',
334
305
  headers: {},
335
306
  url: `https://www.googleapis.com/drive/v3/files?q='${targetFolder.id}' in parents and trashed=false&fields=files(id,name,mimeType,parents)`,
336
307
  });
337
308
  const files = filesResponse.files;
338
- // Step 4: Fetch the content and comments of each file
339
309
  const fileContents = await Promise.all(files.map(async (file) => {
340
- // Fetch file content
341
- const content = await this.fetcher({
342
- method: 'GET',
343
- headers: {},
344
- url: `https://www.googleapis.com/drive/v3/files/${file.id}?alt=media`,
345
- });
346
- // Fetch file comments (if applicable)
347
- const comments = await this.getFileComments(file.id);
348
- return {
349
- id: file.id,
350
- name: file.name,
351
- content,
352
- comments: comments.map((comment) => comment.content),
353
- };
310
+ return await this.retrieve(file.id);
354
311
  }));
355
- return fileContents; // Return the list of files with their content and comments
312
+ return fileContents;
356
313
  }
357
314
  catch (error) {
358
315
  console.error(`Error getting files of type ${type}:`, error);
@@ -384,6 +341,81 @@ export class GoogleDriveStorage {
384
341
  throw error;
385
342
  }
386
343
  }
344
+ async findFileByName(name) {
345
+ // find the file named under Credentials folder
346
+ const rootFolders = await this.findFolders();
347
+ const credentialsFolderId = rootFolders.find((f) => f.name === 'Credentials')?.id;
348
+ if (!credentialsFolderId)
349
+ throw new Error('Credentials folder not found');
350
+ const files = await this.searchFiles(`'${credentialsFolderId}' in parents and name='${name}'`);
351
+ return files[0];
352
+ }
353
+ async findFilesUnderFolder(folderId) {
354
+ if (!folderId)
355
+ throw new Error('Folder ID is required');
356
+ console.log('🚀 ~ GoogleDriveStorage ~ findFilesUnderFolder ~ folderId', folderId);
357
+ const files = await this.searchFiles(`'${folderId}' in parents`);
358
+ return files;
359
+ }
360
+ async updateFileData(fileId, data) {
361
+ const fileMetadata = {
362
+ name: data.fileName,
363
+ mimeType: data.mimeType,
364
+ };
365
+ let uploadUrl = `https://www.googleapis.com/upload/drive/v3/files/${fileId}?uploadType=multipart`;
366
+ const formData = new FormData();
367
+ formData.append('metadata', new Blob([JSON.stringify(fileMetadata)], { type: 'application/json' }));
368
+ formData.append('file', new Blob([data.body], { type: fileMetadata.mimeType }));
369
+ const updatedFile = await this.fetcher({
370
+ method: 'PATCH',
371
+ headers: {},
372
+ body: JSON.stringify(formData),
373
+ url: `${uploadUrl}&fields=id,parents`,
374
+ });
375
+ console.log('File updated:', updatedFile);
376
+ return updatedFile;
377
+ }
378
+ async getFileParents(fileId) {
379
+ console.log('🚀 ~ GoogleDriveStorage ~ getFileParents ~ fileId', fileId);
380
+ const file = await this.fetcher({
381
+ method: 'GET',
382
+ headers: {},
383
+ url: `https://www.googleapis.com/drive/v3/files/${fileId}?fields=parents`,
384
+ });
385
+ return file.parents;
386
+ }
387
+ async updateRelationsFile({ relationsFileId, recommendationFileId }) {
388
+ const relationsFileContent = await this.retrieve(relationsFileId);
389
+ const relationsData = relationsFileContent.data;
390
+ relationsData.recommendations.push(recommendationFileId);
391
+ const updatedContent = JSON.stringify(relationsData);
392
+ const updateResponse = await this.fetcher({
393
+ method: 'PATCH',
394
+ headers: {
395
+ 'Content-Type': 'application/json',
396
+ },
397
+ body: updatedContent,
398
+ url: `https://www.googleapis.com/upload/drive/v3/files/${relationsFileId}?uploadType=media`,
399
+ });
400
+ console.log('🚀 ~ GoogleDriveStorage ~ updateRelationsFile ~ updateResponse:', updateResponse);
401
+ return updateResponse;
402
+ }
403
+ async createRelationsFile({ vcFolderId }) {
404
+ const files = await this.findFilesUnderFolder(vcFolderId);
405
+ const vcFile = files.find((file) => file.name === 'VC');
406
+ const relationsFile = await this.saveFile({
407
+ data: {
408
+ fileName: 'RELATIONS',
409
+ mimeType: 'application/json',
410
+ body: JSON.stringify({
411
+ vc_id: vcFile.id,
412
+ recommendations: [],
413
+ }),
414
+ },
415
+ folderId: vcFolderId,
416
+ });
417
+ return relationsFile;
418
+ }
387
419
  /**
388
420
  * Delete file by id
389
421
  * @param id
@@ -1,4 +1,11 @@
1
- import { DidDocument, KeyPair, VerifiableCredential } from '../../types/credential.js';
1
+ import { DidDocument, KeyPair, FormDataI, RecommendationFormDataI, VerifiableCredential } from '../../types/credential.js';
2
+ interface SignPropsI {
3
+ data: FormDataI | RecommendationFormDataI;
4
+ type: 'VC' | 'RECOMMENDATION';
5
+ keyPair: KeyPair;
6
+ issuerId: string;
7
+ vcFileId?: string;
8
+ }
2
9
  /**
3
10
  * Class representing the Credential Engine.
4
11
  * @class CredentialEngine
@@ -12,7 +19,6 @@ import { DidDocument, KeyPair, VerifiableCredential } from '../../types/credenti
12
19
  * @method signPresentation - Sign a Verifiable Presentation (VP).
13
20
  */
14
21
  export declare class CredentialEngine {
15
- private uuid;
16
22
  private storage;
17
23
  private keyPair;
18
24
  constructor(accessToken: string);
@@ -28,6 +34,10 @@ export declare class CredentialEngine {
28
34
  didDocument: DidDocument;
29
35
  keyPair: KeyPair;
30
36
  }>;
37
+ findKeysAndDIDs(): Promise<{
38
+ didDocument: any;
39
+ keyPair: any;
40
+ }>;
31
41
  /**
32
42
  * Create a new DID with user metamask address as controller
33
43
  * @param walletrAddress
@@ -43,10 +53,12 @@ export declare class CredentialEngine {
43
53
  * @param {'VC' | 'RECOMMENDATION'} type - The signature type.
44
54
  * @param {string} issuerId - The ID of the issuer [currently we put it as the did id]
45
55
  * @param {KeyPair} keyPair - The key pair to use for signing.
56
+ * @param {FormDataI | RecommendationFormDataI} formData - The form data to include in the VC.
57
+ * @param {string} VCId - The ID of the credential when the type is RECOMMENDATION
46
58
  * @returns {Promise<Credential>} The signed VC.
47
59
  * @throws Will throw an error if VC signing fails.
48
60
  */
49
- signVC(formData: any, type: 'VC' | 'RECOMMENDATION', keyPair: KeyPair, issuerId: string): Promise<any>;
61
+ signVC({ data, type, keyPair, issuerId, vcFileId }: SignPropsI): Promise<any>;
50
62
  /**
51
63
  * Verify a Verifiable Credential (VC)
52
64
  * @param {object} credential - The Verifiable Credential to verify.
@@ -67,3 +79,4 @@ export declare class CredentialEngine {
67
79
  */
68
80
  signPresentation(presentation: any): Promise<any>;
69
81
  }
82
+ export {};
@@ -1,4 +1,4 @@
1
- import { DataToSaveI } from '../../types';
1
+ import { DataToSaveI, FilesType } from '../../types';
2
2
  interface FileContent {
3
3
  name: string;
4
4
  content: any;
@@ -25,34 +25,23 @@ export declare class GoogleDriveStorage {
25
25
  private fetcher;
26
26
  private searchFiles;
27
27
  createFolder(folderName: string, parentFolderId?: string): Promise<string>;
28
- save(data: DataToSaveI, folderId: string): Promise<{
29
- id: string;
30
- } | null>;
31
- /**
32
- * Add comment to VC
33
- * @param fileId - th id of VC file
34
- * @returns
35
- */
36
- addCommentToFile(vcFileId: string, recommendationFileId: string): Promise<any>;
37
- /**
38
- * Add commenter role to a file
39
- * @param fileId
40
- * @returns
41
- */
42
- addCommenterRoleToFile(fileId: string): Promise<any>;
28
+ saveFile({ data, folderId }: {
29
+ data: DataToSaveI;
30
+ folderId: string;
31
+ }): Promise<any>;
43
32
  /**
44
33
  * Get file from google drive by id
45
34
  * @param id
46
35
  * @returns file content
47
36
  */
48
37
  retrieve(id: string): Promise<{
49
- id: string;
50
38
  name: string;
51
39
  data: any;
40
+ id: string;
52
41
  } | null>;
53
42
  /**
54
43
  * Get folder by folderId, if folderId == null you will have them all
55
- * @param id [Optional]
44
+ * @param folderId [Optional]
56
45
  * @returns
57
46
  */
58
47
  findFolders: (folderId?: string) => Promise<any[]>;
@@ -62,7 +51,6 @@ export declare class GoogleDriveStorage {
62
51
  * @returns last file content from folder by folderId
63
52
  */
64
53
  findLastFile: (folderId: string) => Promise<any>;
65
- getFileComments(fileId: string): Promise<any>;
66
54
  /**
67
55
  * Get all files content for the specified type ('KEYPAIRs' | 'VCs' | 'SESSIONs' | 'DIDs' | 'RECOMMENDATIONs')
68
56
  * @param type
@@ -76,6 +64,17 @@ export declare class GoogleDriveStorage {
76
64
  * @returns The updated file metadata, including the new name
77
65
  */
78
66
  updateFileName(fileId: string, newFileName: string): Promise<any>;
67
+ findFileByName(name: FilesType): Promise<any>;
68
+ findFilesUnderFolder(folderId: string): Promise<any[]>;
69
+ updateFileData(fileId: string, data: DataToSaveI): Promise<any>;
70
+ getFileParents(fileId: string): Promise<any>;
71
+ updateRelationsFile({ relationsFileId, recommendationFileId }: {
72
+ relationsFileId: string;
73
+ recommendationFileId: string;
74
+ }): Promise<any>;
75
+ createRelationsFile({ vcFolderId }: {
76
+ vcFolderId: string;
77
+ }): Promise<any>;
79
78
  /**
80
79
  * Delete file by id
81
80
  * @param id