@cooperation/vc-storage 1.0.0 → 1.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -1,8 +1,25 @@
1
+ import { generateViewLink } from '../utils/google.js';
2
+ /**
3
+ * @class GoogleDriveStorage
4
+ * @description Class to interact with Google Drive API
5
+ * @param accessToken - Access token to authenticate with Google Drive API
6
+ * @method createFolder - Create a new folder in Google Drive
7
+ * @method save - Save data to Google Drive
8
+ * @method addCommentToFile - Add a comment to a file in Google Drive
9
+ * @method addCommenterRoleToFile - Add commenter role to a file in Google Drive
10
+ * @method retrieve - Retrieve a file from Google Drive
11
+ * @method findFolders - Find folders in Google Drive
12
+ * @method findLastFile - Find the last file in a folder
13
+ * @method getAllVCs - Get all verifiable credentials from Google Drive
14
+ * @method getAllSessions - Get all sessions from Google Drive
15
+ * @method delete - Delete a file from Google Drive
16
+ */
1
17
  export class GoogleDriveStorage {
2
18
  accessToken;
3
19
  constructor(accessToken) {
4
20
  this.accessToken = accessToken;
5
21
  }
22
+ // Method to fetch data from Google Drive API
6
23
  async fetcher({ method, headers, body, url }) {
7
24
  try {
8
25
  const res = await fetch(url, {
@@ -13,18 +30,20 @@ export class GoogleDriveStorage {
13
30
  }),
14
31
  body,
15
32
  });
33
+ // Check for errors in the response
16
34
  const data = await res.json();
17
35
  if (!res.ok) {
18
- throw new Error(data.error.message);
36
+ console.error('Error Response:', JSON.stringify(data));
37
+ throw new Error(data.error.message || 'Unknown error');
19
38
  }
20
39
  return data;
21
40
  }
22
41
  catch (error) {
23
- console.error('Error fetching data:', error);
42
+ console.error('Error fetching data:', error.message);
24
43
  throw error;
25
44
  }
26
45
  }
