@cooperation/vc-storage 1.0.0 → 1.0.4

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.
@@ -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;