| @@ -0,0 +1,266 @@ | |||
| { | |||
| "pins" : [ | |||
| { | |||
| "identity" : "async-http-client", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/swift-server/async-http-client.git", | |||
| "state" : { | |||
| "revision" : "fb308ee72f3d4c082a507033f94afa7395963ef3", | |||
| "version" : "1.21.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "async-kit", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/async-kit.git", | |||
| "state" : { | |||
| "revision" : "7ece208cd401687641c88367a00e3ea2b04311f1", | |||
| "version" : "1.19.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "console-kit", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/console-kit.git", | |||
| "state" : { | |||
| "revision" : "a31f44ebfbd15a2cc0fda705279676773ac16355", | |||
| "version" : "4.14.1" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "fluent", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/fluent.git", | |||
| "state" : { | |||
| "revision" : "a586a5d4164f23a0ee4e02e1f467b9bbef0c9f1c", | |||
| "version" : "4.9.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "fluent-kit", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/fluent-kit.git", | |||
| "state" : { | |||
| "revision" : "5f0938a3f5f1a751ff7a411117bfce4efe713526", | |||
| "version" : "1.47.2" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "fluent-postgres-driver", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/fluent-postgres-driver.git", | |||
| "state" : { | |||
| "revision" : "a538fc647f82d915eb84e0a12ca9b08c513e57c4", | |||
| "version" : "2.8.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "multipart-kit", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/multipart-kit.git", | |||
| "state" : { | |||
| "revision" : "12ee56f25bd3fc4c2d09c2aa16e69de61dc786e8", | |||
| "version" : "4.6.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "postgres-kit", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/postgres-kit.git", | |||
| "state" : { | |||
| "revision" : "e26763a6cb8d852f7ce01b1cd5925b3d8d084801", | |||
| "version" : "2.13.1" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "postgres-nio", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/postgres-nio.git", | |||
| "state" : { | |||
| "revision" : "e345cbb9cf6052b37b27c0c4f976134fc01dbe15", | |||
| "version" : "1.21.1" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "routing-kit", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/routing-kit.git", | |||
| "state" : { | |||
| "revision" : "2a92a7eac411a82fb3a03731be5e76773ebe1b3e", | |||
| "version" : "4.9.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "sql-kit", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/sql-kit.git", | |||
| "state" : { | |||
| "revision" : "b2f128cb62a3abfbb1e3b2893ff3ee69e70f4f0f", | |||
| "version" : "3.28.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-algorithms", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-algorithms.git", | |||
| "state" : { | |||
| "revision" : "f6919dfc309e7f1b56224378b11e28bab5bccc42", | |||
| "version" : "1.2.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-async-algorithms", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-async-algorithms.git", | |||
| "state" : { | |||
| "revision" : "da4e36f86544cdf733a40d59b3a2267e3a7bbf36", | |||
| "version" : "1.0.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-atomics", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-atomics.git", | |||
| "state" : { | |||
| "revision" : "cd142fd2f64be2100422d658e7411e39489da985", | |||
| "version" : "1.2.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-collections", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-collections.git", | |||
| "state" : { | |||
| "revision" : "94cf62b3ba8d4bed62680a282d4c25f9c63c2efb", | |||
| "version" : "1.1.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-crypto", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-crypto.git", | |||
| "state" : { | |||
| "revision" : "f0525da24dc3c6cbb2b6b338b65042bc91cbc4bb", | |||
| "version" : "3.3.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-http-types", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-http-types", | |||
| "state" : { | |||
| "revision" : "12358d55a3824bd5fed310b999ea8cf83a9a1a65", | |||
| "version" : "1.0.3" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-log", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-log.git", | |||
| "state" : { | |||
| "revision" : "e97a6fcb1ab07462881ac165fdbb37f067e205d5", | |||
| "version" : "1.5.4" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-metrics", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-metrics.git", | |||
| "state" : { | |||
| "revision" : "971ba26378ab69c43737ee7ba967a896cb74c0d1", | |||
| "version" : "2.4.1" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-nio", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-nio.git", | |||
| "state" : { | |||
| "revision" : "fc63f0cf4e55a4597407a9fc95b16a2bc44b4982", | |||
| "version" : "2.64.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-nio-extras", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-nio-extras.git", | |||
| "state" : { | |||
| "revision" : "a3b640d7dc567225db7c94386a6e71aded1bfa63", | |||
| "version" : "1.22.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-nio-http2", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-nio-http2.git", | |||
| "state" : { | |||
| "revision" : "0904bf0feb5122b7e5c3f15db7df0eabe623dd87", | |||
| "version" : "1.30.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-nio-ssl", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-nio-ssl.git", | |||
| "state" : { | |||
| "revision" : "7c381eb6083542b124a6c18fae742f55001dc2b5", | |||
| "version" : "2.26.0" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-nio-transport-services", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-nio-transport-services.git", | |||
| "state" : { | |||
| "revision" : "6cbe0ed2b394f21ab0d46b9f0c50c6be964968ce", | |||
| "version" : "1.20.1" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-numerics", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-numerics.git", | |||
| "state" : { | |||
| "revision" : "0a5bc04095a675662cf24757cc0640aa2204253b", | |||
| "version" : "1.0.2" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-service-lifecycle", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/swift-server/swift-service-lifecycle.git", | |||
| "state" : { | |||
| "revision" : "d7fe0e731499a8dcce53bf4cbbc812c8e565d3a7", | |||
| "version" : "2.4.1" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "swift-system", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/apple/swift-system.git", | |||
| "state" : { | |||
| "revision" : "025bcb1165deab2e20d4eaba79967ce73013f496", | |||
| "version" : "1.2.1" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "vapor", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/vapor.git", | |||
| "state" : { | |||
| "revision" : "8409c3c296e7f8965df14e906dbcd44eb68f54a9", | |||
| "version" : "4.92.6" | |||
| } | |||
| }, | |||
| { | |||
| "identity" : "websocket-kit", | |||
| "kind" : "remoteSourceControl", | |||
| "location" : "https://github.com/vapor/websocket-kit.git", | |||
| "state" : { | |||
| "revision" : "4232d34efa49f633ba61afde365d3896fc7f8740", | |||
| "version" : "2.15.0" | |||
| } | |||
| } | |||
| ], | |||
| "version" : 2 | |||
| } | |||
| @@ -1,4 +1,4 @@ | |||
| // swift-tools-version:5.10 | |||
| // swift-tools-version:5.9 | |||
| import PackageDescription | |||
| let package = Package( | |||
| @@ -1,34 +0,0 @@ | |||
| import Fluent | |||
| import Vapor | |||
| struct TodoController: RouteCollection { | |||
| func boot(routes: RoutesBuilder) throws { | |||
| let todos = routes.grouped("todos") | |||
| todos.get(use: { try await self.index(req: $0) }) | |||
| todos.post(use: { try await self.create(req: $0) }) | |||
| todos.group(":todoID") { todo in | |||
| todo.delete(use: { try await self.delete(req: $0) }) | |||
| } | |||
| } | |||
| func index(req: Request) async throws -> [Todo] { | |||
| try await Todo.query(on: req.db).all() | |||
| } | |||
| func create(req: Request) async throws -> Todo { | |||
| let todo = try req.content.decode(Todo.self) | |||
| try await todo.save(on: req.db) | |||
| return todo | |||
| } | |||
| func delete(req: Request) async throws -> HTTPStatus { | |||
| guard let todo = try await Todo.find(req.parameters.get("todoID"), on: req.db) else { | |||
| throw Abort(.notFound) | |||
| } | |||
| try await todo.delete(on: req.db) | |||
| return .noContent | |||
| } | |||
| } | |||
| @@ -0,0 +1,82 @@ | |||
| // | |||
| // cntrlAddociate.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/11/2024. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Crypto | |||
| struct cntrlAssociate: RouteCollection { | |||
| func boot(routes: RoutesBuilder) throws { | |||
| let rts = routes.grouped("associates") | |||
| rts.get(use: index) | |||
| rts.get(":x", use: read) | |||
| rts.post(use: create) | |||
| rts.delete(":x", use: delete) | |||
| //Additional routs added here | |||
| } | |||
| @Sendable | |||
| func index(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlAssociate.ObjQuery(req: req).all() else { | |||
| throw Abort(.badGateway, reason: "Something went wrong with this api.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Array could not be shown.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func read(req:Request) async throws -> Response{ | |||
| guard let obj = try? await mdlAssociate.ObjQuery(req: req).first() else{ | |||
| throw Abort(.notFound, reason: "Associate was not found.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else { | |||
| throw Abort(.noContent, reason: "Something went wrong decoding object.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func create(req: Request) async throws -> Response { | |||
| guard let obj = try? req.content.decode(mdlAssociate.self) else { | |||
| throw Abort(.notAcceptable, reason: "Associate json not formatted correctly or is missing parents.") | |||
| } | |||
| var exists = false | |||
| if(obj.id != nil){ | |||
| obj._$idExists = true | |||
| exists = true | |||
| } | |||
| guard let _ = try? await obj.save(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "Something conflicts in the database. Associate cannot be saved.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: exists ? .accepted : .created, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Associate has been saved.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func delete(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlAssociate.ObjQuery(req: req).first() else { | |||
| throw Abort(.notFound, reason: "Associate's ID was not supplied. Associate will not be deleted") | |||
| } | |||
| guard let _ = try? await obj.delete(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "There was a conflict deleting Associate. Make sure it has not children.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Associate has been deleted.") | |||
| } | |||
| return response | |||
| } | |||
| } | |||
| @@ -0,0 +1,81 @@ | |||
| // | |||
| // cntrlDepartment.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/11/2024. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Crypto | |||
| struct cntrlDepartment: RouteCollection { | |||
| func boot(routes: RoutesBuilder) throws { | |||
| let rts = routes.grouped("departments") | |||
| rts.get(use: index) | |||
| rts.get(":x", use: read) | |||
| rts.post(use: create) | |||
| rts.delete(":x", use: delete) | |||
| //Additional routs added here | |||
| } | |||
| @Sendable | |||
| func index(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlDepartment.ObjQuery(req: req).all() else { | |||
| throw Abort(.badGateway, reason: "Something went wrong with this api.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Array could not be shown.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func read(req:Request) async throws -> Response{ | |||
| guard let obj = try? await mdlDepartment.ObjQuery(req: req).first() else{ | |||
| throw Abort(.notFound, reason: "Department was not found.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else { | |||
| throw Abort(.noContent, reason: "Something went wrong decoding object.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func create(req: Request) async throws -> Response { | |||
| guard let obj = try? req.content.decode(mdlDepartment.self) else { | |||
| throw Abort(.notAcceptable, reason: "Department json not formatted correctly or is missing parents.") | |||
| } | |||
| var exists = false | |||
| if(obj.id != nil){ | |||
| obj._$idExists = true | |||
| exists = true | |||
| } | |||
| guard let _ = try? await obj.save(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "Something conflicts in the database. Department cannot be saved.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: exists ? .accepted : .created, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Department has been saved.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func delete(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlDepartment.ObjQuery(req: req).first() else { | |||
| throw Abort(.notFound, reason: "Department's ID was not supplied. Department will not be deleted") | |||
| } | |||
| guard let _ = try? await obj.delete(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "There was a conflict deleting Department. Make sure it has not children.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Department has been deleted.") | |||
| } | |||
| return response | |||
| } | |||
| } | |||
| @@ -0,0 +1,81 @@ | |||
| // | |||
| // cntrlDocType.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/11/2024. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Crypto | |||
| struct cntrlDocType: RouteCollection { | |||
| func boot(routes: RoutesBuilder) throws { | |||
| let rts = routes.grouped("doctypes") | |||
| rts.get(use: index) | |||
| rts.get(":x", use: read) | |||
| rts.post(use: create) | |||
| rts.delete(":x", use: delete) | |||
| //Additional routs added here | |||
| } | |||
| @Sendable | |||
| func index(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlDocType.ObjQuery(req: req).all() else { | |||
| throw Abort(.badGateway, reason: "Something went wrong with this api.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Array could not be shown.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func read(req:Request) async throws -> Response{ | |||
| guard let obj = try? await mdlDocType.ObjQuery(req: req).first() else{ | |||
| throw Abort(.notFound, reason: "DocType was not found.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else { | |||
| throw Abort(.noContent, reason: "Something went wrong decoding object.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func create(req: Request) async throws -> Response { | |||
| guard let obj = try? req.content.decode(mdlDocType.self) else { | |||
| throw Abort(.notAcceptable, reason: "DocType json not formatted correctly or is missing parents.") | |||
| } | |||
| var exists = false | |||
| if(obj.id != nil){ | |||
| obj._$idExists = true | |||
| exists = true | |||
| } | |||
| guard let _ = try? await obj.save(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "Something conflicts in the database. DocType cannot be saved.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: exists ? .accepted : .created, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. DocType has been saved.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func delete(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlDocType.ObjQuery(req: req).first() else { | |||
| throw Abort(.notFound, reason: "DocType's ID was not supplied. DocType will not be deleted") | |||
| } | |||
| guard let _ = try? await obj.delete(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "There was a conflict deleting DocType. Make sure it has not children.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. DocType has been deleted.") | |||
| } | |||
| return response | |||
| } | |||
| } | |||
| @@ -0,0 +1,81 @@ | |||
| // | |||
| // cntrlDocument.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/11/2024. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Crypto | |||
| struct cntrlDocument: RouteCollection { | |||
| func boot(routes: RoutesBuilder) throws { | |||
| let rts = routes.grouped("documents") | |||
| rts.get(use: index) | |||
| rts.get(":x", use: read) | |||
| rts.post(use: create) | |||
| rts.delete(":x", use: delete) | |||
| //Additional routs added here | |||
| } | |||
| @Sendable | |||
| func index(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlDocument.ObjQuery(req: req).all() else { | |||
| throw Abort(.badGateway, reason: "Something went wrong with this api.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Array could not be shown.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func read(req:Request) async throws -> Response{ | |||
| guard let obj = try? await mdlDocument.ObjQuery(req: req).first() else{ | |||
| throw Abort(.notFound, reason: "Document was not found.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else { | |||
| throw Abort(.noContent, reason: "Something went wrong decoding object.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func create(req: Request) async throws -> Response { | |||
| guard let obj = try? req.content.decode(mdlDocument.self) else { | |||
| throw Abort(.notAcceptable, reason: "Document json not formatted correctly or is missing parents.") | |||
| } | |||
| var exists = false | |||
| if(obj.id != nil){ | |||
| obj._$idExists = true | |||
| exists = true | |||
| } | |||
| guard let _ = try? await obj.save(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "Something conflicts in the database. Document cannot be saved.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: exists ? .accepted : .created, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Document has been saved.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func delete(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlDocument.ObjQuery(req: req).first() else { | |||
| throw Abort(.notFound, reason: "Document's ID was not supplied. Document will not be deleted") | |||
| } | |||
| guard let _ = try? await obj.delete(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "There was a conflict deleting Document. Make sure it has not children.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Document has been deleted.") | |||
| } | |||
| return response | |||
| } | |||
| } | |||
| @@ -0,0 +1,81 @@ | |||
| // | |||
| // cntrlXAssociateDepartment.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/11/2024. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Crypto | |||
| struct cntrlXAssociateDepartment: RouteCollection { | |||
| func boot(routes: RoutesBuilder) throws { | |||
| let rts = routes.grouped("xassociatedepartments") | |||
| rts.get(use: index) | |||
| rts.get(":x", use: read) | |||
| rts.post(use: create) | |||
| rts.delete(":x", use: delete) | |||
| //Additional routs added here | |||
| } | |||
| @Sendable | |||
| func index(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlXAssocDept.ObjQuery(req: req).all() else { | |||
| throw Abort(.badGateway, reason: "Something went wrong with this api.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Array could not be shown.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func read(req:Request) async throws -> Response{ | |||
| guard let obj = try? await mdlXAssocDept.ObjQuery(req: req).first() else{ | |||
| throw Abort(.notFound, reason: "XAssociateDepartment was not found.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else { | |||
| throw Abort(.noContent, reason: "Something went wrong decoding object.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func create(req: Request) async throws -> Response { | |||
| guard let obj = try? req.content.decode(mdlXAssocDept.self) else { | |||
| throw Abort(.notAcceptable, reason: "XAssociateDepartment json not formatted correctly or is missing parents.") | |||
| } | |||
| var exists = false | |||
| if(obj.id != nil){ | |||
| obj._$idExists = true | |||
| exists = true | |||
| } | |||
| guard let _ = try? await obj.save(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "Something conflicts in the database. XAssociateDepartment cannot be saved.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: exists ? .accepted : .created, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. XAssociateDepartment has been saved.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func delete(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlXAssocDept.ObjQuery(req: req).first() else { | |||
| throw Abort(.notFound, reason: "XAssociateDepartment's ID was not supplied. XAssociateDepartment will not be deleted") | |||
| } | |||
| guard let _ = try? await obj.delete(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "There was a conflict deleting XAssociateDepartment. Make sure it has not children.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. XAssociateDepartment has been deleted.") | |||
| } | |||
| return response | |||
| } | |||
| } | |||
| @@ -0,0 +1,81 @@ | |||
| // | |||
| // cntrlXDocDept.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/11/2024. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Crypto | |||
| struct cntrlXDocDept: RouteCollection { | |||
| func boot(routes: RoutesBuilder) throws { | |||
| let rts = routes.grouped("xdocdepts") | |||
| rts.get(use: index) | |||
| rts.get(":x", use: read) | |||
| rts.post(use: create) | |||
| rts.delete(":x", use: delete) | |||
| //Additional routs added here | |||
| } | |||
| @Sendable | |||
| func index(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlXDocDept.ObjQuery(req: req).all() else { | |||
| throw Abort(.badGateway, reason: "Something went wrong with this api.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. Array could not be shown.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func read(req:Request) async throws -> Response{ | |||
| guard let obj = try? await mdlXDocDept.ObjQuery(req: req).first() else{ | |||
| throw Abort(.notFound, reason: "XDocDept was not found.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else { | |||
| throw Abort(.noContent, reason: "Something went wrong decoding object.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func create(req: Request) async throws -> Response { | |||
| guard let obj = try? req.content.decode(mdlXDocDept.self) else { | |||
| throw Abort(.notAcceptable, reason: "XDocDept json not formatted correctly or is missing parents.") | |||
| } | |||
| var exists = false | |||
| if(obj.id != nil){ | |||
| obj._$idExists = true | |||
| exists = true | |||
| } | |||
| guard let _ = try? await obj.save(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "Something conflicts in the database. XDocDept cannot be saved.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: exists ? .accepted : .created, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. XDocDept has been saved.") | |||
| } | |||
| return response | |||
| } | |||
| @Sendable | |||
| func delete(req: Request) async throws -> Response { | |||
| guard let obj = try? await mdlXDocDept.ObjQuery(req: req).first() else { | |||
| throw Abort(.notFound, reason: "XDocDept's ID was not supplied. XDocDept will not be deleted") | |||
| } | |||
| guard let _ = try? await obj.delete(on: req.db) else{ | |||
| throw Abort(.conflict, reason: "There was a conflict deleting XDocDept. Make sure it has not children.") | |||
| } | |||
| guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{ | |||
| throw Abort(.noContent, reason: "Something went wrong decoding data. XDocDept has been deleted.") | |||
| } | |||
| return response | |||
| } | |||
| } | |||
| @@ -0,0 +1,52 @@ | |||
| // | |||
| // File.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/2/24. | |||
| // | |||
| import Foundation | |||
| import Vapor | |||
| import Crypto | |||
| enum CryptoError: Error{ | |||
| case badRequest | |||
| } | |||
| struct CustomCrypto{ | |||
| public static func DecryptString(input: String) throws -> String{ | |||
| let apikey = Environment.get("API_KEY") ?? "rv0ywT7Ygwh01jP1dQWBP39ogjq5ladO+EoNUGcBVq0=" | |||
| print(apikey) | |||
| let base64Key = apikey // Replace with your actual key | |||
| guard let keyData = Data(base64Encoded: base64Key) else { | |||
| fatalError("Invalid Base64 key data") | |||
| } | |||
| let data = Data(base64Encoded: input) | |||
| let encryptionKey = SymmetricKey(data: keyData) | |||
| let sealedBox = try! AES.GCM.SealedBox(combined: data!) | |||
| let decryptedData = try! AES.GCM.open(sealedBox, using: encryptionKey) | |||
| guard let decryptedString = String(data: decryptedData, encoding: .utf8) else{ | |||
| throw CryptoError.badRequest | |||
| } | |||
| return decryptedString | |||
| } | |||
| public static func EncryptString(input: String) throws -> String{ | |||
| let apikey = Environment.get("API_KEY") ?? "rv0ywT7Ygwh01jP1dQWBP39ogjq5ladO+EoNUGcBVq0=" | |||
| print(apikey) | |||
| guard let keyData = Data(base64Encoded: apikey) else{ | |||
| fatalError("Invalid Base64 key data") | |||
| } | |||
| let encryptionKey = SymmetricKey(data: keyData) | |||
| guard let datatoEncrypt = input.data(using: .utf8) else{ fatalError("Invalid Data")} | |||
| do{ | |||
| let sealedBox = try AES.GCM.seal(datatoEncrypt, using: encryptionKey) | |||
| guard let combined = sealedBox.combined else{ fatalError("Can't combine")} | |||
| let base64EncodedString = combined.base64EncodedString() | |||
| let urlEncodedString = base64EncodedString.addingPercentEncoding(withAllowedCharacters: .urlHostAllowed) | |||
| return urlEncodedString! | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,24 @@ | |||
| // | |||
| // File.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/11/24. | |||
| // | |||
| import NIOSSL | |||
| import Fluent | |||
| import FluentPostgresDriver | |||
| import Vapor | |||
| public func doMigrations(_ app: Application) async throws{ | |||
| app.migrations.add(mdlAssociate.Create()) | |||
| app.migrations.add(mdlDepartment.Create()) | |||
| app.migrations.add(mdlDepartment.AddParentReference()) | |||
| app.migrations.add(mdlDocType.Create()) | |||
| app.migrations.add(mdlDocument.Create()) | |||
| app.migrations.add(mdlXAssocDept.Create()) | |||
| app.migrations.add(mdlXDocDept.Create()) | |||
| try await app.autoMigrate() | |||
| } | |||
| @@ -1,14 +0,0 @@ | |||
| import Fluent | |||
| struct CreateTodo: AsyncMigration { | |||
| func prepare(on database: Database) async throws { | |||
| try await database.schema("todos") | |||
| .id() | |||
| .field("title", .string, .required) | |||
| .create() | |||
| } | |||
| func revert(on database: Database) async throws { | |||
| try await database.schema("todos").delete() | |||
| } | |||
| } | |||
| @@ -1,19 +0,0 @@ | |||
| import Fluent | |||
| import Vapor | |||
| final class Todo: Model, Content { | |||
| static let schema = "todos" | |||
| @ID(key: .id) | |||
| var id: UUID? | |||
| @Field(key: "title") | |||
| var title: String | |||
| init() { } | |||
| init(id: UUID? = nil, title: String) { | |||
| self.id = id | |||
| self.title = title | |||
| } | |||
| } | |||
| @@ -0,0 +1,100 @@ | |||
| // | |||
| // mdlUser.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/11/2024. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Foundation | |||
| import FluentKit | |||
| final class mdlAssociate: Model, Content { | |||
| static let schema = "associate" | |||
| @ID(custom: "id", generatedBy: .database) var id: Int? | |||
| @Field(key: "firstName") var firstname: String? | |||
| @Field(key: "lastName") var lastname: String? | |||
| @Siblings(through: mdlXAssocDept.self, from: \.$associate, to: \.$department) var departments: [mdlDepartment] | |||
| @Timestamp(key: "createDate", on: .create) var createdate: Date? | |||
| @Field(key: "createUserId") var createuserid: Int? | |||
| @Timestamp(key: "updateDate", on: .update) var updatedate: Date? | |||
| @Field(key: "updateUserId") var updateuserid: Int? | |||
| init() { } | |||
| init(id: Int? = nil, | |||
| firstname: String? = nil, | |||
| lastname: String? = nil, | |||
| createuserid: Int? = nil, | |||
| updateuserid: Int? = nil | |||
| ) { | |||
| self.id = id | |||
| self.firstname = firstname | |||
| self.lastname = lastname | |||
| self.createuserid = createuserid | |||
| self.updateuserid = updateuserid | |||
| } | |||
| } | |||
| extension mdlAssociate{ | |||
| struct Create: AsyncMigration { | |||
| func prepare(on database: Database) async throws { | |||
| try await database.schema("associate") | |||
| .field("id", .int, .identifier(auto: true)) | |||
| .field("firstName", .string) | |||
| .field("lastName", .string) | |||
| .field("createDate", .datetime) | |||
| .field("createUserId", .int) | |||
| .field("updateDate", .datetime) | |||
| .field("updateUserId", .int) | |||
| .create() | |||
| } | |||
| func revert(on database: Database) async throws { | |||
| try await database.schema("associate").delete() | |||
| } | |||
| } | |||
| public static func ObjQuery(req: Request) async throws -> QueryBuilder<mdlAssociate>{ | |||
| let query = mdlAssociate.query(on: req.db) | |||
| .with(\.$departments){ | |||
| dept in dept.with(\.$documents){ | |||
| doc in doc | |||
| .with(\.$doctype) | |||
| .with(\.$parent) | |||
| .with(\.$subsequent) | |||
| } | |||
| } | |||
| if let x = req.parameters.get("x"){ | |||
| let decryptedString = try CustomCrypto.DecryptString(input: x) | |||
| let array = decryptedString.components(separatedBy: ":") | |||
| ///This call is the standard get by id call | |||
| if (array.count == 1){ | |||
| let id = Int(array[0])! | |||
| return query.filter(\.$id == id) | |||
| } | |||
| ///Optional else if if there are multiple parameters in the call | |||
| ///You must include an else for each call that has parameters | |||
| ///Need to check the endpoint to get the right filter statements | |||
| ///else if(x.count == 2){ | |||
| /// let username = x[0] | |||
| /// let password = x[1] | |||
| /// return query.filter(\.$username == username).filter(\.$password == password) | |||
| ///} | |||
| else{ | |||
| throw Abort(.badRequest) | |||
| } | |||
| } | |||
| else{ | |||
| return query | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,118 @@ | |||
| // | |||
| // mdlDepartment.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 4/11/2024. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Foundation | |||
| import FluentKit | |||
| final class mdlDepartment: Model, Content { | |||
| static let schema = "department" | |||
| @ID(custom: "id", generatedBy: .database) var id: Int? | |||
| @Field(key: "name") var name: String? | |||
| @OptionalParent(key: "parentId") var parent: mdlDepartment? | |||
| @Children(for: \.$parent) var subdepartments: [mdlDepartment] | |||
| @Siblings(through: mdlXAssocDept.self, from: \.$department, to: \.$associate) var associates: [mdlAssociate] | |||
| @Siblings(through: mdlXDocDept.self, from: \.$department, to: \.$document) var documents: [mdlDocument] | |||
| @Timestamp(key: "createDate", on: .create) var createdate: Date? | |||
| @Field(key: "createUserId") var createuserid: Int? | |||
| @Timestamp(key: "updateDate", on: .update) var updatedate: Date? | |||
| @Field(key: "updateUserId") var updateuserid: Int? | |||
| init() { } | |||
| init(id: Int? = nil, | |||
| name: String? = nil, | |||
| parentid: Int? = nil, | |||
| createuserid: Int? = nil, | |||
| updateuserid: Int? = nil | |||
| ) { | |||
| self.id = id | |||
| self.name = name | |||
| if(parentid != nil) { self.$parent.$id.value = parentid } | |||
| self.createuserid = createuserid | |||
| self.updateuserid = updateuserid | |||
| } | |||
| } | |||
| extension mdlDepartment{ | |||
| struct Create: AsyncMigration { | |||
| func prepare(on database: Database) async throws { | |||
| try await database.schema("department") | |||
| .field("id", .int, .identifier(auto: true)) | |||
| .field("name", .string) | |||
| .field("departmentId", .int) | |||
| .field("createDate", .datetime) | |||
| .field("createUserId", .int) | |||
| .field("updateDate", .datetime) | |||
| .field("updateUserId", .int) | |||
| .create() | |||
| } | |||
| func revert(on database: Database) async throws { | |||
| try await database.schema("department").delete() | |||
| } | |||
| } | |||
| struct AddParentReference: AsyncMigration { | |||
| func prepare(on database: Database) async throws { | |||
| try await database.schema("department") | |||
| .deleteField("departmentId") | |||
| .field("departmentId", .int, .references("department", "id")) | |||
| .update() | |||
| } | |||
| func revert(on database: Database) async throws { | |||
| try await database.schema("department") | |||
| .deleteField("departmentId") | |||
| .field("departmentId", .int) | |||
| .update() | |||
| } | |||
| } | |||
| public static func ObjQuery(req: Request) async throws -> QueryBuilder<mdlDepartment>{ | |||
| let query = mdlDepartment.query(on: req.db) | |||
| .with(\.$subdepartments) | |||
| .with(\.$parent) | |||
| .with(\.$associates) | |||
| .with(\.$documents){ | |||
| doc in doc | |||
| .with(\.$doctype) | |||
| .with(\.$parent) | |||
| .with(\.$subsequent) | |||
| } | |||
| if let x = req.parameters.get("x"){ | |||
| let decryptedString = try CustomCrypto.DecryptString(input: x) | |||
| let array = decryptedString.components(separatedBy: ":") | |||
| ///This call is the standard get by id call | |||
| if (array.count == 1){ | |||
| let id = Int(array[0])! | |||
| return query.filter(\.$id == id) | |||
| } | |||
| ///Optional else if if there are multiple parameters in the call | |||
| ///You must include an else for each call that has parameters | |||
| ///Need to check the endpoint to get the right filter statements | |||
| ///else if(x.count == 2){ | |||
| /// let username = x[0] | |||
| /// let password = x[1] | |||
| /// return query.filter(\.$username == username).filter(\.$password == password) | |||
| ///} | |||
| else{ | |||
| throw Abort(.badRequest) | |||
| } | |||
| } | |||
| else{ | |||
| return query | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,95 @@ | |||
| // | |||
| // mdlDocType.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 2/16/24. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Foundation | |||
| import FluentKit | |||
| final class mdlDocType: Model, Content { | |||
| static let schema = "docType" | |||
| @ID(custom: "id", generatedBy: .database) var id: Int? | |||
| @Field(key: "name") var name: String? | |||
| @Children(for: \.$doctype) var documents: [mdlDocument] | |||
| @Timestamp(key: "createDate", on: .create) var createdate: Date? | |||
| @Field(key: "createUserId") var createuserid: Int? | |||
| @Timestamp(key: "updateDate", on: .update) var updatedate: Date? | |||
| @Field(key: "updateUserId") var updateuserid: Int? | |||
| init() { } | |||
| init(id: Int? = nil, | |||
| name: String? = nil, | |||
| createuserid: Int? = nil, | |||
| updateuserid: Int? = nil | |||
| ) { | |||
| self.id = id | |||
| self.name = name | |||
| self.createuserid = createuserid | |||
| self.updateuserid = updateuserid | |||
| } | |||
| } | |||
| extension mdlDocType{ | |||
| struct Create: AsyncMigration { | |||
| func prepare(on database: Database) async throws { | |||
| try await database.schema("docType") | |||
| .field("id", .int, .identifier(auto: true)) | |||
| .field("name", .string) | |||
| .field("createDate", .datetime) | |||
| .field("createUserId", .int) | |||
| .field("updateDate", .datetime) | |||
| .field("updateUserId", .int) | |||
| .create() | |||
| } | |||
| func revert(on database: Database) async throws { | |||
| try await database.schema("docType").delete() | |||
| } | |||
| } | |||
| public static func ObjQuery(req: Request) async throws -> QueryBuilder<mdlDocType>{ | |||
| let query = mdlDocType.query(on: req.db) | |||
| .with(\.$documents){ | |||
| doc in doc | |||
| .with(\.$parent) | |||
| .with(\.$subsequent) | |||
| .with(\.$department) | |||
| } | |||
| if let x = req.parameters.get("x"){ | |||
| let decryptedString = try CustomCrypto.DecryptString(input: x) | |||
| let array = decryptedString.components(separatedBy: ":") | |||
| ///This call is the standard get by id call | |||
| if (array.count == 1){ | |||
| let id = Int(array[0])! | |||
| return query.filter(\.$id == id) | |||
| } | |||
| ///Optional else if if there are multiple parameters in the call | |||
| ///You must include an else for each call that has parameters | |||
| ///Need to check the endpoint to get the right filter statements | |||
| ///else if(x.count == 2){ | |||
| /// let username = x[0] | |||
| /// let password = x[1] | |||
| /// return query.filter(\.$username == username).filter(\.$password == password) | |||
| ///} | |||
| else{ | |||
| throw Abort(.badRequest) | |||
| } | |||
| } | |||
| else{ | |||
| return query | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,107 @@ | |||
| // | |||
| // mdlDocument.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 2/16/24. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Foundation | |||
| import FluentKit | |||
| final class mdlDocument: Model, Content { | |||
| static let schema = "document" | |||
| @ID(custom: "id", generatedBy: .database) var id: Int? | |||
| @Field(key: "name") var name: String? | |||
| @Field(key: "number") var number: String? | |||
| @Parent(key: "docTypeId") var doctype: mdlDocType | |||
| @Parent(key: "departmentId") var department: mdlDepartment | |||
| @OptionalParent(key: "parentId") var parent: mdlDocument? | |||
| @Children(for: \.$parent) var subsequent: [mdlDocument] | |||
| @Timestamp(key: "createDate", on: .create) var createdate: Date? | |||
| @Field(key: "createUserId") var createuserid: Int? | |||
| @Timestamp(key: "updateDate", on: .update) var updatedate: Date? | |||
| @Field(key: "updateUserId") var updateuserid: Int? | |||
| init() { } | |||
| init(id: Int? = nil, | |||
| name: String? = nil, | |||
| number: String? = nil, | |||
| doctypeid: Int, | |||
| departmentid: Int, | |||
| parentid: Int? = nil, | |||
| createuserid: Int? = nil, | |||
| updateuserid: Int? = nil | |||
| ) { | |||
| self.id = id | |||
| self.name = name | |||
| self.number = number | |||
| self.$doctype.$id.value = doctypeid | |||
| self.$department.$id.value = departmentid | |||
| if(parentid != nil) { self.$parent.$id.value = parentid } | |||
| self.createuserid = createuserid | |||
| self.updateuserid = updateuserid | |||
| } | |||
| } | |||
| extension mdlDocument{ | |||
| struct Create: AsyncMigration { | |||
| func prepare(on database: Database) async throws { | |||
| try await database.schema("document") | |||
| .field("id", .int, .identifier(auto: true)) | |||
| .field("name", .string) | |||
| .field("number", .string) | |||
| .field("docTypeId", .int, .references("docType", "id")) | |||
| .field("departmentId", .int, .references("department", "id")) | |||
| .field("parentId", .int, .references("document", "id")) | |||
| .field("createDate", .datetime) | |||
| .field("createUserId", .int) | |||
| .field("updateDate", .datetime) | |||
| .field("updateUserId", .int) | |||
| .create() | |||
| } | |||
| func revert(on database: Database) async throws { | |||
| try await database.schema("document").delete() | |||
| } | |||
| } | |||
| public static func ObjQuery(req: Request) async throws -> QueryBuilder<mdlDocument>{ | |||
| let query = mdlDocument.query(on: req.db) | |||
| .with(\.$doctype) | |||
| .with(\.$parent) | |||
| .with(\.$subsequent) | |||
| .with(\.$department) | |||
| if let x = req.parameters.get("x"){ | |||
| let decryptedString = try CustomCrypto.DecryptString(input: x) | |||
| let array = decryptedString.components(separatedBy: ":") | |||
| ///This call is the standard get by id call | |||
| if (array.count == 1){ | |||
| let id = Int(array[0])! | |||
| return query.filter(\.$id == id) | |||
| } | |||
| ///Optional else if if there are multiple parameters in the call | |||
| ///You must include an else for each call that has parameters | |||
| ///Need to check the endpoint to get the right filter statements | |||
| ///else if(x.count == 2){ | |||
| /// let username = x[0] | |||
| /// let password = x[1] | |||
| /// return query.filter(\.$username == username).filter(\.$password == password) | |||
| ///} | |||
| else{ | |||
| throw Abort(.badRequest) | |||
| } | |||
| } | |||
| else{ | |||
| return query | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,92 @@ | |||
| // | |||
| // mdlXAssocDept.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 2/16/24. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Foundation | |||
| import FluentKit | |||
| final class mdlXAssocDept: Model, Content { | |||
| static let schema = "xAssocDept" | |||
| @ID(custom: "id", generatedBy: .database) var id: Int? | |||
| @Parent(key: "associateId") var associate: mdlAssociate | |||
| @Parent(key: "departmentId") var department: mdlDepartment | |||
| @Timestamp(key: "createDate", on: .create) var createdate: Date? | |||
| @Field(key: "createUserId") var createuserid: Int? | |||
| @Timestamp(key: "updateDate", on: .update) var updatedate: Date? | |||
| @Field(key: "updateUserId") var updateuserid: Int? | |||
| init() { } | |||
| init(id: Int? = nil, | |||
| associateid: Int, | |||
| departmentid: Int, | |||
| createuserid: Int? = nil, | |||
| updateuserid: Int? = nil | |||
| ) { | |||
| self.id = id | |||
| self.$associate.$id.value = associateid | |||
| self.$department.$id.value = departmentid | |||
| self.createuserid = createuserid | |||
| self.updateuserid = updateuserid | |||
| } | |||
| } | |||
| extension mdlXAssocDept{ | |||
| struct Create: AsyncMigration { | |||
| func prepare(on database: Database) async throws { | |||
| try await database.schema("xAssocDept") | |||
| .field("id", .int, .identifier(auto: true)) | |||
| .field("associateId", .int, .references("associate", "id")) | |||
| .field("departmentId", .int, .references("department", "id")) | |||
| .field("createDate", .datetime) | |||
| .field("createUserId", .int) | |||
| .field("updateDate", .datetime) | |||
| .field("updateUserId", .int) | |||
| .create() | |||
| } | |||
| func revert(on database: Database) async throws { | |||
| try await database.schema("xAssocDept").delete() | |||
| } | |||
| } | |||
| public static func ObjQuery(req: Request) async throws -> QueryBuilder<mdlXAssocDept>{ | |||
| let query = mdlXAssocDept.query(on: req.db) | |||
| .with(\.$associate) | |||
| .with(\.$department) | |||
| if let x = req.parameters.get("x"){ | |||
| let decryptedString = try CustomCrypto.DecryptString(input: x) | |||
| let array = decryptedString.components(separatedBy: ":") | |||
| ///This call is the standard get by id call | |||
| if (array.count == 1){ | |||
| let id = Int(array[0])! | |||
| return query.filter(\.$id == id) | |||
| } | |||
| ///Optional else if if there are multiple parameters in the call | |||
| ///You must include an else for each call that has parameters | |||
| ///Need to check the endpoint to get the right filter statements | |||
| ///else if(x.count == 2){ | |||
| /// let username = x[0] | |||
| /// let password = x[1] | |||
| /// return query.filter(\.$username == username).filter(\.$password == password) | |||
| ///} | |||
| else{ | |||
| throw Abort(.badRequest) | |||
| } | |||
| } | |||
| else{ | |||
| return query | |||
| } | |||
| } | |||
| } | |||
| @@ -0,0 +1,92 @@ | |||
| // | |||
| // mdlXDocDept.swift | |||
| // | |||
| // | |||
| // Created by Michiel Carman on 2/16/24. | |||
| // | |||
| import Fluent | |||
| import Vapor | |||
| import Foundation | |||
| import FluentKit | |||
| final class mdlXDocDept: Model, Content { | |||
| static let schema = "xDocDept" | |||
| @ID(custom: "id", generatedBy: .database) var id: Int? | |||
| @Parent(key: "documentId") var document: mdlDocument | |||
| @Parent(key: "departmentId") var department: mdlDepartment | |||
| @Timestamp(key: "createDate", on: .create) var createdate: Date? | |||
| @Field(key: "createUserId") var createuserid: Int? | |||
| @Timestamp(key: "updateDate", on: .update) var updatedate: Date? | |||
| @Field(key: "updateUserId") var updateuserid: Int? | |||
| init() { } | |||
| init(id: Int? = nil, | |||
| documentid: Int, | |||
| departmentid: Int, | |||
| createuserid: Int? = nil, | |||
| updateuserid: Int? = nil | |||
| ) { | |||
| self.id = id | |||
| self.$document.$id.value = documentid | |||
| self.$department.$id.value = departmentid | |||
| self.createuserid = createuserid | |||
| self.updateuserid = updateuserid | |||
| } | |||
| } | |||
| extension mdlXDocDept{ | |||
| struct Create: AsyncMigration { | |||
| func prepare(on database: Database) async throws { | |||
| try await database.schema("xDocDept") | |||
| .field("id", .int, .identifier(auto: true)) | |||
| .field("documentId", .int, .references("document", "id")) | |||
| .field("departmentId", .int, .references("department", "id")) | |||
| .field("createDate", .datetime) | |||
| .field("createUserId", .int) | |||
| .field("updateDate", .datetime) | |||
| .field("updateUserId", .int) | |||
| .create() | |||
| } | |||
| func revert(on database: Database) async throws { | |||
| try await database.schema("xDocDept").delete() | |||
| } | |||
| } | |||
| public static func ObjQuery(req: Request) async throws -> QueryBuilder<mdlXDocDept>{ | |||
| let query = mdlXDocDept.query(on: req.db) | |||
| .with(\.$document) | |||
| .with(\.$department) | |||
| if let x = req.parameters.get("x"){ | |||
| let decryptedString = try CustomCrypto.DecryptString(input: x) | |||
| let array = decryptedString.components(separatedBy: ":") | |||
| ///This call is the standard get by id call | |||
| if (array.count == 1){ | |||
| let id = Int(array[0])! | |||
| return query.filter(\.$id == id) | |||
| } | |||
| ///Optional else if if there are multiple parameters in the call | |||
| ///You must include an else for each call that has parameters | |||
| ///Need to check the endpoint to get the right filter statements | |||
| ///else if(x.count == 2){ | |||
| /// let username = x[0] | |||
| /// let password = x[1] | |||
| /// return query.filter(\.$username == username).filter(\.$password == password) | |||
| ///} | |||
| else{ | |||
| throw Abort(.badRequest) | |||
| } | |||
| } | |||
| else{ | |||
| return query | |||
| } | |||
| } | |||
| } | |||
| @@ -5,20 +5,30 @@ import Vapor | |||
| // configures your application | |||
| public func configure(_ app: Application) async throws { | |||
| // uncomment to serve files from /Public folder | |||
| // app.middleware.use(FileMiddleware(publicDirectory: app.directory.publicDirectory)) | |||
| app.middleware.use(CORSMiddleware()) | |||
| let corsConfiguration = CORSMiddleware.Configuration( | |||
| allowedOrigin: .all, | |||
| allowedMethods: [.GET, .POST, .PUT, .OPTIONS, .DELETE, .PATCH], | |||
| allowedHeaders: [.accept, .authorization, .contentType, .origin, .xRequestedWith, .userAgent, .accessControlAllowOrigin] | |||
| ) | |||
| let cors = CORSMiddleware(configuration: corsConfiguration) | |||
| app.middleware.use(cors, at: .beginning) | |||
| app.http.server.configuration.port = 3004 | |||
| app.databases.use(DatabaseConfigurationFactory.postgres(configuration: .init( | |||
| hostname: Environment.get("DATABASE_HOST") ?? "localhost", | |||
| port: Environment.get("DATABASE_PORT").flatMap(Int.init(_:)) ?? SQLPostgresConfiguration.ianaPortNumber, | |||
| username: Environment.get("DATABASE_USERNAME") ?? "vapor_username", | |||
| password: Environment.get("DATABASE_PASSWORD") ?? "vapor_password", | |||
| database: Environment.get("DATABASE_NAME") ?? "vapor_database", | |||
| tls: .prefer(try .init(configuration: .clientDefault))) | |||
| username: Environment.get("DATABASE_USERNAME") ?? "mcarman", | |||
| password: Environment.get("DATABASE_PASSWORD") ?? "@ng31F@rm0823262", | |||
| database: Environment.get("DATABASE_NAME") ?? "trainingdb", | |||
| tls: .prefer(try .init(configuration: .clientDefault))) | |||
| ), as: .psql) | |||
| app.migrations.add(CreateTodo()) | |||
| app.logger.logLevel = .debug | |||
| try await doMigrations(app) | |||
| // register routes | |||
| try routes(app) | |||
| } | |||
| @@ -1,14 +1,14 @@ | |||
| import Foundation | |||
| import Fluent | |||
| import Vapor | |||
| import Crypto | |||
| func routes(_ app: Application) throws { | |||
| app.get { req async in | |||
| "It works!" | |||
| app.routes.caseInsensitive = true | |||
| app.routes.defaultMaxBodySize = "64mb"; | |||
| let baseApp = app.grouped("api").grouped("v1.0") | |||
| baseApp.get { req async in | |||
| "Training Services Version 1.0" | |||
| } | |||
| app.get("hello") { req async -> String in | |||
| "Hello, world!" | |||
| } | |||
| try app.register(collection: TodoController()) | |||
| } | |||