Add authentication #17

Manually merged
Webmaster merged 225 commits from auth into main 2025-03-08 10:37:06 +00:00
Showing only changes of commit 3d59ee0c08 - Show all commits

View file

@ -2180,15 +2180,14 @@ declare global {
has_food: formData.get("editEventHasFood") === "on", has_food: formData.get("editEventHasFood") === "on",
}; };
let updatedEvent; const pb = auth.getPocketBase();
try { try {
if (eventId) { if (eventId) {
// Update existing event // Update existing event
submitButton.innerHTML = `<span class="loading loading-spinner"></span>`; submitButton.innerHTML = `<span class="loading loading-spinner"></span>`;
// Get current event data to process file changes // Get current event data
const pb = auth.getPocketBase();
const currentEvent = await pb const currentEvent = await pb
.collection("events") .collection("events")
.getOne(eventId); .getOne(eventId);
@ -2199,65 +2198,94 @@ declare global {
(filename: string) => !filesToDelete.has(filename) (filename: string) => !filesToDelete.has(filename)
); );
// Update event with remaining files // Create a single FormData instance for the entire update
const eventDataWithFiles = { const updateFormData = new FormData();
...eventData,
files: remainingFiles,
};
// Update the event data first // Add all event data fields
updatedEvent = await update.updateFields( Object.entries(eventData).forEach(([key, value]) => {
"events", updateFormData.append(key, String(value));
eventId, });
eventDataWithFiles
// 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 try {
for (const filename of filesToDelete) { const existingFiles = (
await fileManager.deleteFile( await Promise.all(filePromises)
"events", ).filter((file): file is File => file !== null);
eventId,
filename // 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( await sendLog.send(
"delete", "update",
"event_file", "event",
`Deleted file ${filename} from event ${eventData.event_name}` `Updated event: ${eventData.event_name}`
); );
}
// Then handle new file uploads if any // Log file deletions
if (selectedFiles.length > 0) { for (const filename of filesToDelete) {
await fileManager.appendFiles( await sendLog.send(
"events", "delete",
eventId, "event_file",
"files", `Deleted file ${filename} from event ${eventData.event_name}`
selectedFiles );
); }
} catch (error) {
console.error("Failed to process files:", error);
throw error;
} }
await sendLog.send(
"update",
"event",
`Updated event: ${eventData.event_name}`
);
} else { } else {
// Create new event // Create new event with files in a single operation
submitButton.innerHTML = `<span class="loading loading-spinner"></span>`; const createFormData = new FormData();
const pb = auth.getPocketBase();
// 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 const newEvent = await pb
.collection("events") .collection("events")
.create(eventData); .create(createFormData);
// Handle file uploads if any
if (selectedFiles.length > 0) {
await fileManager.uploadFiles(
"events",
newEvent.id,
"files",
selectedFiles
);
}
await sendLog.send( await sendLog.send(
"create", "create",