diff --git a/Sources/App/Controllers/FuelEntryController.swift b/Sources/App/Controllers/FuelEntryController.swift index ff25662..d7bcedf 100755 --- a/Sources/App/Controllers/FuelEntryController.swift +++ b/Sources/App/Controllers/FuelEntryController.swift @@ -1,6 +1,6 @@ // // FuelEntryController.swift -// +// // // Created by Bill Ryckman on 4/24/23. // @@ -12,7 +12,6 @@ struct FuelEntryController: RouteCollection { let fuelEntries = routes.grouped("fuel_entries") fuelEntries.get(use: index) fuelEntries.post(use: create) - fuelEntries.post("upload-image", use: uploadImage) fuelEntries.group(":fuelEntryID") { fuelEntry in fuelEntry.delete(use: delete) } @@ -35,33 +34,9 @@ struct FuelEntryController: RouteCollection { try await fuelEntry.delete(on: req.db) return .noContent } - - func uploadImage(req: Request) async throws -> FuelEntry { - let fuelEntryID: UUID = try req.parameters.require("id") - - let file = try await req.content.decode(File.self) - let filename = fuelEntryID.uuidString + ".png" // Generate a unique filename for the uploaded image - let directory = DirectoryConfiguration.detect().workingDirectory + "Images/" - - if let imageData = file.data.getData(at: 0, length: file.data.readableBytes) { - do { - try Data(imageData).write(to: URL(fileURLWithPath: directory + filename)) // Save the uploaded image to server - } catch { - throw Abort(.internalServerError, reason: "Failed to save image file") - } - - // Update FuelEntry model after saving the image - if let fuelEntry = try await FuelEntry.find(fuelEntryID, on: req.db) { - return fuelEntry - } else { - throw Abort(.notFound, reason: "FuelEntry not found") - } - } else { - throw Abort(.badRequest, reason: "Failed to extract image data") - } - } } + diff --git a/Sources/App/Controllers/FuelEntryV2Controller.swift b/Sources/App/Controllers/FuelEntryV2Controller.swift new file mode 100644 index 0000000..5165d8d --- /dev/null +++ b/Sources/App/Controllers/FuelEntryV2Controller.swift @@ -0,0 +1,69 @@ +// +// FuelEntryController.swift +// +// +// Created by Bill Ryckman on 4/24/23. +// + +import Vapor + +struct FuelEntryV2Controller: RouteCollection { + func boot(routes: RoutesBuilder) throws { + let fuelEntries = routes.grouped("fuel_entries") + fuelEntries.get(use: index) + fuelEntries.post(use: create) + fuelEntries.post("upload-image", use: uploadImage) + fuelEntries.group(":fuelEntryID") { fuelEntry in + fuelEntry.delete(use: delete) + } + } + + func index(req: Request) async throws -> [FuelEntry] { + try await FuelEntry.query(on: req.db).all() + } + + //Need to create image file path at time of FuelEntry creation. UploadImage to store file appropriately + func create(req: Request) async throws -> [FuelEntry] { + let fuelEntry = try req.content.decode([FuelEntry].self) + try await fuelEntry.create(on: req.db) + return fuelEntry + } + + func delete(req: Request) async throws -> HTTPStatus { + guard let fuelEntry = try await FuelEntry.find(req.parameters.get("fuelEntryID"), on: req.db) else { + throw Abort(.notFound) + } + try await fuelEntry.delete(on: req.db) + return .noContent + } + + func uploadImage(req: Request) async throws -> FuelEntry { + let fuelEntryID: UUID = try req.parameters.require("id") + + let file = try await req.content.decode(File.self) + let filename = fuelEntryID.uuidString + ".png" // Generate a unique filename for the uploaded image + let directory = DirectoryConfiguration.detect().workingDirectory + "Images/" + + if let imageData = file.data.getData(at: 0, length: file.data.readableBytes) { + do { + try Data(imageData).write(to: URL(fileURLWithPath: directory + filename)) // Save the uploaded image to server + } catch { + throw Abort(.internalServerError, reason: "Failed to save image file") + } + + // Update FuelEntry model after saving the image + if let fuelEntry = try await FuelEntry.find(fuelEntryID, on: req.db) { + return fuelEntry + } else { + throw Abort(.notFound, reason: "FuelEntry not found") + } + } else { + throw Abort(.badRequest, reason: "Failed to extract image data") + } + } +} + + + + + diff --git a/Sources/App/configure.swift b/Sources/App/configure.swift index 14ef37b..03870fd 100755 --- a/Sources/App/configure.swift +++ b/Sources/App/configure.swift @@ -13,6 +13,7 @@ public func configure(_ app: Application) async throws { app.http.server.configuration.port = 3001 app.migrations.add(CreateFuelEntry()) app.migrations.add(AddLatitudeAndLongitudeAndRemoveGpsLocationAndImage()) + app.migrations.add(AddImageBackIn()) try await app.autoMigrate().get() // register routes diff --git a/Sources/App/routes.swift b/Sources/App/routes.swift index a385817..8e6d292 100755 --- a/Sources/App/routes.swift +++ b/Sources/App/routes.swift @@ -32,22 +32,22 @@ func routes(_ app: Application) throws { // V2 API routes with image upload let v2Routes = app.group("api", "v2") { v2 in - let fuelEntryController = FuelEntryController() + let fuelEntryV2Controller = FuelEntryV2Controller() v2.get("fuel-entries") {req in - try await fuelEntryController.index(req: req) + try await fuelEntryV2Controller.index(req: req) } v2.post("fuel-entries") {req in - try await fuelEntryController.create(req: req) + try await fuelEntryV2Controller.create(req: req) } v2.post("fuel-entries", ":id", "upload-image") { req -> FuelEntry in - return try await fuelEntryController.uploadImage(req: req) + return try await fuelEntryV2Controller.uploadImage(req: req) } v2.delete("fuel-entries", ":fuelEntryID") { req in - try await fuelEntryController.delete(req: req) + try await fuelEntryV2Controller.delete(req: req) } } }