Nav apraksta

FlowerService.swift 6.6KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. //
  2. // FlowerService.swift
  3. // Flowerdex
  4. //
  5. // Created by Víctor A. Hernández on 12/20/20.
  6. //
  7. import Foundation
  8. class FlowerService: ObservableObject {
  9. @Published var response: Response = .unfetched
  10. @Published var items = [Flower]()
  11. private func getQueryParameters(_ filters: Filters) -> [URLQueryItem] {
  12. var list = [URLQueryItem]()
  13. list.append(URLQueryItem(name: "edible", value: "\(filters.edible)"))
  14. list.append(URLQueryItem(name: "vegetable", value: "\(filters.vegetable)"))
  15. if filters.commonName != "" {
  16. list.append(URLQueryItem(name: "q", value: filters.commonName.lowercased()))
  17. }
  18. // list.append(URLQueryItem(name: "common_name", value: filters.commonName.lowercased())) // if common_name was empty, which didn't make sense
  19. if filters.scientificName != "" {
  20. list.append(URLQueryItem(name: "scientific_name", value: filters.scientificName.lowercased()))
  21. }
  22. if filters.growthMonths > 0 {
  23. list.append(URLQueryItem(name: "growth_months", value: "\(filters.growthMonths)"))
  24. }
  25. if filters.bloomMonths > 0 {
  26. list.append(URLQueryItem(name: "bloom_months", value: "\(filters.bloomMonths)"))
  27. }
  28. if filters.flowerColor != "" {
  29. list.append(URLQueryItem(name: "flower_color", value: filters.flowerColor.lowercased()))
  30. }
  31. return list
  32. }
  33. private func getBaseURLComponent(_ apiPath: String) -> URLComponents {
  34. var components = URLComponents()
  35. components.scheme = Constants.Services.apiScheme
  36. components.host = Constants.Services.apiHost
  37. components.path = apiPath
  38. if apiPath == Constants.Services.apiGetFlowersPath {
  39. components.queryItems = [
  40. URLQueryItem(name: "user_id", value: "\(User.current.id!)"),
  41. ]
  42. }
  43. return components
  44. }
  45. private func fetchFlowers(_ request: URLRequest) {
  46. URLSession.shared.dataTask(with: request) { data, response, error in
  47. guard let data = data else {
  48. print("No data in response: \(error?.localizedDescription ?? "Unknown error")")
  49. DispatchQueue.main.async {
  50. self.response = .failure
  51. }
  52. return
  53. }
  54. print(response ?? "No response")
  55. // print("Recieved data:", String(decoding: data, as: UTF8.self))
  56. guard let apiResponse = try? JSONDecoder().decode(FlowersResponseModel.self, from: data) else {
  57. print("Failed to decode Trefle response")
  58. DispatchQueue.main.async {
  59. self.response = .failure
  60. }
  61. return
  62. }
  63. if let httpResponse = response as? HTTPURLResponse {
  64. DispatchQueue.main.async {
  65. if httpResponse.statusCode == 200 && apiResponse.error == nil {
  66. print("No error")
  67. self.response = .success
  68. self.items = apiResponse.data!
  69. } else {
  70. print("Error: \(apiResponse.error ?? "Unknown error")")
  71. self.response = .failure
  72. // self.items = [FlowerItem]()
  73. }
  74. }
  75. }
  76. }.resume()
  77. }
  78. func getFlowers(p page: Int = 1, f filters: Filters?) {
  79. // Start loading state
  80. self.response = .loading
  81. // Construct URL
  82. var components = self.getBaseURLComponent(Constants.Services.apiGetFlowersPath)
  83. if filters != nil {
  84. components.queryItems!.append(contentsOf: self.getQueryParameters(filters!))
  85. }
  86. components.queryItems!.append(URLQueryItem(name: "page", value: "\(page)"))
  87. // Prepare and carry out request
  88. // print("😂" + components.url!.absoluteString)
  89. var request = URLRequest(url: components.url!)
  90. request.httpMethod = "GET"
  91. self.fetchFlowers(request)
  92. }
  93. func wishlistOrHistorySkeletonRequest(_ flowerID: Int, remove: Bool, wishlist: Bool) {
  94. // Construct Body
  95. let jsonObject : [String: Int] = [
  96. "user_id": User.current.id!,
  97. "flower_id": flowerID
  98. ]
  99. guard let jsonData = try? JSONEncoder().encode(jsonObject) else {
  100. print("Failed to encode JSON for \(flowerID)")
  101. return
  102. }
  103. print(String(data: jsonData, encoding: .utf8)!)
  104. // Construct URL
  105. var path: String
  106. if remove {
  107. if wishlist {
  108. path = Constants.Services.apiRemoveFavoritePath
  109. } else {
  110. path = Constants.Services.apiRemoveFoundPath
  111. }
  112. } else {
  113. if wishlist {
  114. path = Constants.Services.apiPutFavoritePath
  115. } else {
  116. path = Constants.Services.apiPutFoundPath
  117. }
  118. }
  119. print((remove ? "removing " : "putting ") + (wishlist ? "favorite" : "found"))
  120. let components = getBaseURLComponent(path)
  121. var request = URLRequest(url: components.url!)
  122. request.httpMethod = "POST"
  123. request.httpBody = jsonData
  124. // Send POST request
  125. URLSession.shared.dataTask(with: request) { data, response, error in
  126. print(response ?? "No response")
  127. if let httpResponse = response as? HTTPURLResponse {
  128. DispatchQueue.main.async {
  129. if httpResponse.statusCode == 200 {
  130. // alert that we removed favorite
  131. print("Success!")
  132. } else {
  133. // alert that we couldn't remove favorite
  134. print("Error! \(httpResponse.statusCode)")
  135. }
  136. }
  137. }
  138. }.resume()
  139. }
  140. func removeFavorite(_ flowerID: Int) {
  141. wishlistOrHistorySkeletonRequest(flowerID, remove: true, wishlist: true)
  142. }
  143. func putFavorite(_ flowerID: Int) {
  144. wishlistOrHistorySkeletonRequest(flowerID, remove: false, wishlist: true)
  145. }
  146. func removeFound(_ flowerID: Int) {
  147. wishlistOrHistorySkeletonRequest(flowerID, remove: true, wishlist: false)
  148. }
  149. func putFound(_ flowerID: Int) {
  150. wishlistOrHistorySkeletonRequest(flowerID, remove: false, wishlist: false)
  151. }
  152. }