Non puoi selezionare più di 25 argomenti Gli argomenti devono iniziare con una lettera o un numero, possono includere trattini ('-') e possono essere lunghi fino a 35 caratteri.

307 righe
11 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. tokenAuthGroup.get("rpm", use: rpm)
  18. tokenAuthGroup.get("maxim", use: filtered)
  19. tokenAuthGroup.post(use: create)
  20. tokenAuthGroup.put( use: softdelete)
  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. fileprivate func parseDate(_ dateString: String, _ start: Bool = true) -> Date? {
  51. if(dateString.count == 0){
  52. return nil
  53. } else {
  54. let parts = dateString.split(separator: "-")
  55. let year = Int(parts[0])!
  56. let month = Int(parts[1])!
  57. let day = Int(parts[2])!
  58. var dateComponents = DateComponents()
  59. dateComponents.year = year
  60. dateComponents.month = month
  61. dateComponents.day = day
  62. if(start) {
  63. dateComponents.hour = 0
  64. dateComponents.minute = 0
  65. dateComponents.second = 0
  66. } else {
  67. dateComponents.hour = 23
  68. dateComponents.minute = 59
  69. dateComponents.second = 59
  70. }
  71. let calendar = Calendar(identifier: .gregorian)
  72. return calendar.date(from: dateComponents)
  73. }
  74. }
  75. @Sendable
  76. func filtered(req: Request) async throws -> Response {
  77. let qstring = req.query
  78. let startdate = try parseDate(qstring.get(String?.self, at: "startdate") ?? "")
  79. let enddate = try parseDate(qstring.get(String?.self, at: "enddate") ?? "", false)
  80. let image = try qstring.get(Bool?.self, at: "image") ?? false
  81. let serial = try qstring.get(String?.self, at: "serial") ?? nil
  82. let tank = try qstring.get(String?.self, at: "tank") ?? nil
  83. let previous = try qstring.get(Bool?.self, at: "previous") ?? false
  84. var query = FuelEntry.query(on: req.db)
  85. if(image){
  86. query = query
  87. .field(\.$id)
  88. .field(\.$timestamp)
  89. .field(\.$userID)
  90. .field(\.$product)
  91. .field(\.$make)
  92. .field(\.$model)
  93. .field(\.$serialNumber)
  94. .field(\.$tankID)
  95. .field(\.$fuelAmount)
  96. .field(\.$fuelType)
  97. .field(\.$isOverride)
  98. .field(\.$latitude)
  99. .field(\.$longitude)
  100. .field(\.$image)
  101. .field(\.$downloaded)
  102. .field(\.$loaddate)
  103. //.filter(\.$image != nil)
  104. } else {
  105. query = query
  106. .field(\.$id)
  107. .field(\.$timestamp)
  108. .field(\.$userID)
  109. .field(\.$product)
  110. .field(\.$make)
  111. .field(\.$model)
  112. .field(\.$serialNumber)
  113. .field(\.$tankID)
  114. .field(\.$fuelAmount)
  115. .field(\.$fuelType)
  116. .field(\.$isOverride)
  117. .field(\.$latitude)
  118. .field(\.$longitude)
  119. .field(\.$downloaded)
  120. .field(\.$loaddate)
  121. }
  122. query = query.group(.and){
  123. grp in
  124. if( startdate != nil) {
  125. grp.filter(\.$loaddate >= startdate!)
  126. }
  127. if( enddate != nil) {
  128. grp.filter(\.$loaddate <= enddate!)
  129. }
  130. if( serial != nil) {
  131. grp.filter(\.$serialNumber == serial!)
  132. }
  133. if( tank != nil) {
  134. grp.filter(\.$tankID == tank!)
  135. }
  136. if(!previous){
  137. grp.filter(\.$pulldate == nil)
  138. }
  139. }
  140. query = query.sort(\.$loaddate, .ascending)
  141. if(image){
  142. //query = query.filter(\.$image)
  143. let wimage = try await query.paginate(for: req).map{
  144. 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!, loaddate: img.loaddate == nil ? nil : img.loaddate, pulldate: previous == true ? img.pulldate : Date())
  145. }
  146. if(!previous){
  147. wimage.items.forEach{
  148. _ = $0.toFuelEntry().save(on: req.db)
  149. }
  150. }
  151. return try await wimage.encodeResponse(for: req)
  152. } else {
  153. let woimage = try await query.paginate(for: req).map{
  154. 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!, loaddate: img.loaddate == nil ? nil : img.loaddate, pulldate: previous == true ? img.pulldate : Date())
  155. }
  156. if(!previous) {
  157. woimage.items.forEach {
  158. _ = $0.toFuelEntry().save(on: req.db)
  159. }
  160. }
  161. return try await woimage.encodeResponse(for: req)
  162. }
  163. }
  164. @Sendable
  165. func rpm(req: Request) async throws -> Response {
  166. let qstring = req.query
  167. let startdate = try parseDate(qstring.get(String?.self, at: "startdate") ?? "")
  168. let enddate = try parseDate(qstring.get(String?.self, at: "enddate") ?? "", false)
  169. let image = try qstring.get(Bool?.self, at: "image") ?? false
  170. let serial = try qstring.get(String?.self, at: "serial") ?? nil
  171. let tank = try qstring.get(String?.self, at: "tank") ?? nil
  172. let previous = try qstring.get(Bool?.self, at: "previous") ?? false
  173. var query = FuelEntry.query(on: req.db)
  174. if(image){
  175. query = query
  176. .field(\.$id)
  177. .field(\.$timestamp)
  178. .field(\.$userID)
  179. .field(\.$product)
  180. .field(\.$make)
  181. .field(\.$model)
  182. .field(\.$serialNumber)
  183. .field(\.$tankID)
  184. .field(\.$fuelAmount)
  185. .field(\.$fuelType)
  186. .field(\.$isOverride)
  187. .field(\.$latitude)
  188. .field(\.$longitude)
  189. .field(\.$image)
  190. .field(\.$downloaded)
  191. .field(\.$loaddate)
  192. //.filter(\.$image != nil)
  193. } else {
  194. query = query
  195. .field(\.$id)
  196. .field(\.$timestamp)
  197. .field(\.$userID)
  198. .field(\.$product)
  199. .field(\.$make)
  200. .field(\.$model)
  201. .field(\.$serialNumber)
  202. .field(\.$tankID)
  203. .field(\.$fuelAmount)
  204. .field(\.$fuelType)
  205. .field(\.$isOverride)
  206. .field(\.$latitude)
  207. .field(\.$longitude)
  208. .field(\.$downloaded)
  209. .field(\.$loaddate)
  210. }
  211. query = query.group(.and){
  212. grp in
  213. if( startdate != nil) {
  214. grp.filter(\.$loaddate >= startdate!)
  215. }
  216. if( enddate != nil) {
  217. grp.filter(\.$loaddate <= enddate!)
  218. }
  219. if( serial != nil) {
  220. grp.filter(\.$serialNumber == serial!)
  221. }
  222. if( tank != nil) {
  223. grp.filter(\.$tankID == tank!)
  224. }
  225. if(!previous){
  226. grp.filter(\.$pulldate == nil)
  227. }
  228. }
  229. query = query.sort(\.$loaddate, .ascending).sort(\.$timestamp).sort(\.$serialNumber)
  230. if(image){
  231. //query = query.filter(\.$image)
  232. let wimage = try await query.paginate(for: req).map{
  233. 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!, loaddate: img.loaddate == nil ? nil : img.loaddate, pulldate: Date())
  234. }
  235. return try await wimage.encodeResponse(for: req)
  236. } else {
  237. let woimage = try await query.paginate(for: req).map{
  238. 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!, loaddate: img.loaddate == nil ? nil : img.loaddate, pulldate: Date())
  239. }
  240. return try await woimage.encodeResponse(for: req)
  241. }
  242. }
  243. func create(req: Request) async throws -> [FuelEntry] {
  244. let fuelEntry = try req.content.decode([FuelEntry].self)
  245. try await fuelEntry.create(on: req.db)
  246. return fuelEntry
  247. }
  248. func delete(req: Request) async throws -> HTTPStatus {
  249. guard let fuelEntry = try await FuelEntry.find(req.parameters.get("fuelEntryID"), on: req.db) else {
  250. throw Abort(.notFound)
  251. }
  252. try await fuelEntry.delete(on: req.db)
  253. return .noContent
  254. }
  255. }
  256. struct PageRequest: Content {
  257. var page: Int
  258. var size: Int
  259. // Add any other properties needed for pagination
  260. init(page: Int, size: Int) {
  261. self.page = page
  262. self.size = size
  263. }
  264. }