Refactor weather app logic and simplify related components
This commit is contained in:
@@ -239,6 +239,7 @@ export interface MarketPrimary {
|
|||||||
id?: string | null;
|
id?: string | null;
|
||||||
question?: string | null;
|
question?: string | null;
|
||||||
slug?: string | null;
|
slug?: string | null;
|
||||||
|
market_url?: string | null;
|
||||||
condition_id?: string | null;
|
condition_id?: string | null;
|
||||||
end_date?: string | null;
|
end_date?: string | null;
|
||||||
active?: boolean;
|
active?: boolean;
|
||||||
@@ -266,6 +267,8 @@ export interface MarketScan {
|
|||||||
available?: boolean;
|
available?: boolean;
|
||||||
reason?: string | null;
|
reason?: string | null;
|
||||||
primary_market?: MarketPrimary | null;
|
primary_market?: MarketPrimary | null;
|
||||||
|
market_url?: string | null;
|
||||||
|
primary_market_url?: string | null;
|
||||||
selected_date?: string | null;
|
selected_date?: string | null;
|
||||||
selected_condition_id?: string | null;
|
selected_condition_id?: string | null;
|
||||||
selected_slug?: string | null;
|
selected_slug?: string | null;
|
||||||
|
|||||||
@@ -98,6 +98,16 @@ export function getTodayPolymarketUrl(
|
|||||||
detail?: CityDetail | null,
|
detail?: CityDetail | null,
|
||||||
locale: Locale = "en-US",
|
locale: Locale = "en-US",
|
||||||
) {
|
) {
|
||||||
|
const directMarketUrl = String(
|
||||||
|
detail?.market_scan?.market_url ||
|
||||||
|
detail?.market_scan?.primary_market_url ||
|
||||||
|
detail?.market_scan?.primary_market?.market_url ||
|
||||||
|
"",
|
||||||
|
).trim();
|
||||||
|
if (directMarketUrl) {
|
||||||
|
return directMarketUrl;
|
||||||
|
}
|
||||||
|
|
||||||
const cityKey = normalizeCityKey(detail);
|
const cityKey = normalizeCityKey(detail);
|
||||||
const citySlug = CITY_TO_MARKET_SLUG[cityKey] || slugifyCityName(cityKey);
|
const citySlug = CITY_TO_MARKET_SLUG[cityKey] || slugifyCityName(cityKey);
|
||||||
const dateParts = normalizeDateParts(detail?.local_date);
|
const dateParts = normalizeDateParts(detail?.local_date);
|
||||||
|
|||||||
@@ -288,7 +288,8 @@ CITY_REGISTRY = {
|
|||||||
"warning": "海湾冷空气和平流雾常压制机场升温,SFO 与市区体感差异可快速放大。",
|
"warning": "海湾冷空气和平流雾常压制机场升温,SFO 与市区体感差异可快速放大。",
|
||||||
},
|
},
|
||||||
"aurora": {
|
"aurora": {
|
||||||
"name": "Aurora",
|
"name": "Denver",
|
||||||
|
"display_name": "Denver",
|
||||||
"lat": 39.7017,
|
"lat": 39.7017,
|
||||||
"lon": -104.7518,
|
"lon": -104.7518,
|
||||||
"icao": "KBKF",
|
"icao": "KBKF",
|
||||||
|
|||||||
@@ -46,6 +46,14 @@ def test_metrics_endpoint_returns_prometheus_payload():
|
|||||||
assert 'polyweather_http_requests_total' in response.text
|
assert 'polyweather_http_requests_total' in response.text
|
||||||
|
|
||||||
|
|
||||||
|
def test_cities_endpoint_uses_denver_display_name_for_aurora_market():
|
||||||
|
response = client.get("/api/cities")
|
||||||
|
assert response.status_code == 200
|
||||||
|
payload = response.json()
|
||||||
|
aurora = next(item for item in payload["cities"] if item["name"] == "aurora")
|
||||||
|
assert aurora["display_name"] == "Denver"
|
||||||
|
|
||||||
|
|
||||||
def test_payment_runtime_endpoint_returns_shape():
|
def test_payment_runtime_endpoint_returns_shape():
|
||||||
response = client.get('/api/payments/runtime')
|
response = client.get('/api/payments/runtime')
|
||||||
assert response.status_code == 200
|
assert response.status_code == 200
|
||||||
|
|||||||
@@ -1451,9 +1451,10 @@ def _analyze(city: str, force_refresh: bool = False) -> Dict[str, Any]:
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ── Assemble result ──
|
# ── Assemble result ──
|
||||||
|
city_meta = CITIES.get(city, {}) or {}
|
||||||
result = {
|
result = {
|
||||||
"name": city,
|
"name": city,
|
||||||
"display_name": city.title(),
|
"display_name": str(city_meta.get("display_name") or city_meta.get("name") or city.title()),
|
||||||
"lat": lat,
|
"lat": lat,
|
||||||
"lon": lon,
|
"lon": lon,
|
||||||
"temp_symbol": sym,
|
"temp_symbol": sym,
|
||||||
|
|||||||
+3
-2
@@ -201,11 +201,12 @@ async def list_cities(request: Request):
|
|||||||
out = []
|
out = []
|
||||||
for name, info in CITIES.items():
|
for name, info in CITIES.items():
|
||||||
risk = CITY_RISK_PROFILES.get(name, {})
|
risk = CITY_RISK_PROFILES.get(name, {})
|
||||||
|
city_meta = CITY_REGISTRY.get(name, {}) or {}
|
||||||
settlement_source = str(info.get("settlement_source") or "metar").strip().lower() or "metar"
|
settlement_source = str(info.get("settlement_source") or "metar").strip().lower() or "metar"
|
||||||
out.append(
|
out.append(
|
||||||
{
|
{
|
||||||
"name": name,
|
"name": name,
|
||||||
"display_name": name.title(),
|
"display_name": str(city_meta.get("display_name") or city_meta.get("name") or name.title()),
|
||||||
"lat": info["lat"],
|
"lat": info["lat"],
|
||||||
"lon": info["lon"],
|
"lon": info["lon"],
|
||||||
"risk_level": risk.get("risk_level", "low"),
|
"risk_level": risk.get("risk_level", "low"),
|
||||||
@@ -213,7 +214,7 @@ async def list_cities(request: Request):
|
|||||||
"airport": risk.get("airport_name", ""),
|
"airport": risk.get("airport_name", ""),
|
||||||
"icao": risk.get("icao", ""),
|
"icao": risk.get("icao", ""),
|
||||||
"temp_unit": "fahrenheit" if info["f"] else "celsius",
|
"temp_unit": "fahrenheit" if info["f"] else "celsius",
|
||||||
"is_major": CITY_REGISTRY.get(name, {}).get("is_major", True),
|
"is_major": city_meta.get("is_major", True),
|
||||||
"settlement_source": settlement_source,
|
"settlement_source": settlement_source,
|
||||||
"settlement_source_label": SETTLEMENT_SOURCE_LABELS.get(
|
"settlement_source_label": SETTLEMENT_SOURCE_LABELS.get(
|
||||||
settlement_source,
|
settlement_source,
|
||||||
|
|||||||
Reference in New Issue
Block a user