Du kan inte välja fler än 25 ämnen Ämnen måste starta med en bokstav eller siffra, kan innehålla bindestreck ('-') och vara max 35 tecken långa.

248 rader
8.9 KiB

  1. //
  2. // FuelEntryController.swift
  3. //
  4. //
  5. // Created by Bill Ryckman on 4/24/23.
  6. //
  7. import Vapor
  8. import FluentKit
  9. struct FuelEntryV2Controller: RouteCollection {
  10. func boot(routes: RoutesBuilder) throws {
  11. let fuelEntries = routes.grouped("fuel_entries")
  12. let tokenAuthMiddleware = Token.authenticator()
  13. let guardMiddleware = User.guardMiddleware()
  14. let tokenAuthGroup = fuelEntries.grouped(tokenAuthMiddleware, guardMiddleware)
  15. tokenAuthGroup.get(use: index)
  16. tokenAuthGroup.get("test", use: filtered)
  17. // fuelEntries.get("with-images", use: getAllEntriesWithImages)
  18. tokenAuthGroup.post(use: create)
  19. tokenAuthGroup.put( use: softdelete)
  20. // fuelEntries.post("upload-image", use: uploadImage)
  21. tokenAuthGroup.group(":fuelEntryID") { fuelEntry in
  22. fuelEntry.delete(use: delete)
  23. }
  24. }
  25. func index(req: Request) async throws -> [FuelEntry] {
  26. return try await FuelEntry.query(on: req.db).all()
  27. }
  28. struct filteredreturn: Content{
  29. var fuelentries: [FuelEntry]
  30. var pages: Int
  31. }
  32. struct dload: Content{
  33. var id: UUID
  34. }
  35. @Sendable
  36. func softdelete(req: Request) async throws -> Response {
  37. let ids = try req.content.decode([dload].self)
  38. var msg: [String] = []
  39. for id in ids {
  40. guard let fe = try await FuelEntry.find(id.id, on: req.db) else {
  41. msg.append("create error message for item")
  42. continue
  43. }
  44. fe.downloaded = true
  45. try await fe.save(on: req.db)
  46. }
  47. let response = Response(status: .ok, body: "good")
  48. return response
  49. }
  50. @Sendable
  51. func filtered(req: Request) async throws -> Response {
  52. var image: Bool
  53. var serial: String
  54. var tank: String
  55. let qstring = req.query
  56. if let qimage = try? qstring.get(Bool.self, at: "image"){
  57. image = qimage
  58. } else {
  59. image = false
  60. }
  61. if let qserial = try? qstring.get(String.self, at: "serial"){
  62. serial = qserial
  63. } else {
  64. serial = ""
  65. }
  66. if let qtank = try? qstring.get(String.self, at: "tank"){
  67. tank = qtank
  68. } else {
  69. tank = ""
  70. }
  71. var query = FuelEntry.query(on: req.db)
  72. if(image){
  73. query = query
  74. .field(\.$id)
  75. .field(\.$timestamp)
  76. .field(\.$userID)
  77. .field(\.$product)
  78. .field(\.$make)
  79. .field(\.$model)
  80. .field(\.$serialNumber)
  81. .field(\.$tankID)
  82. .field(\.$fuelAmount)
  83. .field(\.$fuelType)
  84. .field(\.$isOverride)
  85. .field(\.$latitude)
  86. .field(\.$longitude)
  87. .field(\.$image)
  88. .field(\.$downloaded)
  89. //.filter(\.$image != nil)
  90. } else {
  91. query = query
  92. .field(\.$id)
  93. .field(\.$timestamp)
  94. .field(\.$userID)
  95. .field(\.$product)
  96. .field(\.$make)
  97. .field(\.$model)
  98. .field(\.$serialNumber)
  99. .field(\.$tankID)
  100. .field(\.$fuelAmount)
  101. .field(\.$fuelType)
  102. .field(\.$isOverride)
  103. .field(\.$latitude)
  104. .field(\.$longitude)
  105. .field(\.$downloaded)
  106. }
  107. if(serial.count > 0){
  108. query = query
  109. .filter(\.$serialNumber == serial)
  110. }
  111. if(tank.count > 0){
  112. query = query
  113. .filter(\.$tankID == tank)
  114. }
  115. if(image){
  116. //query = query.filter(\.$image)
  117. let wimage = try await query.paginate(for: req).map{
  118. img in FuelEntry.wimage(id: img.id, timestamp: img.timestamp, userID: img.userID, latitude: img.latitude, longitutde: img.longitude, product: img.product, make: img.make, model: img.model, serialNumber: img.serialNumber, tankID: img.tankID, fuelAmount: img.fuelAmount, fuelType: img.fuelType, isOverride: img.isOverride, image: img.image == nil ? Data(): img.image, downloaded: img.downloaded == nil ? false : img.downloaded!)
  119. }
  120. return try await wimage.encodeResponse(for: req)
  121. } else {
  122. let woimage = try await query.paginate(for: req).map{
  123. img in FuelEntry.woimage(id: img.id, timestamp: img.timestamp, userID: img.userID, latitude: img.latitude, longitutde: img.longitude, product: img.product, make: img.make, model: img.model, serialNumber: img.serialNumber, tankID: img.tankID, fuelAmount: img.fuelAmount, fuelType: img.fuelType, isOverride: img.isOverride, downloaded: img.downloaded == nil ? false : img.downloaded!)
  124. }
  125. return try await woimage.encodeResponse(for: req)
  126. }
  127. // let result = try await query.paginate(for: req)
  128. // return try await result.encodeResponse(for: req)
  129. }
  130. // func getAllEntriesWithImages(req: Request) async throws -> [FuelEntry] {
  131. // let fuelEntries = try await FuelEntry.query(on: req.db).all()
  132. //
  133. // for var fuelEntry in fuelEntries {
  134. // if let imagePath = fuelEntry.image {
  135. // let fileURL = URL(fileURLWithPath: imagePath)
  136. // if let imageData = try? Data(contentsOf: fileURL) {
  137. // fuelEntry.imageData = imageData
  138. // }
  139. // }
  140. // }
  141. // return fuelEntries
  142. // }
  143. func create(req: Request) async throws -> [FuelEntry] {
  144. let fuelEntry = try req.content.decode([FuelEntry].self)
  145. try await fuelEntry.create(on: req.db)
  146. return fuelEntry
  147. }
  148. //Create with image file written to server storage instead of database
  149. // func create(req: Request) async throws -> [FuelEntry] {
  150. // let fuelEntries = try await req.content.decode([FuelEntry].self)
  151. // let directory = DirectoryConfiguration.detect().workingDirectory + "Images/"
  152. //
  153. // var updatedFuelEntries: [FuelEntry] = []
  154. //
  155. // for fuelEntry in fuelEntries {
  156. // let updatedFuelEntry = try await { () async throws -> FuelEntry in
  157. // var updatedFuelEntry = fuelEntry
  158. //
  159. // if let imageData = updatedFuelEntry.imageData {
  160. // let imageFilename = "\(updatedFuelEntry.id!).png"
  161. // let tempImageURL = URL(fileURLWithPath: directory + imageFilename)
  162. // try await imageData.write(to: tempImageURL)
  163. // updatedFuelEntry.image = tempImageURL.absoluteString
  164. // }
  165. //
  166. // do {
  167. // _ = try await updatedFuelEntry.save(on: req.db)
  168. // return updatedFuelEntry
  169. // } catch {
  170. // throw Abort(.internalServerError, reason: "Error saving FuelEntry: \(error)")
  171. // }
  172. // }()
  173. //
  174. // updatedFuelEntries.append(updatedFuelEntry)
  175. // }
  176. //
  177. // return updatedFuelEntries
  178. // }
  179. func delete(req: Request) async throws -> HTTPStatus {
  180. guard let fuelEntry = try await FuelEntry.find(req.parameters.get("fuelEntryID"), on: req.db) else {
  181. throw Abort(.notFound)
  182. }
  183. try await fuelEntry.delete(on: req.db)
  184. return .noContent
  185. }
  186. // func uploadImage(req: Request) async throws -> FuelEntry {
  187. // let fuelEntryID: UUID = try req.parameters.require("id")
  188. //
  189. // let file = try await req.content.decode(File.self)
  190. // let filename = fuelEntryID.uuidString + ".png" // Generate a unique filename for the uploaded image
  191. // let directory = DirectoryConfiguration.detect().workingDirectory + "Images/"
  192. //
  193. // if let imageData = file.data.getData(at: 0, length: file.data.readableBytes) {
  194. // do {
  195. // try Data(imageData).write(to: URL(fileURLWithPath: directory + filename)) // Save the uploaded image to server
  196. // } catch {
  197. // throw Abort(.internalServerError, reason: "Failed to save image file")
  198. // }
  199. //
  200. // // Update FuelEntry model after saving the image
  201. // if let fuelEntry = try await FuelEntry.find(fuelEntryID, on: req.db) {
  202. // return fuelEntry
  203. // } else {
  204. // throw Abort(.notFound, reason: "FuelEntry not found")
  205. // }
  206. // } else {
  207. // throw Abort(.badRequest, reason: "Failed to extract image data")
  208. // }
  209. // }
  210. }
  211. struct PageRequest: Content {
  212. var page: Int
  213. var size: Int
  214. // Add any other properties needed for pagination
  215. init(page: Int, size: Int) {
  216. self.page = page
  217. self.size = size
  218. }
  219. }