From 64f9c4aac95ef9ddbfe647996f0137c54fa9dfd2 Mon Sep 17 00:00:00 2001 From: admin Date: Tue, 12 Mar 2024 16:24:41 -0400 Subject: [PATCH] Second attempt at uploading images. This time the imageData will come with the JSON data and get processed during the Create. Had an issue assigning UUIDs on device with them being duplicated in the server database. --- .../Controllers/FuelEntryV2Controller.swift | 30 +++++++++++++++---- 1 file changed, 24 insertions(+), 6 deletions(-) diff --git a/Sources/App/Controllers/FuelEntryV2Controller.swift b/Sources/App/Controllers/FuelEntryV2Controller.swift index 923a1c8..f7d4e59 100644 --- a/Sources/App/Controllers/FuelEntryV2Controller.swift +++ b/Sources/App/Controllers/FuelEntryV2Controller.swift @@ -38,16 +38,34 @@ struct FuelEntryV2Controller: RouteCollection { } func create(req: Request) async throws -> [FuelEntry] { - var fuelEntries = try req.content.decode([FuelEntry].self) + let fuelEntries = try await req.content.decode([FuelEntry].self) let directory = DirectoryConfiguration.detect().workingDirectory + "Images/" - for index in fuelEntries.indices { - let imagePath = directory + (fuelEntries[index].id?.uuidString ?? "Unknown") + ".png" - fuelEntries[index].image = imagePath + var updatedFuelEntries: [FuelEntry] = [] + + for fuelEntry in fuelEntries { + let updatedFuelEntry = try await { () async throws -> FuelEntry in + var updatedFuelEntry = fuelEntry + + if let imageData = updatedFuelEntry.imageData { + let imageFilename = "\(updatedFuelEntry.id!).png" + let tempImageURL = URL(fileURLWithPath: directory + imageFilename) + try await imageData.write(to: tempImageURL) + updatedFuelEntry.image = tempImageURL.absoluteString + } + + do { + _ = try await updatedFuelEntry.save(on: req.db) + return updatedFuelEntry + } catch { + throw Abort(.internalServerError, reason: "Error saving FuelEntry: \(error)") + } + }() + + updatedFuelEntries.append(updatedFuelEntry) } - try await fuelEntries.create(on: req.db) - return fuelEntries + return updatedFuelEntries } func delete(req: Request) async throws -> HTTPStatus {