import DatabaseClient import Dependencies import Fluent import SharedModels import Vapor struct VendorApiController: RouteCollection { @Dependency(\.database.vendors) var vendors func boot(routes: any RoutesBuilder) throws { let protected = routes.apiProtected(route: "vendors") protected.get(use: index(req:)) protected.post(use: create(req:)) protected.group(":id") { $0.put(use: update(req:)) $0.delete(use: delete(req:)) } } @Sendable func index(req: Request) async throws -> [Vendor] { let params = try req.query.decode(VendorsIndexQuery.self) return try await vendors.fetchAll(params.request) } @Sendable func create(req: Request) async throws -> Vendor { try await vendors.create(req.content.decode(Vendor.Create.self)) } @Sendable func update(req: Request) async throws -> Vendor { return try await vendors.update(req.ensureIDPathComponent(), req.content.decode(Vendor.Update.self)) } @Sendable func delete(req: Request) async throws -> HTTPStatus { try await vendors.delete(req.ensureIDPathComponent()) return .ok } } struct VendorsIndexQuery: Content { let branches: Bool? var request: DatabaseClient.Vendors.FetchRequest { if branches == true { return .withBranches } return .all } }