Results filter is now search radius in miles (5/10/15); relay fetch scoped to radius, limit 500; changing miles re-fetches; caption shows stations within N miles
This commit is contained in:
@@ -13,8 +13,9 @@ import Foundation
|
||||
|
||||
protocol FuelPriceProviding {
|
||||
/// Fetch stations with prices. `location` may be nil (sort by price only).
|
||||
/// Throws on failure so callers can fall back to cached/sample data.
|
||||
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType) async throws -> [FuelStation]
|
||||
/// `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]
|
||||
}
|
||||
|
||||
enum FuelPriceProvider {
|
||||
@@ -31,15 +32,15 @@ enum FuelPriceProvider {
|
||||
struct RelayFuelProvider: FuelPriceProviding {
|
||||
var baseURL = URL(string: "http://192.168.1.131:8788")!
|
||||
|
||||
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType) 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: "50"))
|
||||
query.append(URLQueryItem(name: "radius", value: String(radiusKM)))
|
||||
}
|
||||
query.append(URLQueryItem(name: "limit", value: "100"))
|
||||
query.append(URLQueryItem(name: "limit", value: "500"))
|
||||
components.queryItems = query
|
||||
|
||||
let (data, response) = try await URLSession.shared.data(from: components.url!)
|
||||
@@ -106,7 +107,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) 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
|
||||
}
|
||||
@@ -200,7 +201,7 @@ struct FuelFinderProvider: FuelPriceProviding {
|
||||
let clientID: String
|
||||
let clientSecret: String
|
||||
|
||||
func fetchStations(near lat: Double?, lng: Double?, fuel: FuelType) 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
|
||||
|
||||
Reference in New Issue
Block a user