Refactor weather app logic and simplify related components

This commit is contained in:
2569718930@qq.com
2026-04-03 01:47:03 +08:00
parent e32eff6e31
commit 3e265d2764
6 changed files with 28 additions and 4 deletions
+3
View File
@@ -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;
+10
View File
@@ -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);
+2 -1
View File
@@ -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",
+8
View File
@@ -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
+2 -1
View File
@@ -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
View File
@@ -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,