@cooperation/vc-storage 1.0.8 → 1.0.11
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.
@@ -73,12 +73,13 @@ export class GoogleDriveStorage {
|
|
73
73
|
const fileMetadata = {
|
74
74
|
name: data.fileName,
|
75
75
|
parents: [folderId], // Specify the folder ID
|
76
|
-
mimeType:
|
76
|
+
mimeType: data.mimeType,
|
77
77
|
};
|
78
78
|
let uploadUrl = 'https://www.googleapis.com/upload/drive/v3/files?uploadType=multipart';
|
79
79
|
const formData = new FormData();
|
80
80
|
formData.append('metadata', new Blob([JSON.stringify(fileMetadata)], { type: 'application/json' }));
|
81
81
|
formData.append('file', new Blob([data.body], { type: fileMetadata.mimeType })); // Set file data and MIME type
|
82
|
+
// Upload file to Google Drive
|
82
83
|
const file = await this.fetcher({
|
83
84
|
method: 'POST',
|
84
85
|
headers: {},
|
@@ -86,10 +87,25 @@ export class GoogleDriveStorage {
|
|
86
87
|
url: uploadUrl,
|
87
88
|
});
|
88
89
|
console.log('File uploaded successfully:', file.id);
|
89
|
-
|
90
|
+
// Set the file permission to "Anyone with the link" can view
|
91
|
+
const permissionUrl = `https://www.googleapis.com/drive/v3/files/${file.id}/permissions`;
|
92
|
+
const permissionData = {
|
93
|
+
role: 'reader',
|
94
|
+
type: 'anyone', // Public access
|
95
|
+
};
|
96
|
+
await this.fetcher({
|
97
|
+
method: 'POST',
|
98
|
+
url: permissionUrl,
|
99
|
+
headers: {
|
100
|
+
'Content-Type': 'application/json',
|
101
|
+
},
|
102
|
+
body: JSON.stringify(permissionData),
|
103
|
+
});
|
104
|
+
console.log('Permission set to public for file:', file.id);
|
105
|
+
return { id: file.id };
|
90
106
|
}
|
91
107
|
catch (error) {
|
92
|
-
console.error('Error uploading file:', error.message);
|
108
|
+
console.error('Error uploading file or setting permission:', error.message);
|
93
109
|
return null;
|
94
110
|
}
|
95
111
|
}
|
@@ -167,16 +183,66 @@ export class GoogleDriveStorage {
|
|
167
183
|
* @returns file content
|
168
184
|
*/
|
169
185
|
async retrieve(id) {
|
186
|
+
const metadataUrl = `https://www.googleapis.com/drive/v3/files/${id}?fields=name`;
|
187
|
+
const dataUrl = `https://www.googleapis.com/drive/v3/files/${id}?alt=media`;
|
170
188
|
try {
|
171
|
-
|
189
|
+
console.log(`Starting retrieval for file ID: ${id}`);
|
190
|
+
// Fetch file metadata to get the name
|
191
|
+
const metadataResponse = await fetch(metadataUrl, {
|
172
192
|
method: 'GET',
|
173
|
-
headers: {
|
174
|
-
|
193
|
+
headers: {
|
194
|
+
Authorization: `Bearer ${this.accessToken}`,
|
195
|
+
},
|
196
|
+
});
|
197
|
+
if (!metadataResponse.ok) {
|
198
|
+
const errorData = await metadataResponse.json();
|
199
|
+
console.error(`Failed to retrieve metadata for file ID ${id}:`, errorData);
|
200
|
+
return null;
|
201
|
+
}
|
202
|
+
const metadata = await metadataResponse.json();
|
203
|
+
const fileName = metadata.name;
|
204
|
+
console.log(`File name retrieved: ${fileName}`);
|
205
|
+
// Fetch actual file data
|
206
|
+
const dataResponse = await fetch(dataUrl, {
|
207
|
+
method: 'GET',
|
208
|
+
headers: {
|
209
|
+
Authorization: `Bearer ${this.accessToken}`,
|
210
|
+
},
|
175
211
|
});
|
176
|
-
|
212
|
+
if (!dataResponse.ok) {
|
213
|
+
const errorData = await dataResponse.json();
|
214
|
+
console.error(`Failed to retrieve file data for ID ${id}:`, errorData);
|
215
|
+
return null;
|
216
|
+
}
|
217
|
+
const contentType = dataResponse.headers.get('Content-Type');
|
218
|
+
console.log(`File content type: ${contentType}`);
|
219
|
+
let fileData;
|
220
|
+
if (contentType?.includes('application/json')) {
|
221
|
+
fileData = await dataResponse.json();
|
222
|
+
}
|
223
|
+
else if (contentType?.includes('text') || contentType?.includes('image/svg+xml')) {
|
224
|
+
fileData = await dataResponse.text(); // Fetch SVG files as text for easy manipulation
|
225
|
+
}
|
226
|
+
else if (contentType?.includes('image') ||
|
227
|
+
contentType?.includes('video') ||
|
228
|
+
contentType?.includes('audio') ||
|
229
|
+
contentType?.includes('application/octet-stream') ||
|
230
|
+
contentType?.includes('application/pdf') ||
|
231
|
+
contentType?.includes('application/msword') ||
|
232
|
+
contentType?.includes('application/vnd.openxmlformats-officedocument.wordprocessingml.document') ||
|
233
|
+
contentType?.includes('application/vnd.ms-excel') ||
|
234
|
+
contentType?.includes('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet')) {
|
235
|
+
fileData = await dataResponse.blob();
|
236
|
+
}
|
237
|
+
else {
|
238
|
+
fileData = await dataResponse.arrayBuffer(); // Fallback for other binary types
|
239
|
+
}
|
240
|
+
console.log('🚀 ~ GoogleDriveStorage ~ retrieve ~ fileData:', fileData);
|
241
|
+
// Return file ID, name, and data
|
242
|
+
return { id, name: fileName, data: fileData };
|
177
243
|
}
|
178
244
|
catch (error) {
|
179
|
-
console.error(
|
245
|
+
console.error(`Error retrieving file with ID ${id}:`, error.message);
|
180
246
|
return null;
|
181
247
|
}
|
182
248
|
}
|
@@ -309,6 +375,31 @@ export class GoogleDriveStorage {
|
|
309
375
|
return []; // Return an empty array on error
|
310
376
|
}
|
311
377
|
}
|
378
|
+
/**
|
379
|
+
* Update the name of a file in Google Drive
|
380
|
+
* @param fileId - The ID of the file to update
|
381
|
+
* @param newFileName - The new name for the file
|
382
|
+
* @returns The updated file metadata, including the new name
|
383
|
+
*/
|
384
|
+
async updateFileName(fileId, newFileName) {
|
385
|
+
try {
|
386
|
+
const metadata = {
|
387
|
+
name: newFileName, // New name for the file
|
388
|
+
};
|
389
|
+
const updatedFile = await this.fetcher({
|
390
|
+
method: 'PATCH',
|
391
|
+
headers: { 'Content-Type': 'application/json' },
|
392
|
+
body: JSON.stringify(metadata),
|
393
|
+
url: `https://www.googleapis.com/drive/v3/files/${fileId}`,
|
394
|
+
});
|
395
|
+
console.log('File name updated successfully:', updatedFile.name);
|
396
|
+
return updatedFile;
|
397
|
+
}
|
398
|
+
catch (error) {
|
399
|
+
console.error('Error updating file name:', error.message);
|
400
|
+
throw error;
|
401
|
+
}
|
402
|
+
}
|
312
403
|
/**
|
313
404
|
* Delete file by id
|
314
405
|
* @param id
|
@@ -45,7 +45,11 @@ export declare class GoogleDriveStorage {
|
|
45
45
|
* @param id
|
46
46
|
* @returns file content
|
47
47
|
*/
|
48
|
-
retrieve(id: string): Promise<
|
48
|
+
retrieve(id: string): Promise<{
|
49
|
+
id: string;
|
50
|
+
name: string;
|
51
|
+
data: any;
|
52
|
+
} | null>;
|
49
53
|
/**
|
50
54
|
* Get folder by folderId, if folderId == null you will have them all
|
51
55
|
* @param id [Optional]
|
@@ -64,7 +68,14 @@ export declare class GoogleDriveStorage {
|
|
64
68
|
* @param type
|
65
69
|
* @returns
|
66
70
|
*/
|
67
|
-
getAllFilesByType(type: 'KEYPAIRs' | 'VCs' | 'SESSIONs' | 'DIDs' | 'RECOMMENDATIONs'): Promise<FileContent[]>;
|
71
|
+
getAllFilesByType(type: 'KEYPAIRs' | 'VCs' | 'SESSIONs' | 'DIDs' | 'RECOMMENDATIONs' | 'MEDIAs'): Promise<FileContent[]>;
|
72
|
+
/**
|
73
|
+
* Update the name of a file in Google Drive
|
74
|
+
* @param fileId - The ID of the file to update
|
75
|
+
* @param newFileName - The new name for the file
|
76
|
+
* @returns The updated file metadata, including the new name
|
77
|
+
*/
|
78
|
+
updateFileName(fileId: string, newFileName: string): Promise<any>;
|
68
79
|
/**
|
69
80
|
* Delete file by id
|
70
81
|
* @param id
|
@@ -14,9 +14,11 @@ export declare function saveToGoogleDrive(storage: GoogleDriveStorage, data: any
|
|
14
14
|
* Upload an image to Google Drive in the Credentials/MEDIAs folder.
|
15
15
|
* @param {GoogleDriveStorage} storage - The GoogleDriveStorage instance.
|
16
16
|
* @param {File} imageFile - The image file to upload.
|
17
|
-
* @returns {Promise
|
17
|
+
* @returns {Promise<>} - The uploaded image file object.
|
18
18
|
* @throws Will throw an error if the upload operation fails.
|
19
19
|
*/
|
20
|
-
export declare function uploadImageToGoogleDrive(storage: GoogleDriveStorage, imageFile: File): Promise<
|
20
|
+
export declare function uploadImageToGoogleDrive(storage: GoogleDriveStorage, imageFile: File): Promise<{
|
21
|
+
id: string;
|
22
|
+
}>;
|
21
23
|
export declare function generateViewLink(fileId: string): string;
|
22
24
|
export declare function extractGoogleDriveFileId(url: string): string | null;
|
package/dist/utils/google.js
CHANGED
@@ -63,38 +63,28 @@ export async function saveToGoogleDrive(storage, data, type, uuid) {
|
|
63
63
|
* Upload an image to Google Drive in the Credentials/MEDIAs folder.
|
64
64
|
* @param {GoogleDriveStorage} storage - The GoogleDriveStorage instance.
|
65
65
|
* @param {File} imageFile - The image file to upload.
|
66
|
-
* @returns {Promise
|
66
|
+
* @returns {Promise<>} - The uploaded image file object.
|
67
67
|
* @throws Will throw an error if the upload operation fails.
|
68
68
|
*/
|
69
69
|
export async function uploadImageToGoogleDrive(storage, imageFile) {
|
70
70
|
try {
|
71
|
-
// Get all root folders
|
72
71
|
const rootFolders = await storage.findFolders();
|
73
|
-
console.log('Root folders:', rootFolders);
|
74
|
-
// Find or create the "Credentials" folder
|
75
72
|
let credentialsFolder = rootFolders.find((f) => f.name === 'Credentials');
|
76
73
|
let credentialsFolderId;
|
77
74
|
if (!credentialsFolder) {
|
78
75
|
credentialsFolderId = await storage.createFolder('Credentials');
|
79
|
-
console.log('Created Credentials folder with ID:', credentialsFolderId);
|
80
76
|
}
|
81
77
|
else {
|
82
78
|
credentialsFolderId = credentialsFolder.id;
|
83
|
-
console.log('Found Credentials folder with ID:', credentialsFolderId);
|
84
79
|
}
|
85
|
-
// Get subfolders within the "Credentials" folder
|
86
80
|
const subfolders = await storage.findFolders(credentialsFolderId);
|
87
|
-
console.log(`Subfolders in Credentials (ID: ${credentialsFolderId}):`, subfolders);
|
88
|
-
// Find or create the "MEDIAs" folder
|
89
81
|
let mediasFolder = subfolders.find((f) => f.name === 'MEDIAs');
|
90
82
|
let mediasFolderId;
|
91
83
|
if (!mediasFolder) {
|
92
84
|
mediasFolderId = await storage.createFolder('MEDIAs', credentialsFolderId);
|
93
|
-
console.log('Created MEDIAs folder with ID:', mediasFolderId);
|
94
85
|
}
|
95
86
|
else {
|
96
87
|
mediasFolderId = mediasFolder.id;
|
97
|
-
console.log('Found MEDIAs folder with ID:', mediasFolderId);
|
98
88
|
}
|
99
89
|
// Prepare the image file data
|
100
90
|
const imageData = {
|
@@ -105,10 +95,6 @@ export async function uploadImageToGoogleDrive(storage, imageFile) {
|
|
105
95
|
// Save the image in the "MEDIAs" folder
|
106
96
|
const uploadedImage = await storage.save(imageData, mediasFolderId);
|
107
97
|
console.log(`Image uploaded: ${uploadedImage?.id} to MEDIAs folder in Credentials`);
|
108
|
-
if (uploadedImage && uploadedImage.id) {
|
109
|
-
console.log('Sharing image file with second user...');
|
110
|
-
await storage.addCommenterRoleToFile(uploadedImage.id);
|
111
|
-
}
|
112
98
|
return uploadedImage;
|
113
99
|
}
|
114
100
|
catch (error) {
|
@@ -36,7 +36,7 @@ export const createAndSignVerifiablePresentation = async (accessTokens, vcFileId
|
|
36
36
|
}
|
37
37
|
}
|
38
38
|
// Create Verifiable Presentation (VP) with the retrieved VC
|
39
|
-
const presentation = await engine.createPresentation([verifiableCredential, ...recommendations]); //! do not edit the array order!!
|
39
|
+
const presentation = await engine.createPresentation([verifiableCredential.data, ...recommendations]); //! do not edit the array order!!
|
40
40
|
// Use the key pair to sign the presentation
|
41
41
|
const signedPresentation = await engine.signPresentation(presentation);
|
42
42
|
return { signedPresentation };
|
package/package.json
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
{
|
2
2
|
"name": "@cooperation/vc-storage",
|
3
3
|
"type": "module",
|
4
|
-
"version": "1.0.
|
4
|
+
"version": "1.0.11",
|
5
5
|
"description": "Sign and store your verifiable credentials.",
|
6
6
|
"main": "dist/index.js",
|
7
7
|
"types": "dist/types/index.d.ts",
|
@@ -16,7 +16,6 @@
|
|
16
16
|
"author": "cooperation",
|
17
17
|
"license": "ISC",
|
18
18
|
"dependencies": {
|
19
|
-
"@cooperation/vc-storage": "^1.0.6",
|
20
19
|
"@digitalbazaar/did-method-key": "^5.2.0",
|
21
20
|
"@digitalbazaar/ed25519-signature-2020": "^5.3.0",
|
22
21
|
"@digitalbazaar/ed25519-verification-key-2020": "^4.1.0",
|