// // UserCtrl.swift // // // Created by Michiel Carman on 11/2/21. // import Foundation import Vapor import Fluent import FluentPostgresDriver final class UserCtrl{ //Create Unit func create(req: Request) throws -> EventLoopFuture{ let input = try req.content.decode(mdlUser.Input.self) let output = self.createUnit(input) return self.save(output, req, input) } //Update Unit func update(req: Request) throws -> EventLoopFuture{ let input = try req.content.decode(mdlUser.Input.self) return try qbase(req: req).first().unwrap(or: Abort(.notFound)).flatMap{output in self.mapOutput(output, input) return self.save(output, req: req) } } //Get all Divisions func readAll(req: Request) throws -> EventLoopFuture>{ return try qbase(req: req) .paginate(for: req) .map{ page in page.map{ self.createRead($0) } } } //Get 1 Division func read(req: Request) throws -> EventLoopFuture{ return try qbase(req: req).first().unwrap(or: Abort(.internalServerError)).map{self.createRead($0)} } //Delete 1 Division func delete(req: Request) throws -> EventLoopFuture{ guard let id = req.parameters.get("id", as: Int.self) else{ throw Abort(.badRequest) } return mdlUser.find(id, on: req.db).unwrap(or: Abort(.notFound)).flatMap{ $0.delete(on: req.db)}.map{.ok} } } extension UserCtrl{ //Query Settings func qbase(req: Request) throws -> QueryBuilder { let query = mdlUser.query(on: req.db) .with(\.$division) .with(\.$inspections) .with(\.$roles) .with(\.$modules) .with(\.$workorders) .with(\.$labsettings) if let id = req.parameters.get("id", as: Int.self){ return query.filter(\.$id == id) } else{ return query } } //create Output func createRead(_ output: mdlUser) -> mdlUser.Output { return mdlUser.Output( id: output.id!, number: output.number, firstname: output.firstname, lastname: output.lastname, username: output.username, password: output.password, activationcode: output.activationcode, isactive: output.isactive, createdate: output.createdate, createuserid: output.createuserid, updatedate: output.updatedate, updateuserid: output.updateuserid, division: output.$division.value!, inspections: output.$inspections.value!, roles: output.$roles.value!, modules: output.$modules.value!, workorderusers: output.$workorders.value!, labsettings: output.$labsettings.value! ) } func mapOutput(_ output: Optional.WrappedType, _ input: mdlUser.Input){ output.number = input.number; output.firstname = input.firstname; output.lastname = input.lastname; output.username = input.username; output.password = input.password; output.activationcode = input.activationcode; output.isactive = input.isactive; output.createdate = input.createdate; output.updatedate = input.updatedate; output.createuserid = input.createuserid; output.updateuserid = input.updateuserid; output.$division.id = input.division.id!; output.$inspections.value = input.inspections; output.$roles.value = input.roles; output.$modules.value = input.modules; output.$workorders.value = input.workorderusers; output.$labsettings.value = input.labsettings } func createUnit(_ input: mdlUser.Input) -> mdlUser { return mdlUser( id: input.id ?? nil , number: input.number , firstname: input.firstname , lastname: input.lastname , username: input.username , password: input.password , activationcode: input.activationcode , isactive: input.isactive , createuserid: input.createuserid ?? -1 , createdate: input.createdate , updateuserid: input.updateuserid ?? -1 , updatedate: input.updatedate , division: input.division , roles: input.roles , modules: input.modules , workorderusers: input.workorderusers , inspections: input.inspections , labsettings: input.labsettings ) } //update function func save(_ output: Optional.WrappedType, req: Request) -> EventLoopFuture { return output .save(on: req.db) .map{mdlUser.Output( id: output.id! , number: output.number , firstname: output.firstname , lastname: output.lastname , username: output.username , password: output.password , activationcode: output.activationcode , isactive: output.isactive , createdate: output.createdate , createuserid: output.createuserid , updatedate: output.updatedate , updateuserid: output.updateuserid , division: output.division , inspections: output.inspections , roles: output.roles , modules: output.modules , workorderusers: output.workorders , labsettings: output.labsettings ) } } //create function func save(_ output: mdlUser, _ req: Request, _ input: mdlUser.Input) -> EventLoopFuture { return output .save(on: req.db) .map{ mdlUser.Output( id: output.id! , number: output.number , firstname: output.firstname , lastname: output.lastname , username: output.username , password: output.password , activationcode: output.activationcode , isactive: output.isactive , createdate: output.createdate , createuserid: output.createuserid , updatedate: output.updatedate , updateuserid: output.updateuserid , division: input.division , inspections: input.inspections , roles: input.roles , modules: input.modules , workorderusers: input.workorderusers , labsettings: input.labsettings ) } } } extension UserCtrl: RouteCollection{ func boot(routes: RoutesBuilder) throws{ let apigroup = routes.grouped("users") apigroup.get("", use: readAll) apigroup.get(":id", use: read) apigroup.post("", use: create) apigroup.post(":id", use: update) apigroup.delete(":id", use: delete) } }