From 3d59ee0c087102a4d9eebc7c144165089894f3ea Mon Sep 17 00:00:00 2001 From: chark1es Date: Thu, 13 Feb 2025 05:58:16 -0800 Subject: [PATCH] fixed patching error --- .../dashboard/Officer_EventManagement.astro | 130 +++++++++++------- 1 file changed, 79 insertions(+), 51 deletions(-) diff --git a/src/components/dashboard/Officer_EventManagement.astro b/src/components/dashboard/Officer_EventManagement.astro index f06d9b0..06abd43 100644 --- a/src/components/dashboard/Officer_EventManagement.astro +++ b/src/components/dashboard/Officer_EventManagement.astro @@ -2180,15 +2180,14 @@ declare global { has_food: formData.get("editEventHasFood") === "on", }; - let updatedEvent; + const pb = auth.getPocketBase(); try { if (eventId) { // Update existing event submitButton.innerHTML = ``; - // Get current event data to process file changes - const pb = auth.getPocketBase(); + // Get current event data const currentEvent = await pb .collection("events") .getOne(eventId); @@ -2199,65 +2198,94 @@ declare global { (filename: string) => !filesToDelete.has(filename) ); - // Update event with remaining files - const eventDataWithFiles = { - ...eventData, - files: remainingFiles, - }; + // Create a single FormData instance for the entire update + const updateFormData = new FormData(); - // Update the event data first - updatedEvent = await update.updateFields( - "events", - eventId, - eventDataWithFiles + // Add all event data fields + Object.entries(eventData).forEach(([key, value]) => { + updateFormData.append(key, String(value)); + }); + + // Handle files + // First, fetch all remaining files as blobs + const filePromises = remainingFiles.map( + async (filename: string) => { + try { + const response = await fetch( + fileManager.getFileUrl( + "events", + eventId, + filename + ) + ); + const blob = await response.blob(); + return new File([blob], filename, { + type: blob.type, + }); + } catch (error) { + console.error( + `Failed to fetch file ${filename}:`, + error + ); + return null; + } + } ); - // Process file deletions - for (const filename of filesToDelete) { - await fileManager.deleteFile( - "events", - eventId, - filename + try { + const existingFiles = ( + await Promise.all(filePromises) + ).filter((file): file is File => file !== null); + + // Add all files (both existing and new) to FormData + [...existingFiles, ...selectedFiles].forEach( + (file: File) => { + updateFormData.append("files", file); + } ); + + // Perform single update operation + const updatedEvent = await pb + .collection("events") + .update(eventId, updateFormData); + + // Log the update await sendLog.send( - "delete", - "event_file", - `Deleted file ${filename} from event ${eventData.event_name}` + "update", + "event", + `Updated event: ${eventData.event_name}` ); - } - // Then handle new file uploads if any - if (selectedFiles.length > 0) { - await fileManager.appendFiles( - "events", - eventId, - "files", - selectedFiles - ); + // Log file deletions + for (const filename of filesToDelete) { + await sendLog.send( + "delete", + "event_file", + `Deleted file ${filename} from event ${eventData.event_name}` + ); + } + } catch (error) { + console.error("Failed to process files:", error); + throw error; } - - await sendLog.send( - "update", - "event", - `Updated event: ${eventData.event_name}` - ); } else { - // Create new event - submitButton.innerHTML = ``; - const pb = auth.getPocketBase(); + // Create new event with files in a single operation + const createFormData = new FormData(); + + // Add all event data fields + Object.entries(eventData).forEach(([key, value]) => { + createFormData.append(key, String(value)); + }); + + // Add new files + selectedFiles.forEach((file: File) => { + createFormData.append("files", file); + }); + + // Create event with files in a single operation const newEvent = await pb .collection("events") - .create(eventData); - - // Handle file uploads if any - if (selectedFiles.length > 0) { - await fileManager.uploadFiles( - "events", - newEvent.id, - "files", - selectedFiles - ); - } + .create(createFormData); await sendLog.send( "create",