Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.
 
 

100 lignes
3.2 KiB

  1. //
  2. // File.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", ":credentials", use: login)
  15. rts.post(use: create)
  16. rts.put(use: update)
  17. rts.group(":id") { todo in
  18. rts.delete(use: delete)
  19. }
  20. rts.get("api", use: api)
  21. //let encryptionKey = SymmetricKey(data: Environment.get("ENCRYPTION_KEY")!.data(using: .utf8)!)
  22. // rts.get(use: "login"){
  23. // req -> String in guard let dataQuery = req.query[String.self, at: "data"], let data = Data(base64Encoded: dataQuery) else{
  24. // throw Abort(.badRequest)
  25. // }
  26. // let encryptionKey = SymmetricKey(size: .bits256) {
  27. // let sealedBox = try AES.GCM.SealedBox(combined: data)
  28. // let decryptedData = try AES.GCM.open(sealedBox, using: encryptionKey)
  29. // guard let decryptedString = String(data: decryptedData, encoding: .utf8) else{
  30. // throw Abort(.internalServerError, "Failed to decode decrypted data.")
  31. // }
  32. // }
  33. // }
  34. }
  35. func api(req: Request) async throws -> String{
  36. return Environment.get("API_KEY")!
  37. }
  38. func login(req: Request) async throws -> mdlUser{
  39. guard let dataQuery = req.parameters.get("credentials") else{
  40. throw Abort(.badRequest)
  41. }
  42. let decryptedString = try CustomCrypto.DecryptString(input: dataQuery)
  43. let credentials = decryptedString.components(separatedBy: ":")
  44. guard credentials.count == 2 else {
  45. throw Abort(.badRequest, reason: "Invalid credential format.")
  46. }
  47. let username = credentials[0]
  48. let password = credentials[1]
  49. return try await mdlUser.query(on: req.db)
  50. .with(\.$roles)
  51. .with(\.$division)
  52. .with(\.$gate)
  53. .with(\.$location)
  54. .filter(\.$username == username)
  55. .filter( \.$password == password)
  56. .first()!
  57. }
  58. func index(req: Request) async throws -> [mdlUser] {
  59. try await mdlUser.query(on: req.db).with(\.$roles).all()
  60. }
  61. func create(req: Request) async throws -> mdlUser {
  62. let obj = try req.content.decode(mdlUser.self)
  63. try await obj.save(on: req.db)
  64. return obj
  65. }
  66. func update(req: Request) async throws -> mdlUser{
  67. let obj = try req.content.decode(mdlUser.self)
  68. let dbobj = try await mdlUser.query(on: req.db).filter(\.$id == obj.id!).first()!
  69. dbobj.firstname = obj.firstname
  70. dbobj.lastname = obj.lastname
  71. dbobj.email = obj.email
  72. dbobj.password = obj.password
  73. dbobj.updatedate = Date()
  74. dbobj.updateuserid = -1
  75. try await dbobj.update(on: req.db)
  76. return dbobj
  77. }
  78. func delete(req: Request) async throws -> HTTPStatus {
  79. guard let obj = try await mdlUser.find(req.parameters.get("id"), on: req.db) else {
  80. throw Abort(.notFound)
  81. }
  82. try await obj.delete(on: req.db)
  83. return .noContent
  84. }
  85. }