@progressive-development/pd-spa-helper 0.3.35 → 0.3.37

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.
package/package.json CHANGED
@@ -3,7 +3,7 @@
3
3
  "description": "Webcomponent pd-spa-helper following open-wc recommendations",
4
4
  "license": "MIT",
5
5
  "author": "pd-spa-helper",
6
- "version": "0.3.35",
6
+ "version": "0.3.37",
7
7
  "main": "dist/src/index.js",
8
8
  "module": "dist/src/index.js",
9
9
  "exports": {
package/src/index.ts CHANGED
@@ -32,7 +32,9 @@ export {
32
32
  callFunctionImpl,
33
33
  uploadFile,
34
34
  downloadFile,
35
+ deleteFile,
35
36
  getStorageFileList,
37
+ getStorageFile,
36
38
  activateCollectionListener,
37
39
  } from './service-provider/service-provider-impl.js'
38
40
 
@@ -1,5 +1,5 @@
1
1
  import { FirebaseApp } from 'firebase/app';
2
- import { FirebaseStorage, FullMetadata, ListResult, StorageReference, UploadResult, getDownloadURL, getMetadata, getStorage, listAll, ref, uploadString } from "firebase/storage";
2
+ import { FirebaseStorage, FullMetadata, ListResult, StorageReference, UploadResult, deleteObject, getDownloadURL, getMetadata, getStorage, listAll, ref, uploadString } from "firebase/storage";
3
3
 
4
4
  import { FileStorageConfig, StorageDocument, UploadFile } from '../service-provider-model.js';
5
5
  import { getUser } from '../service-provider-impl.js';
@@ -92,6 +92,7 @@ export const uploadFirestorageFile = (file: UploadFile):Promise<UploadResult> =>
92
92
  'creator': (getUser() as any)?.displayName,
93
93
  'comment': file.description,
94
94
  'name': file.descriptionName,
95
+ 'readonly': file.readonly ? "true" : "false",
95
96
  }
96
97
  };
97
98
 
@@ -121,6 +122,7 @@ const fetchItemsAndFolders = async (
121
122
  descriptionName: metadata.customMetadata?.name,
122
123
  description: metadata.customMetadata?.comment,
123
124
  size: metadata.size,
125
+ readonly: metadata.customMetadata?.readonly === "true",
124
126
  metaData: metadata
125
127
  });
126
128
 
@@ -175,6 +177,58 @@ const fetchItemsAndFolders = async (
175
177
  }
176
178
  }
177
179
 