27
- // New method to encapsulate search logic
46
+ // Method to search for files in Google Drive by query
28
47
  async searchFiles(query) {
29
48
  const result = await this.fetcher({
30
49
  method: 'GET',
@@ -50,28 +69,103 @@ export class GoogleDriveStorage {
50
69
  }
51
70
  async save(data, folderId) {
52
71
  try {
72
+ // Define file metadata, ensure correct folder is assigned
53
73
  const fileMetadata = {
54
74
  name: data.fileName,
55
- mimeType: data.mimeType,
56
- parents: [folderId],
75
+ parents: [folderId], // Specify the folder ID
76
+ mimeType: 'application/json', // Use provided MIME type or default to JSON
57
77
  };
78
+ let uploadUrl = 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart';
58
79
  const formData = new FormData();
59
80
  formData.append('metadata', new Blob([JSON.stringify(fileMetadata)], { type: 'application/json' }));
60
- formData.append('file', data.body);
81
+ formData.append('file', new Blob([data.body], { type: fileMetadata.mimeType })); // Set file data and MIME type
61
82
  const file = await this.fetcher({
62
83
  method: 'POST',
63
84
  headers: {},
64
85
  body: formData,
65
- url: 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart',
86
+ url: uploadUrl,
66
87
  });
67
- console.log('File uploaded:', file.id);
88
+ console.log('File uploaded successfully:', file.id);
68
89
  return file;
69
90
  }
70
91
  catch (error) {
71
- console.error('Error uploading file:', error);
92
+ console.error('Error uploading file:', error.message);
72
93
  return null;
73
94
  }
74
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),
117
+ });
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, {
144
+ method: 'POST',
145
+ headers: {
146
+ Authorization: `Bearer ${this.accessToken}`,
147
+ 'Content-Type': 'application/json',
148
+ },
149
+ body: JSON.stringify(body),
150
+ });
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;
158
+ }
159
+ catch (error) {
160
+ console.error('Error adding permission:', error.message);
161
+ throw error;
162
+ }
163
+ }
164
+ /**
165
+ * Get file from google drive by id
166
+ * @param id
167
+ * @returns file content
168
+ */
75
169
  async retrieve(id) {
76
170
  try {
77
171
  const file = await this.fetcher({
@@ -79,7 +173,6 @@ export class GoogleDriveStorage {
79
173
  headers: {},
80
174
  url: `https://www.googleapis.com/drive/v3/files/${id}?alt=media`,
81
175
  });
82
- console.log('File retrieved:', file);
83
176
  return file;
84
177
  }
85
178
  catch (error) {
@@ -87,13 +180,23 @@ export class GoogleDriveStorage {
87
180
  return null;
88
181
  }
89
182
  }
90
- findFolders = async (id) => {
91
- const query = id
92
- ? `'${id}' in parents and mimeType='application/vnd.google-apps.folder'`
183
+ /**
184
+ * Get folder by folderId, if folderId == null you will have them all
185
+ * @param id [Optional]
186
+ * @returns
187
+ */
188
+ findFolders = async (folderId) => {
189
+ const query = folderId
190
+ ? `'${folderId}' in parents and mimeType='application/vnd.google-apps.folder'`
93
191
  : `'root' in parents and mimeType='application/vnd.google-apps.folder'`;
94
192
  const folders = await this.searchFiles(query);
95
193
  return folders.filter((file) => file.mimeType === 'application/vnd.google-apps.folder');
96
194
  };
195
+ /**
196
+ * Get the last file from folder by folderId
197
+ * @param folderId
198
+ * @returns last file content from folder by folderId
199
+ */
97
200
  findLastFile = async (folderId) => {
98
201
  try {
99
202
  const files = await this.searchFiles(`'${folderId}' in parents`);
@@ -110,11 +213,14 @@ export class GoogleDriveStorage {
110
213
  content,
111
214
  };
112
215
  }));
216
+ // Find the latest file based on the timestamp in the file name
113
217
  const latestFile = fileContents.reduce((latest, current) => {
114
- const latestTimestamp = latest ? parseInt(latest.name.split('-')[1].split('.')[0], 10) : 0;
115
- const currentTimestamp = parseInt(current.name.split('-')[1].split('.')[0], 10);
218
+ // Assuming the file name is formatted as `${uuid}_${type}_${timestamp}.json`
219
+ const latestTimestamp = latest ? parseInt(latest.name.split('_')[2].split('.')[0], 10) : 0;
220
+ const currentTimestamp = parseInt(current.name.split('_')[2].split('.')[0], 10);
116
221
  return currentTimestamp > latestTimestamp ? current : latest;
117
222
  }, null);
223
+ // Return the content of the latest file
118
224
  return latestFile ? latestFile.content : null;
119
225
  }
120
226
  catch (error) {
@@ -122,40 +228,75 @@ export class GoogleDriveStorage {
122
228
  return null;
123
229
  }
124
230
  };
125
- async getAllClaims() {
126
- const rootFolders = await this.findFolders();
127
- const credentialsFolder = rootFolders.find((f) => f.name === 'Credentials');
128
- if (!credentialsFolder)
129
- return [];
130
- const credentialsFolderId = credentialsFolder.id;
131
- const subfolders = await this.findFolders(credentialsFolderId);
132
- const signedVCFolder = subfolders.find((f) => f.name === 'VCs');
133
- if (!signedVCFolder)
134
- return [];
135
- const claims = await this.fetcher({
136
- method: 'GET',
137
- headers: {},
138
- url: `https://www.googleapis.com/drive/v3/files?q='${signedVCFolder.id}' in parents and trashed=false&fields=files(id,name,mimeType,parents)`,
139
- });
140
- return claims;
231
+ async getFileComments(fileId) {
232
+ try {
233
+ // Fetch comments on the file using Google Drive API
234
+ const commentsResponse = await this.fetcher({
235
+ method: 'GET',
236
+ headers: {},
237
+ url: `https://www.googleapis.com/drive/v3/files/${fileId}/comments?fields=comments(content,author/displayName,createdTime)`,
238
+ });
239
+ // Return the comments data if available
240
+ return commentsResponse.comments || []; // Return an empty array if no comments
241
+ }
242
+ catch (error) {
243
+ console.error(`Failed to fetch comments for file ID: ${fileId}`, error);
244
+ return []; // Handle errors by returning an empty array or some error indication
245
+ }
141
246
  }
142
- async getAllSessions() {
143
- const rootFolders = await this.findFolders();
144
- const credentialsFolder = rootFolders.find((f) => f.name === 'Credentials');
145
- if (!credentialsFolder)
146
- return [];
147
- const credentialsFolderId = credentialsFolder.id;
148
- const subfolders = await this.findFolders(credentialsFolderId);
149
- const sessionsFolder = subfolders.find((f) => f.name === 'Sessions');
150
- if (!sessionsFolder)
151
- return [];
152
- const sessions = await this.fetcher({
153
- method: 'GET',
154
- headers: {},
155
- url: `https://www.googleapis.com/drive/v3/files?q='${sessionsFolder.id}' in parents and trashed=false&fields=files(id,name,mimeType,parents)`,
156
- });
157
- return sessions;
247
+ /**
248
+ * Get all files content for the specified type ('KEYPAIRs' | 'VCs' | 'SESSIONs' | 'DIDs' | 'RECOMMENDATIONs')
249
+ * @param type
250
+ * @returns
251
+ */
252
+ async getAllFilesByType(type) {
253
+ try {
254
+ // Step 1: Find all root folders
255
+ const rootFolders = await this.findFolders();
256
+ const credentialsFolder = rootFolders.find((f) => f.name === 'Credentials');
257
+ if (!credentialsFolder)
258
+ return [];
259
+ const credentialsFolderId = credentialsFolder.id;
260
+ // Step 2: Find the subfolder corresponding to the specified type
261
+ const subfolders = await this.findFolders(credentialsFolderId);
262
+ const targetFolder = subfolders.find((f) => f.name === type);
263
+ if (!targetFolder)
264
+ return [];
265
+ // Step 3: Fetch all files in the specified folder
266
+ const filesResponse = await this.fetcher({
267
+ method: 'GET',
268
+ headers: {},
269
+ url: `https://www.googleapis.com/drive/v3/files?q='${targetFolder.id}' in parents and trashed=false&fields=files(id,name,mimeType,parents)`,
270
+ });
271
+ const files = filesResponse.files;
272
+ // Step 4: Fetch the content and comments of each file
273
+ const fileContents = await Promise.all(files.map(async (file) => {
274
+ // Fetch file content
275
+ const content = await this.fetcher({
276
+ method: 'GET',
277
+ headers: {},
278
+ url: `https://www.googleapis.com/drive/v3/files/${file.id}?alt=media`,
279
+ });
280
+ // Fetch file comments (if applicable)
281
+ const comments = await this.getFileComments(file.id);
282
+ return {
283
+ name: file.name,
284
+ content,
285
+ comments: comments.map((comment) => comment.content),
286
+ };
287
+ }));
288
+ return fileContents; // Return the list of files with their content and comments
289
+ }
290
+ catch (error) {
291
+ console.error(`Error getting files of type ${type}:`, error);
292
+ return []; // Return an empty array on error
293
+ }
158
294
  }
295
+ /**
296
+ * Delete file by id
297
+ * @param id
298
+ * @returns
299
+ */
159
300
  async delete(id) {
160
301
  try {
161
302
  const response = await this.fetcher({
@@ -1,3 +1,4 @@
1
1
  export * from './models/GoogleDriveStorage.js';
2
2
  export * from './models/CredentialEngine.js';
3
- export { saveToGoogleDrive } from './utils/saveToGoogle.js';
3
+ export * from './utils/google.js';
4
+ export * from './utils/presentation.js';
@@ -1,12 +1,24 @@
1
- import { KeyPair, FormDataI, Credential, DidDocument } from '../../types/Credential.js';
2
- export declare const customDocumentLoader: (url: string) => Promise<any>;
1
+ import { DidDocument, KeyPair, VerifiableCredential } from '../../types/credential.js';
2
+ /**
3
+ * Class representing the Credential Engine.
4
+ * @class CredentialEngine
5
+ * @param {string} accessToken - The access token for the user.
6
+ * @classdesc Credential Engine class to create DIDs and VCs.
7
+ * @method createDID - Create a new DID with Digital Bazaar's Ed25519VerificationKey2020 key pair.
8
+ * @method createWalletDID - Create a new DID with user metamask address as controller.
9
+ * @method signVC - Sign a Verifiable Credential (VC).
10
+ * @method verifyCredential - Verify a Verifiable Credential (VC).
11
+ * @method createPresentation - Create a Verifiable Presentation (VP).
12
+ * @method signPresentation - Sign a Verifiable Presentation (VP).
13
+ */
3
14
  export declare class CredentialEngine {
4
- /**
5
- * Create a DID document using the provided key pair.
6
- * @param {object} keyPair - The key pair used to create the DID document.
7
- * @returns {Promise<object>} The created DID document.
8
- */
9
- private generateDIDSchema;
15
+ private uuid;
16
+ private storage;
17
+ private keyPair;
18
+ constructor(accessToken: string);
19
+ private getKeyPair;
20
+ private generateKeyPair;
21
+ private verifyCreds;
10
22
  /**
11
23
  * Create a new DID with Digital Bazaar's Ed25519VerificationKey2020 key pair.
12
24
  * @returns {Promise<{didDocument: object, keyPair: object}>} The created DID document and key pair.
@@ -26,20 +38,32 @@ export declare class CredentialEngine {
26
38
  didDocument: DidDocument;
27
39
  keyPair: KeyPair;
28
40
  }>;
29
- /**
30
- * Create an unsigned Verifiable Credential (VC)
31
- * @param {object} formData - The form data to include in the VC.
32
- * @param {string} issuerDid - The DID of the issuer.
33
- * @returns {Promise<object>} The created unsigned VC.
34
- * @throws Will throw an error if unsigned VC creation fails.
35
- */
36
- createUnsignedVC(formData: FormDataI, issuerDid: string): Promise<Credential>;
37
41
  /**
38
42
  * Sign a Verifiable Credential (VC)
39
- * @param {object} credential - The credential to sign.
40
- * @param {object} keyPair - The key pair to use for signing.
41
- * @returns {Promise<object>} The signed VC.
43
+ * @param {'VC' | 'RECOMMENDATION'} type - The signature type.
44
+ * @param {string} issuerId - The ID of the issuer [currently we put it as the did id]
45
+ * @param {KeyPair} keyPair - The key pair to use for signing.
46
+ * @returns {Promise<Credential>} The signed VC.
42
47
  * @throws Will throw an error if VC signing fails.
43
48
  */
44
- signVC(credential: Credential, keyPair: KeyPair): Promise<Credential>;
49
+ signVC(formData: any, type: 'VC' | 'RECOMMENDATION', keyPair: KeyPair, issuerId: string): Promise<any>;
50
+ /**
51
+ * Verify a Verifiable Credential (VC)
52
+ * @param {object} credential - The Verifiable Credential to verify.
53
+ * @returns {Promise<boolean>} The verification result.
54
+ * @throws Will throw an error if VC verification fails.
55
+ */
56
+ verifyCredential(credential: VerifiableCredential): Promise<boolean>;
57
+ /**
58
+ * Create a Verifiable Presentation (VP)
59
+ * @param verifiableCredential
60
+ * @returns
61
+ */
62
+ createPresentation(verifiableCredential: VerifiableCredential[]): Promise<any>;
63
+ /**
64
+ * Sign a Verifiable Presentation (VP)
65
+ * @param presentation
66
+ * @returns
67
+ */
68
+ signPresentation(presentation: any): Promise<any>;
45
69
  }
@@ -1,4 +1,24 @@
1
1
  import { DataToSaveI } from '../../types';
2
+ interface FileContent {
3
+ name: string;
4
+ content: any;
5
+ comments: string[];
6
+ }
7
+ /**
8
+ * @class GoogleDriveStorage
9
+ * @description Class to interact with Google Drive API
10
+ * @param accessToken - Access token to authenticate with Google Drive API
11
+ * @method createFolder - Create a new folder in Google Drive
12
+ * @method save - Save data to Google Drive
13
+ * @method addCommentToFile - Add a comment to a file in Google Drive
14
+ * @method addCommenterRoleToFile - Add commenter role to a file in Google Drive
15
+ * @method retrieve - Retrieve a file from Google Drive
16
+ * @method findFolders - Find folders in Google Drive
17
+ * @method findLastFile - Find the last file in a folder
18
+ * @method getAllVCs - Get all verifiable credentials from Google Drive
19
+ * @method getAllSessions - Get all sessions from Google Drive
20
+ * @method delete - Delete a file from Google Drive
21
+ */
2
22
  export declare class GoogleDriveStorage {
3
23
  private accessToken;
4
24
  constructor(accessToken: string);
@@ -8,10 +28,48 @@ export declare class GoogleDriveStorage {
8
28
  save(data: DataToSaveI, folderId: string): Promise<{
9
29
  id: string;
10
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>;
43
+ /**
44
+ * Get file from google drive by id
45
+ * @param id
46
+ * @returns file content
47
+ */
11
48
  retrieve(id: string): Promise<any>;
12
- findFolders: (id?: string) => Promise<any[]>;
49
+ /**
50
+ * Get folder by folderId, if folderId == null you will have them all
51
+ * @param id [Optional]
52
+ * @returns
53
+ */
54
+ findFolders: (folderId?: string) => Promise<any[]>;
55
+ /**
56
+ * Get the last file from folder by folderId
57
+ * @param folderId
58
+ * @returns last file content from folder by folderId
59
+ */
13
60
  findLastFile: (folderId: string) => Promise<any>;
14
- getAllClaims(): Promise<any>;
15
- getAllSessions(): Promise<any>;
61
+ getFileComments(fileId: string): Promise<any>;
62
+ /**
63
+ * Get all files content for the specified type ('KEYPAIRs' | 'VCs' | 'SESSIONs' | 'DIDs' | 'RECOMMENDATIONs')
64
+ * @param type
65
+ * @returns
66
+ */
67
+ getAllFilesByType(type: 'KEYPAIRs' | 'VCs' | 'SESSIONs' | 'DIDs' | 'RECOMMENDATIONs'): Promise<FileContent[]>;
68
+ /**
69
+ * Delete file by id
70
+ * @param id
71
+ * @returns
72
+ */
16
73
  delete(id: string): Promise<any>;
17
74
  }
75
+ export {};
@@ -0,0 +1,23 @@
1
+ import { KeyPair, DidDocument, FormDataI, RecommendationCredential, Credential, RecommendationFormDataI, VerifiableCredential } from '../../types/credential';
2
+ /**
3
+ * Create a DID document using the provided key pair.
4
+ * @param {object} keyPair - The key pair used to create the DID document.
5
+ * @returns {Promise<object>} The created DID document.
6
+ */
7
+ export declare const generateDIDSchema: (keyPair: KeyPair) => Promise<DidDocument>;
8
+ /**
9
+ * Generate an unsigned Verifiable Credential (VC)
10
+ * @param {object} formData - The form data to include in the VC.
11
+ * @param {string} issuerDid - The DID of the issuer.
12
+ * @param {string} vcId - The ID of the credential generated by uuidv4()
13
+ * @returns {Promise<object>} The created unsigned VC.
14
+ * @throws Will throw an error if unsigned VC creation fails.
15
+ */
16
+ export declare function generateUnsignedVC(formData: FormDataI, issuerDid: string, vcId: string): Credential;
17
+ export declare function generateUnsignedRecommendation(recommendation: RecommendationFormDataI, issuerDid: string): RecommendationCredential;
18
+ /**
19
+ * Extracts the keypair from a Verifiable Credential
20
+ * @param {Object} credential - The signed Verifiable Credential
21
+ * @returns {Ed25519VerificationKey2020} keyPair - The generated keypair object
22
+ */
23
+ export declare function extractKeyPairFromCredential(credential: VerifiableCredential): Promise<KeyPair>;
@@ -0,0 +1 @@
1
+ export declare const customDocumentLoader: (url: any) => Promise<any>;
@@ -0,0 +1,14 @@
1
+ import { GoogleDriveStorage } from '../models/GoogleDriveStorage.js';
2
+ /**
3
+ * keyFile name = {uuid}-type-timestamp // we need that
4
+ * vc.id = urn-uuid-{uuid} // we got that
5
+ * Save data to Google Drive in the specified folder type.
6
+ * @param {object} data - The data to save.
7
+ * @param {'VC' | 'DID' | 'SESSION' | 'RECOMMENDATION' | 'KEYPAIR'} type - The type of data being saved.
8
+ * @returns {Promise<object>} - The file object saved to Google Drive.
9
+ * @param {string} uuid - Optional unique identifier for the VC.
10
+ * @throws Will throw an error if the save operation fails.
11
+ */
12
+ export declare function saveToGoogleDrive(storage: GoogleDriveStorage, data: any, type: 'VC' | 'DID' | 'SESSION' | 'RECOMMENDATION' | 'KEYPAIR', uuid?: string): Promise<object>;
13
+ export declare function generateViewLink(fileId: string): string;
14
+ export declare function extractGoogleDriveFileId(url: string): string | null;
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Create and sign a Verifiable Presentation (VP) from a given Verifiable Credential (VC) file and any associated recommendations.
3
+ * @param {string} accessTokens - The access tokens for the user.
4
+ * @param {string} vcFileId - The ID of the Verifiable Credential (VC) file in Google Drive.
5
+ * @returns {Promise<{ signedPresentation: object } | null>} - The signed Verifiable Presentation (VP) or null if an error occurs.
6
+ * @throws Will throw an error if the VC is not found, a matching key pair cannot be located, or any part of the signing process fails.
7
+ */
8
+ export declare const createAndSignVerifiablePresentation: (accessTokens: string, vcFileId: string) => Promise<{
9
+ signedPresentation: object;
10
+ } | null>;
@@ -1,10 +1,10 @@
1
+ import { GoogleDriveStorage } from '../models/GoogleDriveStorage.js';
1
2
  /**
2
3
  * Save data to Google Drive in the specified folder type.
3
4
  * @param {object} data - The data to save.
4
5
  * @param {'VC' | 'DID' | 'UnsignedVC'} type - The type of data being saved.
6
+ * @returns {Promise<object>} - The file object saved to Google Drive.
5
7
  * @throws Will throw an error if the save operation fails.
6
8
  */
7
- import { GoogleDriveStorage } from '../models/GoogleDriveStorage';
8
- export declare function saveToGoogleDrive(storage: GoogleDriveStorage, data: any, type: 'VC' | 'DID' | 'UnsignedVC' | 'SESSION'): Promise<{
9
- id: string;
10
- }>;
9
+ export declare function saveToGoogleDrive(storage: GoogleDriveStorage, data: any, type: 'VC' | 'DID' | 'SESSION' | 'RECOMMENDATION'): Promise<object>;
10
+ export declare function generateViewLink(fileId: string): string;