Fetch full-UK dump (no radius/limit); stations in app-group defaults only; alert path keeps focused radius fetch

This commit is contained in:
FuelBoard Contributor
2026-08-11 19:30:02 +01:00
parent 3953c65a65
commit cf9765be7b
3 changed files with 24 additions and 13 deletions
+15 -8
View File
@@ -13,9 +13,9 @@ import Foundation
protocol FuelPriceProviding {
/// Fetch stations with prices. `location` may be nil (sort by price only).
/// `radiusKM` bounds the search area (used by the relay). Throws on failure
/// so callers can fall back to cached/sample data.
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double) async throws -> [FuelStation]
/// `radiusKM` nil = full dataset (device filters); set = focused server-side
/// radius (alert path). Throws on failure so callers can fall back.
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double?) async throws -> [FuelStation]
}
enum FuelPriceProvider {
@@ -32,15 +32,22 @@ enum FuelPriceProvider {
struct RelayFuelProvider: FuelPriceProviding {
var baseURL = URL(string: "http://192.168.1.131:8788")!
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double) async throws -> [FuelStation] {
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double?) async throws -> [FuelStation] {
var components = URLComponents(url: baseURL.appendingPathComponent("api/v1/stations"), resolvingAgainstBaseURL: false)!
var query: [URLQueryItem] = [URLQueryItem(name: "fuel", value: fuel.rawValue)]
if let lat, let lng {
query.append(URLQueryItem(name: "lat", value: String(lat)))
query.append(URLQueryItem(name: "lng", value: String(lng)))
query.append(URLQueryItem(name: "radius", value: String(radiusKM)))
}
query.append(URLQueryItem(name: "limit", value: "500"))
if let radiusKM {
// Focused fetch (alert path) small response, server-side radius.
query.append(URLQueryItem(name: "radius", value: String(radiusKM)))
query.append(URLQueryItem(name: "limit", value: "500"))
} else {
// Full-UK dump: NO radius the device filters locally
// (5/10/15-mile radius, fuel, sort). 10,000 covers the dataset.
query.append(URLQueryItem(name: "limit", value: "10000"))
}
components.queryItems = query
let (data, response) = try await URLSession.shared.data(from: components.url!)
@@ -107,7 +114,7 @@ private struct RelayResponse: Codable {
/// Real England-wide data comes from the relay (full-UK Fuel Finder CSV/API).
/// Prices in pence/litre.
struct SampleFuelProvider: FuelPriceProviding {
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double) async throws -> [FuelStation] {
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double?) async throws -> [FuelStation] {
try await Task.sleep(nanoseconds: 300_000_000) // simulate fetch
return Self.sampleStations
}
@@ -201,7 +208,7 @@ struct FuelFinderProvider: FuelPriceProviding {
let clientID: String
let clientSecret: String
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double) async throws -> [FuelStation] {
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType, radiusKM: Double?) async throws -> [FuelStation] {
// TODO: OAuth token GET /v1/prices map to FuelStation.
// The live API requires authentication; see notes above.
throw FuelProviderError.notImplemented