説明なし

AuthenticationService.swift 5.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  1. //
  2. // AuthenticationService.swift
  3. // Flowerdex
  4. //
  5. // Created by Víctor A. Hernández on 12/20/20.
  6. //
  7. import Foundation
  8. class LoginModel: ObservableObject {
  9. @Published var response: Response = .unfetched
  10. private func getBaseURL(_ apiPath: String) -> URL {
  11. var components = URLComponents()
  12. components.scheme = Constants.Services.apiScheme
  13. components.host = Constants.Services.apiHost
  14. components.path = apiPath
  15. return components.url!
  16. }
  17. private func authenticate(_ request: URLRequest) {
  18. URLSession.shared.dataTask(with: request) { data, response, error in
  19. guard let data = data
  20. else {
  21. print("No data in response: \(error?.localizedDescription ?? "Unknown error")")
  22. DispatchQueue.main.async {
  23. self.response = .failure
  24. }
  25. return
  26. }
  27. print(response ?? "No response")
  28. print("Received data:", data)
  29. print(error ?? "No error")
  30. guard let apiResponse = try? JSONDecoder().decode(User.self, from: data) else {
  31. print("Failed to decode ADA response")
  32. DispatchQueue.main.async {
  33. self.response = .failure
  34. }
  35. return
  36. }
  37. if let httpResponse = response as? HTTPURLResponse {
  38. DispatchQueue.main.async {
  39. if httpResponse.statusCode == 200 {
  40. self.response = .success
  41. User.setCurrent(apiResponse, writeToUserDefaults: true) // TODO: change to false when other auth method is supplied
  42. } else {
  43. self.response = .failure
  44. }
  45. }
  46. }
  47. }.resume()
  48. }
  49. func login(data: LoginData) {
  50. self.response = .loading
  51. guard let encodedData = try? JSONEncoder().encode(data)
  52. else {
  53. print("Failed to encode login request")
  54. DispatchQueue.main.async {
  55. self.response = .failure
  56. }
  57. return
  58. }
  59. let url = getBaseURL(Constants.Services.apiLoginPath)
  60. var request = URLRequest(url: url)
  61. request.setValue("application/json", forHTTPHeaderField: "Content-Type")
  62. request.httpMethod = "POST"
  63. request.httpBody = encodedData
  64. self.authenticate(request)
  65. }
  66. }
  67. class RegistrationModel: ObservableObject {
  68. @Published var response: Response = .unfetched
  69. private func getBaseURL(_ apiPath: String) -> URL {
  70. var components = URLComponents()
  71. components.scheme = Constants.Services.apiScheme
  72. components.host = Constants.Services.apiHost
  73. components.path = apiPath
  74. return components.url!
  75. }
  76. private func authenticate(_ request: URLRequest) {
  77. URLSession.shared.dataTask(with: request) { data, response, error in
  78. guard let data = data
  79. else {
  80. print("No data in response: \(error?.localizedDescription ?? "Unknown error")")
  81. DispatchQueue.main.async {
  82. self.response = .failure
  83. }
  84. return
  85. }
  86. print(response ?? "No response")
  87. print("Received data:", data)
  88. print(error ?? "No error")
  89. guard let apiResponse = try? JSONDecoder().decode(User.self, from: data) else {
  90. print("Failed to decode ADA response")
  91. DispatchQueue.main.async {
  92. self.response = .failure
  93. }
  94. return
  95. }
  96. if let httpResponse = response as? HTTPURLResponse {
  97. DispatchQueue.main.async {
  98. if httpResponse.statusCode == 200 {
  99. self.response = .success
  100. User.setCurrent(apiResponse, writeToUserDefaults: true) // TODO: change to false when other auth method is supplied
  101. } else {
  102. self.response = .failure
  103. }
  104. }
  105. }
  106. }.resume()
  107. }
  108. func register(data: RegistrationData) {
  109. self.response = .loading
  110. guard let encodedData = try? JSONEncoder().encode(data)
  111. else {
  112. print("Failed to encode registration request")
  113. DispatchQueue.main.async {
  114. self.response = .failure
  115. }
  116. return
  117. }
  118. print("Registration JSON:", String(data: encodedData, encoding: .utf8)!)
  119. let url = getBaseURL(Constants.Services.apiRegistrationPath)
  120. var request = URLRequest(url: url)
  121. request.setValue("application/json", forHTTPHeaderField: "Content-Type")
  122. request.httpMethod = "POST"
  123. request.httpBody = encodedData
  124. self.authenticate(request)
  125. }
  126. }