@progressive-development/pd-spa-helper 0.3.34 → 0.3.36

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.34",
6
+ "version": "0.3.36",
7
7
  "main": "dist/src/index.js",
8
8
  "module": "dist/src/index.js",
9
9
  "exports": {
package/src/index.ts CHANGED
@@ -32,6 +32,7 @@ export {
32
32
  callFunctionImpl,
33
33
  uploadFile,
34
34
  downloadFile,
35
+ deleteFile,
35
36
  getStorageFileList,
36
37
  activateCollectionListener,
37
38
  } from './service-provider/service-provider-impl.js'
@@ -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
 
@@ -107,6 +108,7 @@ const fetchItemsAndFolders = async (
107
108
  ): Promise<StorageDocument[]> => {
108
109
  try {
109
110
  const itemRefs: StorageDocument[] = [];
111
+ const metaPromises: Promise<FullMetadata>[] = [];
110
112
 
111
113
  // Hole alle Items und Folder direkt unter `usedRef`
112
114
  const res: ListResult = await listAll(usedRef);
@@ -120,6 +122,7 @@ const fetchItemsAndFolders = async (
120
122
  descriptionName: metadata.customMetadata?.name,
121
123
  description: metadata.customMetadata?.comment,
122
124
  size: metadata.size,
125
+ readonly: metadata.customMetadata?.readonly === "true",
123
126
  metaData: metadata
124
127
  });
125
128
 
@@ -131,34 +134,42 @@ const fetchItemsAndFolders = async (
131
134
  storageName,
132
135
  refKey
133
136
  });
134
- });
135
137
 
136
- // 2. Verarbeite alle Ordner direkt unter usedRef, falls includeFolder gesetzt ist
137
- const folderPromises = includeFolder ? res.prefixes.map(async (folderRef) => {
138
- const folderRes = await listAll(folderRef);
139
- folderRes.items.forEach((subItemRef) => {
140
- itemRefs.push({
141
- fileName: subItemRef.name,
142
- filePath: subItemRef.fullPath,
143
- storageName,
144
- refKey,
145
- subFolderName: folderRef.name
146
- });
147
- });
148
- }) : [];
138
+ // Erzeuge die Metadaten-Promises direkt, wenn `includeMetaData` aktiv ist
139
+ if (includeMetaData) {
140
+ metaPromises.push(getMetadata(itemRef));
141
+ }
142
+ });
149
143
 
150
- // 3. Warten bis alle Ordnerinhalte geladen sind
151
- await Promise.all(folderPromises);
144
+ // 2. Verarbeite alle Ordner direkt unter usedRef, falls includeFolder gesetzt ist
145
+ if (includeFolder) {
146
+ await Promise.all(
147
+ res.prefixes.map(async (folderRef) => {
148
+ const folderRes = await listAll(folderRef);
149
+ folderRes.items.forEach((subItemRef) => {
150
+ itemRefs.push({
151
+ fileName: subItemRef.name,
152
+ filePath: subItemRef.fullPath,
153
+ storageName,
154
+ refKey,
155
+ subFolderName: folderRef.name
156
+ });
157
+
158
+ // Erzeuge Metadaten-Promises für die Ordner-Inhalte, wenn `includeMetaData` aktiv ist
159
+ if (includeMetaData) {
160
+ metaPromises.push(getMetadata(subItemRef));
161
+ }
162
+ });
163
+ })
164
+ );
165
+ }
152
166
 
153
- // 4. Falls includeMetaData gesetzt ist, lade alle Meta-Daten parallel
154
- if (includeMetaData) {
155
- const metaPromises = itemRefs.map((item) => getMetadata({ fullPath: item.filePath } as StorageReference));
167
+ // 3. Falls `includeMetaData`, warte auf alle Metadaten und ordne sie den `itemRefs` zu
168
+ if (includeMetaData) {
156
169
  const metaResults = await Promise.all(metaPromises);
157
-
158
- // Weisen die Metadaten den Items zu
159
170
  return itemRefs.map((item, index) => processMetadata(item, metaResults[index]));
160
171
  }
161
-
172
+
162
173
  return itemRefs; // Rückgabe ohne Metadaten, falls nicht angefordert
163
174
  } catch (error) {
164
175
  console.error("Error during file and folder listing:", error);
@@ -212,6 +223,36 @@ export const downloadFileFirestorage = (file: StorageDocument) => {
212
223
  return getDownloadURL(usedRef);
213
224
  }
214
225
 
226
+ /**
227
+ * Löscht eine Datei in Firebase Storage basierend auf den Informationen im StorageDocument.
228
+ *
229
+ * @param deleteFile - Das StorageDocument-Objekt, das die zu löschende Datei beschreibt.
230
+ * @returns Ein Promise, das erfüllt wird, wenn die Datei gelöscht wurde, oder abgelehnt wird, wenn ein Fehler auftritt.
231
+ */
232
+ export async function deleteFirestorageDocument(deleteFile: StorageDocument): Promise<void> {
233
+ if (!deleteFile.filePath) {
234
+ throw new Error("File path is required to delete a document.");
235
+ }
236
+
237
+ // Hole die Storage-Konfiguration basierend auf dem storageName
238
+ const storageConf = storageMap.get(deleteFile.storageName);
239
+ if (!storageConf) {
240
+ throw new Error(`Invalid storage name: ${deleteFile.storageName}`);
241
+ }
242
+
243
+ // Erstelle eine Referenz zur Datei in Firebase Storage
244
+ const deleteRef = ref(storageConf.storage, deleteFile.filePath);
245
+
246
+ try {
247
+ // Lösche die Datei
248
+ await deleteObject(deleteRef);
249
+ console.log(`File ${deleteFile.fileName} successfully deleted.`);
250
+ } catch (error) {
251
+ console.error("Error deleting file:", error);
252
+ throw error;
253
+ }
254
+ }
255
+
215
256
 
216
257
  /* Firestorage Error List: https://firebase.google.com/docs/storage/web/handle-errors */
217
258
  /*
@@ -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, 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
 
@@ -214,6 +214,13 @@ export const downloadFile = (file: StorageDocument): Promise<unknown> => {
214
214
  return throwUndefinedProviderError();
215
215
  }
216
216
 
217
+ export const deleteFile = (file: StorageDocument): Promise<unknown> => {
218
+ if (provider === "firebase") {
219
+ return deleteFirestorageDocument(file);
220
+ }
221
+ return throwUndefinedProviderError();
222
+ }
223
+
217
224
  /* #########################################
218
225
  * Remote Database Implementation
219
226
  * ######################################### */
@@ -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