App-side defensive price guard: drop grades outside 50-500p at decode (belt-and-braces vs relay regression)

This commit is contained in:
FuelBoard Contributor
2026-08-11 21:28:19 +01:00
parent aee890e2a8
commit c1edd4d52d
+6 -2
View File
@@ -84,11 +84,15 @@ private struct RelayResponse: Codable {
let prices: [String: Double]?
/// Map relay grade keys (E5/E10/DIESEL) to FuelType for ALL fuels the
/// station sells one fetch populates every fuel tab.
/// station sells one fetch populates every fuel tab. Defensive guard:
/// any grade outside the 50500 pence/litre band is dropped, so a relay
/// regression (e.g. the band being removed server-side) can't re-poison
/// the nationwide cheapest reference with 1.3p / 1589p garbage.
var allPrices: [FuelType: Double] {
var result: [FuelType: Double] = [:]
if let prices {
for (grade, value) in prices {
guard (50...500).contains(value) else { continue }
switch grade.uppercased() {
case "E10": result[.e10] = value
case "E5": result[.e5] = value
@@ -98,7 +102,7 @@ private struct RelayResponse: Codable {
}
}
// Backwards-compat: relay versions without `prices` still send `price`.
if result.isEmpty, let price {
if result.isEmpty, let price, (50...500).contains(price) {
result[.e10] = price
}
return result