diff --git a/.swiftpm/xcode/package.xcworkspace/xcuserdata/mcarman.xcuserdatad/UserInterfaceState.xcuserstate b/.swiftpm/xcode/package.xcworkspace/xcuserdata/mcarman.xcuserdatad/UserInterfaceState.xcuserstate
index 4a7f6a3..de578a5 100644
Binary files a/.swiftpm/xcode/package.xcworkspace/xcuserdata/mcarman.xcuserdatad/UserInterfaceState.xcuserstate and b/.swiftpm/xcode/package.xcworkspace/xcuserdata/mcarman.xcuserdatad/UserInterfaceState.xcuserstate differ
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