Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

418 lignes
17 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) throws -> Date? {
  51. if(dateString.count == 0){
  52. return nil
  53. } else {
  54. let parts = dateString.split(separator: "-")
  55. if(parts.count != 3) {
  56. throw Abort(.custom(code: 500,reasonPhrase: "Value at path '\(start ? "startdate" : "enddate")' was not of format 'yyyy-MM-dd'. Data found at '\(start ? "startdate" : "enddate")' was not properly formatted."))
  57. }
  58. let year = Int(parts[0]) ?? nil
  59. if(year == nil) {
  60. throw Abort(.custom(code: 400,reasonPhrase: "Value at path '\(start ? "startdate" : "enddate")' was not of format 'yyyy-MM-dd'. Data found at '\(start ? "startdate" : "enddate")' was not properly formatted. Year component must be in the format yyyy and must be an integer"))
  61. }
  62. let month = Int(parts[1]) ?? nil
  63. if(month == nil) {
  64. throw Abort(.custom(code: 400,reasonPhrase: "Value at path '\(start ? "startdate" : "enddate")' was not of format 'yyyy-MM-dd'. Data found at '\(start ? "startdate" : "enddate")' was not properly formatted. Month component must be in the format MM and must be an integer"))
  65. }
  66. let day = Int(parts[2]) ?? nil
  67. if( day == nil ) {
  68. throw Abort(.custom(code: 400,reasonPhrase: "Value at path '\(start ? "startdate" : "enddate")' was not of format 'yyyy-MM-dd'. Data found at '\(start ? "startdate" : "enddate")' was not properly formatted. Day component must be in the format dd and must be an integer"))
  69. }
  70. var dateComponents = DateComponents()
  71. dateComponents.year = year
  72. dateComponents.month = month
  73. dateComponents.day = day
  74. if(start) {
  75. dateComponents.hour = 0
  76. dateComponents.minute = 0
  77. dateComponents.second = 0
  78. } else {
  79. dateComponents.hour = 23
  80. dateComponents.minute = 59
  81. dateComponents.second = 59
  82. }
  83. let calendar = Calendar(identifier: .gregorian)
  84. return calendar.date(from: dateComponents)
  85. }
  86. }
  87. @Sendable
  88. func filtered(req: Request) async throws -> Response {
  89. let qstring = req.query
  90. let startdate = try parseDate(qstring.get(String?.self, at: "startdate") ?? "")
  91. let enddate = try parseDate(qstring.get(String?.self, at: "enddate") ?? "", false)
  92. let image = try qstring.get(Bool?.self, at: "image") ?? false
  93. let serial = try qstring.get(String?.self, at: "serial") ?? nil
  94. let tank = try qstring.get(String?.self, at: "tank") ?? nil
  95. let previous = try qstring.get(Bool?.self, at: "previous") ?? false
  96. var query = FuelEntry.query(on: req.db)
  97. if(image){
  98. query = query
  99. .field(\.$id)
  100. .field(\.$timestamp)
  101. .field(\.$userID)
  102. .field(\.$product)
  103. .field(\.$make)
  104. .field(\.$model)
  105. .field(\.$serialNumber)
  106. .field(\.$tankID)
  107. .field(\.$fuelAmount)
  108. .field(\.$fuelType)
  109. .field(\.$isOverride)
  110. .field(\.$latitude)
  111. .field(\.$longitude)
  112. .field(\.$image)
  113. .field(\.$downloaded)
  114. .field(\.$loaddate)
  115. //.filter(\.$image != nil)
  116. } else {
  117. query = query
  118. .field(\.$id)
  119. .field(\.$timestamp)
  120. .field(\.$userID)
  121. .field(\.$product)
  122. .field(\.$make)
  123. .field(\.$model)
  124. .field(\.$serialNumber)
  125. .field(\.$tankID)
  126. .field(\.$fuelAmount)
  127. .field(\.$fuelType)
  128. .field(\.$isOverride)
  129. .field(\.$latitude)
  130. .field(\.$longitude)
  131. .field(\.$downloaded)
  132. .field(\.$loaddate)
  133. }
  134. query = query.group(.and){
  135. grp in
  136. if( startdate != nil) {
  137. grp.filter(\.$loaddate >= startdate)
  138. }
  139. if( enddate != nil) {
  140. grp.filter(\.$loaddate <= enddate!)
  141. }
  142. if( serial != nil) {
  143. grp.filter(\.$serialNumber == serial!)
  144. }
  145. if( tank != nil) {
  146. grp.filter(\.$tankID == tank!)
  147. }
  148. if(!previous){
  149. grp.filter(\.$pulldate == nil)
  150. }
  151. }
  152. query = query.sort(\.$loaddate, .ascending)
  153. if(image){
  154. //query = query.filter(\.$image)
  155. let wimage = try await query.paginate(for: req).map{
  156. 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())
  157. }
  158. if(!previous){
  159. wimage.items.forEach{
  160. _ = $0.toFuelEntry().save(on: req.db)
  161. }
  162. }
  163. return try await wimage.encodeResponse(for: req)
  164. } else {
  165. let woimage = try await query.paginate(for: req).map{
  166. 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, image: nil, isOverride: img.isOverride, downloaded: img.downloaded == nil ? false : img.downloaded!, loaddate: img.loaddate == nil ? nil : img.loaddate, pulldate: previous == true ? img.pulldate : Date())
  167. }
  168. if(!previous) {
  169. woimage.items.forEach {
  170. _ = $0.toFuelEntry().save(on: req.db)
  171. }
  172. }
  173. return try await woimage.encodeResponse(for: req)
  174. }
  175. }
  176. @Sendable
  177. func rpm(req: Request) async throws -> Response {
  178. let qstring = req.query
  179. let startdate = try parseDate(qstring.get(String?.self, at: "startdate") ?? "")
  180. let enddate = try parseDate(qstring.get(String?.self, at: "enddate") ?? "", false)
  181. let image = try qstring.get(Bool?.self, at: "image") ?? false
  182. let serial = try qstring.get(String?.self, at: "serial") ?? nil
  183. let tank = try qstring.get(String?.self, at: "tank") ?? nil
  184. let previous = try qstring.get(Bool?.self, at: "previous") ?? false
  185. var query = FuelEntry.query(on: req.db)
  186. if(image){
  187. query = query
  188. .field(\.$id)
  189. .field(\.$timestamp)
  190. .field(\.$userID)
  191. .field(\.$product)
  192. .field(\.$make)
  193. .field(\.$model)
  194. .field(\.$serialNumber)
  195. .field(\.$tankID)
  196. .field(\.$fuelAmount)
  197. .field(\.$fuelType)
  198. .field(\.$isOverride)
  199. .field(\.$latitude)
  200. .field(\.$longitude)
  201. .field(\.$image)
  202. .field(\.$downloaded)
  203. .field(\.$loaddate)
  204. } else {
  205. query = query
  206. .field(\.$id)
  207. .field(\.$timestamp)
  208. .field(\.$userID)
  209. .field(\.$product)
  210. .field(\.$make)
  211. .field(\.$model)
  212. .field(\.$serialNumber)
  213. .field(\.$tankID)
  214. .field(\.$fuelAmount)
  215. .field(\.$fuelType)
  216. .field(\.$isOverride)
  217. .field(\.$latitude)
  218. .field(\.$longitude)
  219. .field(\.$downloaded)
  220. .field(\.$loaddate)
  221. }
  222. query = query.group(.and){
  223. grp in
  224. if( startdate != nil) {
  225. grp.filter(\.$loaddate >= startdate!)
  226. }
  227. if( enddate != nil) {
  228. grp.filter(\.$loaddate <= enddate!)
  229. }
  230. if( serial != nil) {
  231. grp.filter(\.$serialNumber == serial!)
  232. }
  233. if( tank != nil) {
  234. grp.filter(\.$tankID == tank!)
  235. }
  236. if(!previous){
  237. grp.filter(\.$pulldate == nil)
  238. }
  239. }
  240. query = query.sort(\.$loaddate, .ascending).sort(\.$timestamp).sort(\.$serialNumber)
  241. if(image){
  242. //query = query.filter(\.$image)
  243. let wimage = try await query.paginate(for: req).map{
  244. 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())
  245. }
  246. return try await wimage.encodeResponse(for: req)
  247. } else {
  248. let woimage = try await query.paginate(for: req).map{
  249. 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, image: nil, isOverride: img.isOverride, downloaded: img.downloaded == nil ? false : img.downloaded!, loaddate: img.loaddate == nil ? nil : img.loaddate, pulldate: Date())
  250. }
  251. return try await woimage.encodeResponse(for: req)
  252. }
  253. }
  254. func create(req: Request) async throws -> [FuelEntry] {
  255. let fuelEntry = try req.content.decode([FuelEntry].self)
  256. try await fuelEntry.create(on: req.db)
  257. return fuelEntry
  258. }
  259. func delete(req: Request) async throws -> HTTPStatus {
  260. guard let fuelEntry = try await FuelEntry.find(req.parameters.get("fuelEntryID"), on: req.db) else {
  261. throw Abort(.notFound)
  262. }
  263. try await fuelEntry.delete(on: req.db)
  264. return .noContent
  265. }
  266. @Sendable
  267. func getrpm(req: Request) async throws -> Response {
  268. let qstring = req.query
  269. let startdate = try parseDate(qstring.get(String?.self, at: "startdate") ?? "")
  270. let enddate = try parseDate(qstring.get(String?.self, at: "enddate") ?? "", false)
  271. let image = try qstring.get(Bool?.self, at: "image") ?? false
  272. let serial = try qstring.get(String?.self, at: "serial") ?? nil
  273. let tank = try qstring.get(String?.self, at: "tank") ?? nil
  274. let previous = try qstring.get(Bool?.self, at: "previous") ?? false
  275. var query = FuelEntry.query(on: req.db)
  276. if(image){
  277. query = query
  278. .field(\.$id)
  279. .field(\.$timestamp)
  280. .field(\.$userID)
  281. .field(\.$product)
  282. .field(\.$make)
  283. .field(\.$model)
  284. .field(\.$serialNumber)
  285. .field(\.$tankID)
  286. .field(\.$fuelAmount)
  287. .field(\.$fuelType)
  288. .field(\.$isOverride)
  289. .field(\.$latitude)
  290. .field(\.$longitude)
  291. .field(\.$image)
  292. .field(\.$downloaded)
  293. .field(\.$loaddate)
  294. } else {
  295. query = query
  296. .field(\.$id)
  297. .field(\.$timestamp)
  298. .field(\.$userID)
  299. .field(\.$product)
  300. .field(\.$make)
  301. .field(\.$model)
  302. .field(\.$serialNumber)
  303. .field(\.$tankID)
  304. .field(\.$fuelAmount)
  305. .field(\.$fuelType)
  306. .field(\.$isOverride)
  307. .field(\.$latitude)
  308. .field(\.$longitude)
  309. .field(\.$downloaded)
  310. .field(\.$loaddate)
  311. }
  312. query = query.group(.and){
  313. grp in
  314. if( startdate != nil) {
  315. grp.filter(\.$loaddate >= startdate!)
  316. }
  317. if( enddate != nil) {
  318. grp.filter(\.$loaddate <= enddate!)
  319. }
  320. if( serial != nil) {
  321. grp.filter(\.$serialNumber == serial!)
  322. }
  323. if( tank != nil) {
  324. grp.filter(\.$tankID == tank!)
  325. }
  326. if(!previous){
  327. grp.filter(\.$pulldate == nil)
  328. }
  329. }
  330. query = query.sort(\.$loaddate, .ascending).sort(\.$timestamp).sort(\.$serialNumber)
  331. if(image){
  332. //query = query.filter(\.$image)
  333. let wimage = try await query.paginate(for: req).map{
  334. 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())
  335. }
  336. return try await wimage.encodeResponse(for: req)
  337. } else {
  338. let woimage = try await query.paginate(for: req).map{
  339. 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, image: nil, isOverride: img.isOverride, downloaded: img.downloaded == nil ? false : img.downloaded!, loaddate: img.loaddate == nil ? nil : img.loaddate, pulldate: Date())
  340. }
  341. return try await woimage.encodeResponse(for: req)
  342. }
  343. }
  344. }
  345. struct custMeta: Content {
  346. let per: Int
  347. let page: Int
  348. let total: Int
  349. let status: String?
  350. }
  351. struct PageRequest: Content {
  352. var page: Int
  353. var size: Int
  354. var status: String?
  355. // Add any other properties needed for pagination
  356. init(page: Int, size: Int, status: String? = nil) {
  357. self.page = page
  358. self.size = size
  359. self.status = status
  360. }
  361. }