暫無描述

FlowerService.swift 6.4KB

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