From aafba8cb9bed515c7143632947e06421deac4300 Mon Sep 17 00:00:00 2001 From: Mike Carman Date: Tue, 6 May 2025 15:59:27 -0400 Subject: [PATCH] Connection String Port Number update --- .../UserInterfaceState.xcuserstate | Bin 71238 -> 92771 bytes .../xcdebugger/Breakpoints_v2.xcbkptlist | 128 +++++++ .../Controllers/FuelEntryV2Controller.swift | 349 +++++++++++++++++- Sources/App/Helpers/PageHelper.swift | 39 +- Sources/App/Models/FuelEntry.swift | 26 +- 5 files changed, 529 insertions(+), 13 deletions(-) diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/mcarman.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/mcarman.xcuserdatad/UserInterfaceState.xcuserstate index 4a7f6a343b799b7232776232ac31ef2cc6cb10a0..de578a5b96743706b4bd73a5f426145b8877793d 100644 GIT binary patch literal 92771 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

qq36*~^fKCqUPo`BBj{W79Xg7Rq3_WT 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 TIhBVF?H|!G`^SUdm+1ckZQmhu diff --git a/.swiftpm/xcode/xcuserdata/mcarman.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist b/.swiftpm/xcode/xcuserdata/mcarman.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist index 0f9c242..dbb3fd6 100644 --- a/.swiftpm/xcode/xcuserdata/mcarman.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist +++ b/.swiftpm/xcode/xcuserdata/mcarman.xcuserdatad/xcdebugger/Breakpoints_v2.xcbkptlist @@ -3,4 +3,132 @@ uuid = "83CCDCAB-5627-45C3-BC68-1A59A1D654E0" type = "1" version = "2.0"> + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/Sources/App/Controllers/FuelEntryV2Controller.swift b/Sources/App/Controllers/FuelEntryV2Controller.swift index 65c7bee..1985aaf 100644 --- a/Sources/App/Controllers/FuelEntryV2Controller.swift +++ b/Sources/App/Controllers/FuelEntryV2Controller.swift @@ -7,6 +7,7 @@ import Vapor import FluentKit +import FluentSQL struct FuelEntryV2Controller: RouteCollection { func boot(routes: RoutesBuilder) throws { @@ -14,7 +15,10 @@ struct FuelEntryV2Controller: RouteCollection { let tokenAuthMiddleware = Token.authenticator() let guardMiddleware = User.guardMiddleware() let tokenAuthGroup = fuelEntries.grouped(tokenAuthMiddleware, guardMiddleware) - tokenAuthGroup.get(use: index) + tokenAuthGroup.get(use: filterLoadDate) + tokenAuthGroup.get("main", use: filterLoadDate) + tokenAuthGroup.get("timestamp", use: filterTimeStamp) + tokenAuthGroup.get("images", use: filterImages) tokenAuthGroup.get("test", use: filtered) tokenAuthGroup.get("rpm", use: rpm) tokenAuthGroup.get("maxim", use: filtered) @@ -55,13 +59,65 @@ struct FuelEntryV2Controller: RouteCollection { return response } + fileprivate func queryParamExists(_ req: Request, _ param: String) async throws -> Bool { + let x = try req.query.get(Bool.self, at: param) ? true : false + + print ("x: \(x)") + return x + + } + + fileprivate func parseDate2(_ dateString: String, _ start: Bool = true) throws -> Date? { + let currentDate = Calendar.current.startOfDay(for: Date()) + if(dateString.count == 0 && start){ + if(start) { + return Calendar.current.date(byAdding: .day, value: -2, to: currentDate) + } else { + return currentDate + } + } else { + let parts = dateString.split(separator: "-") + if(parts.count != 3) { + return nil + } + let year = Int(parts[0]) ?? nil + if(year == nil) { + return nil + } + let month = Int(parts[1]) ?? nil + if(month == nil) { + return nil + } + let day = Int(parts[2]) ?? nil + if( day == nil ) { + return nil + } + var dateComponents = DateComponents() + dateComponents.year = year + dateComponents.month = month + dateComponents.day = day + if(start) { + dateComponents.hour = 0 + dateComponents.minute = 0 + dateComponents.second = 0 + } else { + dateComponents.hour = 23 + dateComponents.minute = 59 + dateComponents.second = 59 + } + let calendar = Calendar(identifier: .gregorian) + return calendar.date(from: dateComponents) + } + } + fileprivate func parseDate(_ dateString: String, _ start: Bool = true) throws -> Date? { + if(dateString.count == 0){ return nil } else { let parts = dateString.split(separator: "-") if(parts.count != 3) { - 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.")) + 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.")) } let year = Int(parts[0]) ?? nil if(year == nil) { @@ -93,6 +149,278 @@ struct FuelEntryV2Controller: RouteCollection { } } + fileprivate func generateSQLNoImage(_ startdate: Date? = nil, _ enddate: Date? = nil) -> SQLQueryString { + if(startdate == nil) { + return SQLQueryString("select count(*) as total from \"fuel_entries\";") + } + if(enddate != nil) { + return SQLQueryString("select count(*) as total from \"fuel_entries\" where \"loadDate\" >= \(bind: startdate) and \"loadDate\" <= \(bind: enddate) ;") + } else { + return SQLQueryString("select count(*) as total from \"fuel_entries\" where \"loadDate\" >= \(bind: startdate);") + } + } + + fileprivate func generateSQLImage(_ startdate: Date? = nil, _ enddate: Date? = nil) -> SQLQueryString { + var sql: String = "" + if(startdate == nil) { + return SQLQueryString("select count(*) as total from \"fuel_entries\" where \"image\" is not null;") + } + if(enddate != nil) { + sql = "select count(*) as total from \"fuel_entries\" where \"loadDate\" >= \(String(describing: startdate)) and \"loadDate\" <= \(String(describing: enddate)) and \"image\" is not null;" + return SQLQueryString("select count(*) as total from \"fuel_entries\" where \"loadDate\" >= \(bind: startdate) and \"loadDate\" <= \(bind: enddate) and \"image\" is not null;") + } else { + sql = "select count(*) as total from \"fuel_entries\" where \"image\" is not null and \"loadDate\" >= '\(startdate ?? Date())';" + return SQLQueryString(sql) + } + } + + struct CountRecords: Content { + let total: Int + } + + fileprivate func getCount(_ req: Request, _ sql: SQLQueryString) async throws -> Int { + print(sql) + if let db = req.db as? SQLDatabase { + let answer = try await db + .raw(sql) + .first(decoding: CountRecords.self) + return answer?.total ?? 0 + } else { + return 0 + } + } + + fileprivate func getPaging(_ page: Int, _ per: Int, _ records: Int) async throws -> [String: Any] { + var vals: [String: Any] = [:] + vals["page"] = page + vals["per"] = per + vals["records"] = records + let lastpage = Int(ceil(Double(records) / Double(per))) + vals["lastpage"] = (page == lastpage) ? true : false + vals["offset"] = ( page * per) - per + return vals + } + + fileprivate func getParams(_ req: Request) async throws -> [qparam] { + let urlComponents = URLComponents(string: req.url.description)! + var params: [qparam] = [] + for queryItem in urlComponents.queryItems ?? [] { + params.append(qparam(name: queryItem.name, value: queryItem.value ?? "")) + } + return params + } + + fileprivate func getMaximError(_ req: Request, _ message: String) async throws -> returnObj { + let data : [FuelEntry.Output] = [] + let meta = Meta(page: 0, per: 0, total: 0, lastpage: true, error: true, message: message, queryparameters: try await getParams(req) ) + return returnObj(data: data, meta: meta) + + } + + @Sendable + func filterLoadDate(req: Request) async throws -> Response { + + let qstring = req.query + var startdate : Date? + if(try qstring.get(String?.self, at: "startdate") != nil) { + startdate = try parseDate2(qstring.get(String?.self, at: "startdate") ?? "") + if(startdate == nil) { + return try await(getMaximError(req, "startdate is invalid format. YYYY-MM-DD")) .encodeResponse(for: req) + } + } else { + //throw error + return try await getMaximError(req, "startdate is required").encodeResponse(for: req) + } + var enddate : Date?//= try parseDate(qstring.get(String?.self, at: "enddate") ?? "", false) + if(try qstring.get(String?.self, at: "enddate") != nil) { + enddate = try parseDate2(qstring.get(String?.self, at: "enddate") ?? "", false) + if(enddate == nil) { + return try await getMaximError(req, "enddate is invalid format. YYYY-MM-DD").encodeResponse(for: req) + } + } + let emptyData: Data? = Data() + let page = try qstring.get(Int?.self, at: "page") ?? 1 + let per = try qstring.get(Int?.self, at: "per") ?? 10 + let records = try await getCount(req, generateSQLNoImage(startdate ?? nil, enddate ?? nil) ) + let paging = try await getPaging(page, per, records) + let meta = Meta(page: page, per: per, total: records, lastpage: (paging["lastpage"] != nil) ? paging["lastpage"] as! Bool : false, error: false, message: "", queryparameters: try await getParams(req) ) + let query = try await FuelEntry.query(on: req.db) + .field(\.$id) + .field(\.$timestamp) + .field(\.$userID) + .field(\.$product) + .field(\.$make) + .field(\.$model) + .field(\.$serialNumber) + .field(\.$tankID) + .field(\.$fuelAmount) + .field(\.$fuelType) + .field(\.$isOverride) + .field(\.$latitude) + .field(\.$longitude) + .field(\.$downloaded) + .field(\.$loaddate) + .group(.and) { + grp in + grp.filter(\.$loaddate >= startdate) + if( enddate != nil) { + grp.filter(\.$loaddate <= enddate!) + } + } + .sort(\.$loaddate, .ascending) + .range(lower: (paging["offset"] as! Int), upper: (paging["offset"] as! Int) + (paging["per"] as! Int)) + .all().map{ + FuelEntry.Output(id: $0.id, timestamp: $0.timestamp, ssid: $0.userID, latitude: $0.latitude, longitude: $0.longitude, product: $0.product, make: $0.make, model: $0.model, serialNumber: $0.serialNumber, tankID: $0.tankID, fuelAmount: $0.fuelAmount, fuelType: $0.fuelType, isOverride: $0.isOverride, image: emptyData, loaddate: $0.loaddate) + } + let response = returnObj(data: query, meta: meta) + return try await response.encodeResponse(for: req) + } + + @Sendable + func filterImages(req: Request) async throws -> Response { + + let qstring = req.query + var startdate : Date? + if(try qstring.get(String?.self, at: "startdate") != nil) { + startdate = try parseDate2(qstring.get(String?.self, at: "startdate") ?? "") + if(startdate == nil) { + return try await(getMaximError(req, "startdate is invalid format. YYYY-MM-DD")) .encodeResponse(for: req) + } + } else { + //throw error + return try await getMaximError(req, "startdate is required").encodeResponse(for: req) + } + var enddate : Date?//= try parseDate(qstring.get(String?.self, at: "enddate") ?? "", false) + if(try qstring.get(String?.self, at: "enddate") != nil) { + enddate = try parseDate2(qstring.get(String?.self, at: "enddate") ?? "", false) + if(enddate == nil) { + return try await getMaximError(req, "enddate is invalid format. YYYY-MM-DD").encodeResponse(for: req) + } + } + let page = try qstring.get(Int?.self, at: "page") ?? 1 + let per = try qstring.get(Int?.self, at: "per") ?? 5 + var records : Int = 0 + if(enddate == nil) { + records = try await FuelEntry.query(on: req.db) + .field(\.$id) + .group(.and) { + grp in + grp.filter(\.$loaddate >= startdate) + .filter(\.$image != nil) + } + .all() + .count + } else { + records = try await FuelEntry.query(on: req.db) + .field(\.$id) + .group(.and) { + grp in + grp.filter(\.$loaddate >= startdate) + .filter(\.$image != nil) + .filter(\.$loaddate <= enddate) + } + .all() + .count + } + + + let paging = try await getPaging(page, per, records) + let meta = Meta(page: page, per: per, total: records, lastpage: (paging["lastpage"] != nil) ? paging["lastpage"] as! Bool : false, error: false, message: "", queryparameters: try await getParams(req) ) + let query = try await FuelEntry.query(on: req.db) + .field(\.$id) + .field(\.$timestamp) + .field(\.$userID) + .field(\.$product) + .field(\.$make) + .field(\.$model) + .field(\.$serialNumber) + .field(\.$tankID) + .field(\.$fuelAmount) + .field(\.$fuelType) + .field(\.$isOverride) + .field(\.$latitude) + .field(\.$longitude) + .field(\.$downloaded) + .field(\.$loaddate) + .field(\.$image) + .group(.and) { + grp in if(enddate != nil) { + grp.filter(\.$loaddate >= startdate) + .filter(\.$image != nil) + .filter(\.$loaddate <= enddate!) + } else { + grp.filter(\.$loaddate >= startdate) + .filter(\.$image != nil) + } + } + .sort(\.$loaddate, .ascending) + .range(lower: (paging["offset"] as! Int), upper: (paging["offset"] as! Int) + (paging["per"] as! Int)) + .all().map{ + FuelEntry.Output(id: $0.id, timestamp: $0.timestamp, ssid: $0.userID, latitude: $0.latitude, longitude: $0.longitude, product: $0.product, make: $0.make, model: $0.model, serialNumber: $0.serialNumber, tankID: $0.tankID, fuelAmount: $0.fuelAmount, fuelType: $0.fuelType, isOverride: $0.isOverride, image: $0.image, loaddate: $0.loaddate) + } + let response = returnObj(data: query, meta: meta) + return try await response.encodeResponse(for: req) + } + + @Sendable + func filterTimeStamp(req: Request) async throws -> Response { + + let qstring = req.query + var startdate : Date? + if(try qstring.get(String?.self, at: "startdate") != nil) { + startdate = try parseDate2(qstring.get(String?.self, at: "startdate") ?? "") + if(startdate == nil) { + return try await(getMaximError(req, "startdate is invalid format. YYYY-MM-DD")) .encodeResponse(for: req) + } + } else { + //throw error + return try await getMaximError(req, "startdate is required").encodeResponse(for: req) + } + var enddate : Date?//= try parseDate(qstring.get(String?.self, at: "enddate") ?? "", false) + if(try qstring.get(String?.self, at: "enddate") != nil) { + enddate = try parseDate2(qstring.get(String?.self, at: "enddate") ?? "", false) + if(enddate == nil) { + return try await getMaximError(req, "enddate is invalid format. YYYY-MM-DD").encodeResponse(for: req) + } + } + let emptyData: Data? = Data() + let page = try qstring.get(Int?.self, at: "page") ?? 1 + let per = try qstring.get(Int?.self, at: "per") ?? 10 + let records = try await getCount(req, generateSQLNoImage(startdate ?? nil, enddate ?? nil) ) + let paging = try await getPaging(page, per, records) + let meta = Meta(page: page, per: per, total: records, lastpage: (paging["lastpage"] != nil) ? paging["lastpage"] as! Bool : false, error: false, message: "", queryparameters: try await getParams(req) ) + let query = try await FuelEntry.query(on: req.db) + .field(\.$id) + .field(\.$timestamp) + .field(\.$userID) + .field(\.$product) + .field(\.$make) + .field(\.$model) + .field(\.$serialNumber) + .field(\.$tankID) + .field(\.$fuelAmount) + .field(\.$fuelType) + .field(\.$isOverride) + .field(\.$latitude) + .field(\.$longitude) + .field(\.$downloaded) + .field(\.$loaddate) + .group(.and) { + grp in + grp.filter(\.$timestamp >= startdate ?? Calendar.current.startOfDay(for: Calendar.current.date(byAdding: .day, value: -2, to: Date())!)) + if( enddate != nil) { + grp.filter(\.$timestamp <= enddate!) + } + } + .sort(\.$loaddate, .ascending) + .range(lower: (paging["offset"] as! Int), upper: (paging["offset"] as! Int) + (paging["per"] as! Int)) + .all().map{ + FuelEntry.Output(id: $0.id, timestamp: $0.timestamp, ssid: $0.userID, latitude: $0.latitude, longitude: $0.longitude, product: $0.product, make: $0.make, model: $0.model, serialNumber: $0.serialNumber, tankID: $0.tankID, fuelAmount: $0.fuelAmount, fuelType: $0.fuelType, isOverride: $0.isOverride, image: emptyData, loaddate: $0.loaddate) + } + let response = returnObj(data: query, meta: meta) + return try await response.encodeResponse(for: req) + } + @Sendable func filtered(req: Request) async throws -> Response { let qstring = req.query @@ -169,7 +497,7 @@ struct FuelEntryV2Controller: RouteCollection { if(image){ //query = query.filter(\.$image) let wimage = try await query.paginate(for: req).map{ - 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()) + img in FuelEntry.wimage(id: img.id, timestamp: img.timestamp, userID: img.userID, latitude: img.latitude, longitude: 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()) } if(!previous){ wimage.items.forEach{ @@ -180,7 +508,7 @@ struct FuelEntryV2Controller: RouteCollection { return try await wimage.encodeResponse(for: req) } else { let woimage = try await query.paginate(for: req).map{ - 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()) + img in FuelEntry.woimage(id: img.id, timestamp: img.timestamp, userID: img.userID, latitude: img.latitude, longitude: 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()) } if(!previous) { woimage.items.forEach { @@ -267,12 +595,12 @@ struct FuelEntryV2Controller: RouteCollection { if(image){ //query = query.filter(\.$image) let wimage = try await query.paginate(for: req).map{ - 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()) + img in FuelEntry.wimage(id: img.id, timestamp: img.timestamp, userID: img.userID, latitude: img.latitude, longitude: 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()) } return try await wimage.encodeResponse(for: req) } else { let woimage = try await query.paginate(for: req).map{ - 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()) + img in FuelEntry.woimage(id: img.id, timestamp: img.timestamp, userID: img.userID, latitude: img.latitude, longitude: 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()) } return try await woimage.encodeResponse(for: req) } @@ -282,6 +610,11 @@ struct FuelEntryV2Controller: RouteCollection { func create(req: Request) async throws -> [FuelEntry] { let fuelEntry = try req.content.decode([FuelEntry].self) + for entry in fuelEntry { + if((entry.image?.isEmpty) != nil){ + entry.image = nil + } + } try await fuelEntry.create(on: req.db) return fuelEntry } @@ -373,13 +706,13 @@ struct FuelEntryV2Controller: RouteCollection { if(image){ //query = query.filter(\.$image) let wimage = try await query.paginate(for: req).map{ - 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()) + img in FuelEntry.wimage(id: img.id, timestamp: img.timestamp, userID: img.userID, latitude: img.latitude, longitude: 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()) } return try await wimage.encodeResponse(for: req) } else { let woimage = try await query.paginate(for: req).map{ - 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()) + img in FuelEntry.woimage(id: img.id, timestamp: img.timestamp, userID: img.userID, latitude: img.latitude, longitude: 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()) } return try await woimage.encodeResponse(for: req) } diff --git a/Sources/App/Helpers/PageHelper.swift b/Sources/App/Helpers/PageHelper.swift index 06c6c3b..9e3265c 100644 --- a/Sources/App/Helpers/PageHelper.swift +++ b/Sources/App/Helpers/PageHelper.swift @@ -1,8 +1,45 @@ // -// File.swift +// PageHelper.swift // Fueling // // Created by Michiel Carman on 5/5/25. // import Foundation +import Fluent +import Vapor + +final class PageHelper { +// static func paginate( +// _ query: Query, +// page: Int? = nil, +// perPage: Int? = nil +// ) -> EventLoopFuture> { +// let page = page ?? 1 +// let perPage = perPage ?? 10 +// return query +// .skip((page - 1) * perPage) +// } + + +} + +public struct returnObj: Content{ + let data: [FuelEntry.Output] + let meta: Meta +} + +public struct Meta: Content{ + let page: Int + let per: Int + let total: Int + let lastpage: Bool + let error: Bool + let message: String? + let queryparameters: [qparam] +} + +public struct qparam: Content{ + let name: String + let value: String +} diff --git a/Sources/App/Models/FuelEntry.swift b/Sources/App/Models/FuelEntry.swift index 922499a..375c5ee 100755 --- a/Sources/App/Models/FuelEntry.swift +++ b/Sources/App/Models/FuelEntry.swift @@ -16,7 +16,7 @@ final class FuelEntry: Model, Content { let timestamp: Date let userID: String let latitude: Double - let longitutde: Double + let longitude: Double let product: String let make: String let model: String @@ -35,7 +35,7 @@ final class FuelEntry: Model, Content { entry.timestamp = self.timestamp entry.userID = self.userID entry.latitude = self.latitude - entry.longitude = self.longitutde + entry.longitude = self.longitude entry.product = self.product entry.make = self.make entry.model = self.model @@ -53,12 +53,30 @@ final class FuelEntry: Model, Content { } } + struct Output: Content { + let id: UUID? + let timestamp: Date + let ssid: String + let latitude: Double + let longitude: Double + let product: String + let make: String + let model: String + let serialNumber: String + let tankID: String + let fuelAmount: Double + let fuelType: String + let isOverride: Bool + let image: Data? + let loaddate: Date? + } + struct wimage: Content{ let id: UUID? let timestamp: Date let userID: String let latitude: Double - let longitutde: Double + let longitude: Double let product: String let make: String let model: String @@ -77,7 +95,7 @@ final class FuelEntry: Model, Content { entry.timestamp = self.timestamp entry.userID = self.userID entry.latitude = self.latitude - entry.longitude = self.longitutde + entry.longitude = self.longitude entry.product = self.product entry.make = self.make entry.model = self.model