App-side defensive price guard: drop grades outside 50-500p at decode (belt-and-braces vs relay regression)
This commit is contained in:
@@ -84,11 +84,15 @@ private struct RelayResponse: Codable {
|
|||||||
let prices: [String: Double]?
|
let prices: [String: Double]?
|
||||||
|
|
||||||
/// Map relay grade keys (E5/E10/DIESEL) to FuelType for ALL fuels the
|
/// 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 50–500 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 allPrices: [FuelType: Double] {
|
||||||
var result: [FuelType: Double] = [:]
|
var result: [FuelType: Double] = [:]
|
||||||
if let prices {
|
if let prices {
|
||||||
for (grade, value) in prices {
|
for (grade, value) in prices {
|
||||||
|
guard (50...500).contains(value) else { continue }
|
||||||
switch grade.uppercased() {
|
switch grade.uppercased() {
|
||||||
case "E10": result[.e10] = value
|
case "E10": result[.e10] = value
|
||||||
case "E5": result[.e5] = value
|
case "E5": result[.e5] = value
|
||||||
@@ -98,7 +102,7 @@ private struct RelayResponse: Codable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Backwards-compat: relay versions without `prices` still send `price`.
|
// 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
|
result[.e10] = price
|
||||||
}
|
}
|
||||||
return result
|
return result
|
||||||
|
|||||||
Reference in New Issue
Block a user