180
+ // Funktion, um `StorageDocument` von einer `storageURI` zu erstellen
181
+ export const getFirestorageFile = async (
182
+ storageName: string,
183
+ refKey:string,
184
+ storageURI: string,
185
+ includeMetaData = false
186
+ ): Promise<StorageDocument> => {
187
+ try {
188
+
189
+ if (!storageMap || storageMap.size === 0) {
190
+ throw new Error("No storage is configured");
191
+ }
192
+
193
+ // get storage
194
+ const storageConf = storageMap.get(storageName);
195
+ if (!storageConf ) {
196
+ throw new Error(`Invalid storage name: ${storageName}`);
197
+ }
198
+ const storageRef = ref(storageConf.storage, storageURI);
199
+
200
+ // Basis-StorageDocument ohne Metadaten
201
+ const storageDocument: StorageDocument = {
202
+ fileName: storageRef.name,
203
+ filePath: storageRef.fullPath,
204
+ storageName,
205
+ refKey,
206
+ };
207
+
208
+ // Falls Metadaten angefordert, lade und füge sie hinzu
209
+ if (includeMetaData) {
210
+ const metadata = await getMetadata(storageRef);
211
+
212
+ return {
213
+ ...storageDocument,
214
+ creation: new Date(metadata.timeCreated),
215
+ documentType: metadata.contentType,
216
+ creator: metadata.customMetadata?.creator,
217
+ descriptionName: metadata.customMetadata?.name,
218
+ description: metadata.customMetadata?.comment,
219
+ size: metadata.size,
220
+ readonly: metadata.customMetadata?.readonly === "true",
221
+ metaData: metadata
222
+ };
223
+ }
224
+
225
+ return storageDocument; // Rückgabe ohne Metadaten
226
+ } catch (error) {
227
+ console.error("Error creating StorageDocument:", error);
228
+ throw error;
229
+ }
230
+ };
231
+
178
232
  export const getFirestorageFileList = (
179
233
  storageName: string,
180
234
  refKey: string,
@@ -221,6 +275,36 @@ export const downloadFileFirestorage = (file: StorageDocument) => {
221
275
  return getDownloadURL(usedRef);
222
276
  }
223
277
 
278
+ /**
279
+ * Löscht eine Datei in Firebase Storage basierend auf den Informationen im StorageDocument.
280
+ *
281
+ * @param deleteFile - Das StorageDocument-Objekt, das die zu löschende Datei beschreibt.
282
+ * @returns Ein Promise, das erfüllt wird, wenn die Datei gelöscht wurde, oder abgelehnt wird, wenn ein Fehler auftritt.
283
+ */
284
+ export async function deleteFirestorageDocument(deleteFile: StorageDocument): Promise<void> {
285
+ if (!deleteFile.filePath) {
286
+ throw new Error("File path is required to delete a document.");
287
+ }
288
+
289
+ // Hole die Storage-Konfiguration basierend auf dem storageName
290
+ const storageConf = storageMap.get(deleteFile.storageName);
291
+ if (!storageConf) {
292
+ throw new Error(`Invalid storage name: ${deleteFile.storageName}`);
293
+ }
294
+
295
+ // Erstelle eine Referenz zur Datei in Firebase Storage
296
+ const deleteRef = ref(storageConf.storage, deleteFile.filePath);
297
+
298
+ try {
299
+ // Lösche die Datei
300
+ await deleteObject(deleteRef);
301
+ console.log(`File ${deleteFile.fileName} successfully deleted.`);
302
+ } catch (error) {
303
+ console.error("Error deleting file:", error);
304
+ throw error;
305
+ }
306
+ }
307
+
224
308
 
225
309
  /* Firestorage Error List: https://firebase.google.com/docs/storage/web/handle-errors */
226
310
  /*
@@ -10,7 +10,7 @@ import { callFunction, initFunctions } from "./firebase/functions-client.js";
10
10
  import { getFirebaseCollectionListener, initFirestore } from "./firebase/firestore-client.js";
11
11
  import { callFunctionMock, initMockResponse } from "./mock/function-client.js";
12
12
  import { ServiceCallController } from "../service-call-controller2.js";
13
- import { downloadFileFirestorage, getFirestorageFileList, initFirestorage, uploadFirestorageFile } from "./firebase/firestorage-client.js";
13
+ import { deleteFirestorageDocument, downloadFileFirestorage, getFirestorageFile, getFirestorageFileList, initFirestorage, uploadFirestorageFile } from "./firebase/firestorage-client.js";
14
14
  import { downloadFileMock, getMockFileList, initStorageMock, uploadStorageFileMock } from "./mock/storage-client.js";
15
15
  import { initFirebaseMessaging } from "./firebase/messagingFirebaseClient.js";
16
16
 
@@ -204,6 +204,20 @@ export const getStorageFileList = (
204
204
  return throwUndefinedProviderError();
205
205
  }
206
206
 
207
+ export const getStorageFile = (
208
+ storageName: string,
209
+ refKey:string,
210
+ storageURI: string,
211
+ includeMetaData: boolean,
212
+ ): Promise<unknown> => {
213
+ if (provider === "firebase") {
214
+ return getFirestorageFile(
215
+ storageName, refKey, storageURI, includeMetaData
216
+ );
217
+ }
218
+ return throwUndefinedProviderError();
219
+ }
220
+
207
221
  export const downloadFile = (file: StorageDocument): Promise<unknown> => {
208
222
  if (provider === "firebase") {
209
223
  return downloadFileFirestorage(file);
@@ -214,6 +228,13 @@ export const downloadFile = (file: StorageDocument): Promise<unknown> => {
214
228
  return throwUndefinedProviderError();
215
229
  }
216
230
 
231
+ export const deleteFile = (file: StorageDocument): Promise<unknown> => {
232
+ if (provider === "firebase") {
233
+ return deleteFirestorageDocument(file);
234
+ }
235
+ return throwUndefinedProviderError();
236
+ }
237
+
217
238
  /* #########################################
218
239
  * Remote Database Implementation
219
240
  * ######################################### */
@@ -131,6 +131,7 @@ export interface UploadFile {
131
131
  storageName: string
132
132
  referenceKey: string
133
133
  subFolderName?: string,
134
+ readonly?: boolean,
134
135
  }
135
136
 
136
137
  export interface StorageMetadata {
@@ -149,6 +150,7 @@ export interface StorageDocument {
149
150
  creation?:Date,
150
151
  creator?:string,
151
152
  size?: number,
153
+ readonly?: boolean,
152
154
  metaData?: StorageMetadata
153
155
  }
154
156