diff --git a/Sources/App/Controllers/Api/EmployeeApiController.swift b/Sources/App/Controllers/Api/EmployeeApiController.swift index dd4692a..b7d21a6 100644 --- a/Sources/App/Controllers/Api/EmployeeApiController.swift +++ b/Sources/App/Controllers/Api/EmployeeApiController.swift @@ -25,9 +25,9 @@ struct EmployeeApiController: RouteCollection { @Sendable func create(req: Request) async throws -> Employee.DTO { - try Employee.Create.validate(content: req) - let create = try req.content.decode(Employee.Create.self) - return try await employees.create(create) + try await employees.create( + req.ensureValidContent(Employee.Create.self) + ) } @Sendable @@ -42,11 +42,10 @@ struct EmployeeApiController: RouteCollection { @Sendable func update(req: Request) async throws -> Employee.DTO { - try Employee.Update.validate(content: req) 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.content.decode(Employee.Update.self) + let updates = try req.ensureValidContent(Employee.Update.self) return try await employees.update(employeeID, updates) } diff --git a/Sources/App/Controllers/Api/PurchaseOrderApiController.swift b/Sources/App/Controllers/Api/PurchaseOrderApiController.swift index 4bdbb50..c90bf34 100644 --- a/Sources/App/Controllers/Api/PurchaseOrderApiController.swift +++ b/Sources/App/Controllers/Api/PurchaseOrderApiController.swift @@ -25,10 +25,8 @@ struct PurchaseOrderApiController: RouteCollection { @Sendable func create(req: Request) async throws -> PurchaseOrder.DTO { - try PurchaseOrder.Create.validate(content: req) - let model = try req.content.decode(PurchaseOrder.Create.self) - return try await purchaseOrders.create( - model, + try await purchaseOrders.create( + req.ensureValidContent(PurchaseOrder.Create.self), req.auth.require(User.self).requireID() ) } diff --git a/Sources/App/Controllers/Api/UserApiController.swift b/Sources/App/Controllers/Api/UserApiController.swift index 3e457ba..50ac5bf 100644 --- a/Sources/App/Controllers/Api/UserApiController.swift +++ b/Sources/App/Controllers/Api/UserApiController.swift @@ -33,9 +33,7 @@ struct UserApiController: RouteCollection { throw Abort(.unauthorized) } } - try User.Create.validate(content: req) - let model = try req.content.decode(User.Create.self) - return try await users.create(model) + return try await users.create(req.ensureValidContent(User.Create.self)) } @Sendable diff --git a/Sources/App/Controllers/Api/VendorApiController.swift b/Sources/App/Controllers/Api/VendorApiController.swift index 419be31..6d7634e 100644 --- a/Sources/App/Controllers/Api/VendorApiController.swift +++ b/Sources/App/Controllers/Api/VendorApiController.swift @@ -24,9 +24,7 @@ struct VendorApiController: RouteCollection { @Sendable func create(req: Request) async throws -> Vendor.DTO { - try Vendor.Create.validate(content: req) - let model = try req.content.decode(Vendor.Create.self) - return try await vendors.create(model) + try await vendors.create(req.ensureValidContent(Vendor.Create.self)) } @Sendable diff --git a/Sources/App/Controllers/Api/VendorBranchApiController.swift b/Sources/App/Controllers/Api/VendorBranchApiController.swift index e07fe45..cd2dacf 100644 --- a/Sources/App/Controllers/Api/VendorBranchApiController.swift +++ b/Sources/App/Controllers/Api/VendorBranchApiController.swift @@ -39,9 +39,10 @@ struct VendorBranchApiController: RouteCollection { guard let id = req.parameters.get("vendorID", as: Vendor.IDValue.self) else { throw Abort(.badRequest, reason: "Vendor id not provided.") } - try VendorBranch.Create.validate(content: req) - let model = try req.content.decode(VendorBranch.Create.self) - return try await vendorBranches.create(model, id) + return try await vendorBranches.create( + req.ensureValidContent(VendorBranch.Create.self), + id + ) } @Sendable diff --git a/Sources/App/Controllers/DB/EmployeeDB.swift b/Sources/App/DB/EmployeeDB.swift similarity index 100% rename from Sources/App/Controllers/DB/EmployeeDB.swift rename to Sources/App/DB/EmployeeDB.swift diff --git a/Sources/App/Controllers/DB/PurchaseOrderDB.swift b/Sources/App/DB/PurchaseOrderDB.swift similarity index 100% rename from Sources/App/Controllers/DB/PurchaseOrderDB.swift rename to Sources/App/DB/PurchaseOrderDB.swift diff --git a/Sources/App/Controllers/DB/UserDB.swift b/Sources/App/DB/UserDB.swift similarity index 100% rename from Sources/App/Controllers/DB/UserDB.swift rename to Sources/App/DB/UserDB.swift diff --git a/Sources/App/Controllers/DB/VendorBranchDB.swift b/Sources/App/DB/VendorBranchDB.swift similarity index 100% rename from Sources/App/Controllers/DB/VendorBranchDB.swift rename to Sources/App/DB/VendorBranchDB.swift diff --git a/Sources/App/Controllers/DB/VendorDB.swift b/Sources/App/DB/VendorDB.swift similarity index 100% rename from Sources/App/Controllers/DB/VendorDB.swift rename to Sources/App/DB/VendorDB.swift diff --git a/Sources/App/Extensions/Request+ensureValidContent.swift b/Sources/App/Extensions/Request+ensureValidContent.swift new file mode 100644 index 0000000..fa36490 --- /dev/null +++ b/Sources/App/Extensions/Request+ensureValidContent.swift @@ -0,0 +1,8 @@ +import Vapor + +extension Request { + func ensureValidContent(_ decoding: T.Type) throws -> T where T: Content, T: Validatable { + try T.validate(content: self) + return try content.decode(T.self) + } +}