25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.
 
 

104 satır
3.7 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. //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 base64Key = "rv0ywT7Ygwh01jP1dQWBP39ogjq5ladO+EoNUGcBVq0=" // Replace with your actual key
  39. guard let keyData = Data(base64Encoded: base64Key) else {
  40. fatalError("Invalid Base64 key data")
  41. }
  42. let data = Data(base64Encoded: dataQuery)
  43. let encryptionKey = SymmetricKey(data: keyData)
  44. let sealedBox = try AES.GCM.SealedBox(combined: data!)
  45. let decryptedData = try AES.GCM.open(sealedBox, using: encryptionKey)
  46. guard let decryptedString = String(data: decryptedData, encoding: .utf8) else{
  47. throw Abort(.internalServerError, reason: "Fialed to decode decrypted data.")
  48. }
  49. let credentials = decryptedString.components(separatedBy: ":")
  50. guard credentials.count == 2 else {
  51. throw Abort(.badRequest, reason: "Invalid credential format.")
  52. }
  53. let username = credentials[0]
  54. let password = credentials[1]
  55. return try await mdlUser.query(on: req.db)
  56. .with(\.$roles)
  57. .with(\.$division)
  58. .with(\.$gate)
  59. .with(\.$location)
  60. .filter(\.$username == username)
  61. .filter( \.$password == password)
  62. .first()!
  63. }
  64. func index(req: Request) async throws -> [mdlUser] {
  65. try await mdlUser.query(on: req.db).with(\.$roles).all()
  66. }
  67. func create(req: Request) async throws -> mdlUser {
  68. let obj = try req.content.decode(mdlUser.self)
  69. try await obj.save(on: req.db)
  70. return obj
  71. }
  72. func update(req: Request) async throws -> mdlUser{
  73. let obj = try req.content.decode(mdlUser.self)
  74. let dbobj = try await mdlUser.query(on: req.db).filter(\.$id == obj.id!).first()!
  75. dbobj.firstname = obj.firstname
  76. dbobj.lastname = obj.lastname
  77. dbobj.email = obj.email
  78. dbobj.password = obj.password
  79. dbobj.updatedate = Date()
  80. dbobj.updateuserid = -1
  81. try await dbobj.update(on: req.db)
  82. return dbobj
  83. }
  84. func delete(req: Request) async throws -> HTTPStatus {
  85. guard let obj = try await mdlUser.find(req.parameters.get("id"), on: req.db) else {
  86. throw Abort(.notFound)
  87. }
  88. try await obj.delete(on: req.db)
  89. return .noContent
  90. }
  91. }