You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

123 regels
4.8 KiB

  1. //
  2. // cntrlUser.swift
  3. //
  4. //
  5. // Created by Michiel Carman on 4/1/24.
  6. //
  7. import Fluent
  8. import Vapor
  9. import Crypto
  10. struct cntrlUser: RouteCollection {
  11. func boot(routes: RoutesBuilder) throws {
  12. let rts = routes.grouped("users")
  13. rts.get(use: index)
  14. rts.get("login", ":x", use: login)
  15. // rts.get(":x", use: read).openAPI(
  16. // summary: "Create User",
  17. // description: "Create a new user with the provided data",
  18. // body: .type(mdlUser.self),
  19. // response: .type(mdlUser.self)
  20. // )
  21. rts.get("e", ":user", ":pwd", use: encrypt)
  22. rts.post(use: create)
  23. rts.delete(":x", use: delete)
  24. }
  25. func encrypt(req: Request) async throws -> String{
  26. let username = req.parameters.get("user")
  27. let pwd = req.parameters.get("pwd")
  28. let s = "\(username ?? "mcarman"):\(pwd ?? "password")"
  29. let es = try CustomCrypto.EncryptString(input: s)
  30. return es
  31. }
  32. func login(req: Request) async throws -> Response{
  33. guard let obj = try? await mdlUser.ObjQuery(req: req).first() else {
  34. throw Abort(.unauthorized, reason: "Username or Password or Both are invalid.")
  35. }
  36. var array: [Int] = []
  37. for wo in obj.workorders{
  38. array.append(wo.id!)
  39. }
  40. let retObj = mdlUser.Login(id: obj.id, firstName: obj.firstname, lastName: obj.lastname, roles: obj.roles, workorders: array)
  41. guard let response = try? await retObj.encodeResponse(status: .ok, for: req) else {
  42. throw Abort(.noContent, reason: "Something went wrong decoding data. User has been authenticated.")
  43. }
  44. return response
  45. }
  46. func index(req: Request) async throws -> Response {
  47. guard let obj = try? await mdlUser.ObjQuery(req: req).all() else {
  48. throw Abort(.badGateway, reason: "Something went wrong with this api.")
  49. }
  50. guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{
  51. throw Abort(.noContent, reason: "Something went wrong decoding data. Array could not be shown.")
  52. }
  53. return response
  54. }
  55. func read(req:Request) async throws -> Response{
  56. guard let obj = try? await mdlUser.ObjQuery(req: req).first() else{
  57. throw Abort(.notFound, reason: "User was not found.")
  58. }
  59. guard let response = try? await obj.encodeResponse(status: .ok, for: req) else {
  60. throw Abort(.noContent, reason: "Something went wrong decoding object.")
  61. }
  62. return response
  63. }
  64. func create(req: Request) async throws -> Response {
  65. guard let obj = try? req.content.decode(mdlUser.self) else {
  66. throw Abort(.notAcceptable, reason: "User json not formatted correctly or is missing parents.")
  67. }
  68. var exists = false
  69. if(obj.id != nil){
  70. obj._$idExists = true
  71. exists = true
  72. }
  73. guard let _ = try? await obj.save(on: req.db) else{
  74. throw Abort(.conflict, reason: "Something conflicts in the database. User cannot be saved.")
  75. }
  76. guard let response = try? await obj.encodeResponse(status: exists ? .accepted : .created, for: req) else{
  77. throw Abort(.noContent, reason: "Something went wrong decoding data. User has been saved.")
  78. }
  79. return response
  80. }
  81. func delete(req: Request) async throws -> Response {
  82. guard let obj = try? await mdlUser.ObjQuery(req: req).first() else {
  83. throw Abort(.notFound, reason: "User's ID was not supplied. User will not be deleted")
  84. }
  85. guard let _ = try? await obj.delete(on: req.db) else{
  86. throw Abort(.conflict, reason: "There was a conflict deleting User. Make sure it has not children.")
  87. }
  88. guard let response = try? await obj.encodeResponse(status: .ok, for: req) else{
  89. throw Abort(.noContent, reason: "Something went wrong decoding data. User has been deleted.")
  90. }
  91. return response
  92. }
  93. func createToken(req: Request) async throws -> Response{
  94. guard let obj = try? await mdlUser.ObjQuery(req: req).field(\.$id).field(\.$username).first() else{
  95. throw Abort(.notFound, reason: "User was not found.")
  96. }
  97. guard let exp = try? await mdlLicense.query(on: req.db).first() else {
  98. throw Abort(.notFound)
  99. }
  100. let token = Token(userid: obj.id!, token: [UInt8].random(count: 16).base64, source: .signup, expiresat: exp.expires)
  101. try await token.save(on: req.db)
  102. guard let response = try? await token.encodeResponse(status: .ok, for: req) else{
  103. throw Abort(.noContent, reason: "Something went wrong decoding data. Token has been deleted.")
  104. }
  105. return response
  106. }
  107. }