import Dependencies import Fluent import Vapor struct EmployeeApiController: RouteCollection { @Dependency(\.employees) var employees func boot(routes: any RoutesBuilder) throws { let protected = routes.apiProtected(route: "employees") protected.get(use: index(req:)) protected.post(use: create(req:)) protected.group(":employeeID") { $0.get(use: get(req:)) $0.put(use: update(req:)) $0.delete(use: delete(req:)) } } @Sendable func index(req: Request) async throws -> [Employee.DTO] { let params = try req.query.decode(EmployeesIndexQuery.self) return try await employees.fetchAll(params.active == true ? .active : .default) } @Sendable func create(req: Request) async throws -> Employee.DTO { try await employees.create( req.ensureValidContent(Employee.Create.self) ) } @Sendable func get(req: Request) async throws -> Employee.DTO { guard let id = req.parameters.get("employeeID", as: Employee.IDValue.self), let employee = try await employees.get(id) else { throw Abort(.notFound) } return employee } @Sendable func update(req: Request) async throws -> Employee.DTO { guard let employeeID = req.parameters.get("employeeID", as: Employee.IDValue.self) else { throw Abort(.badRequest, reason: "Employee id value not provided") } let updates = try req.ensureValidContent(Employee.Update.self) return try await employees.update(employeeID, updates) } @Sendable func delete(req: Request) async throws -> HTTPStatus { guard let employeeID = req.parameters.get("employeeID", as: Employee.IDValue.self) else { throw Abort(.badRequest, reason: "Employee id value not provided") } try await employees.delete(employeeID) return .ok } } struct EmployeesIndexQuery: Content { let active: Bool? }