Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

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