Show current weather on the Overview
Add a weather card to the Web App Overview, wired like the OpenSky live-map
overlay and backed by the OpenWeather plugin.
- API Server: GET /api/integrations/openweather/current resolves the
caller's cascade, gates it (master/org/personal opt-in/key), and returns
trimmed current conditions for the configured or a supplied ?lat=&lon=
point; off/keyless returns {unavailable, detail} so the card degrades.
- BFF relay (forwards the location override) + route; api.js client.
- Dashboard: a Weather card stacked above Schedule showing an emoji
condition, temperature in the resolved unit, description, location, and a
feels-like/wind/humidity/cloud grid. Location follows the same cascade as
the map (drone -> phone -> browser -> default) without prompting for geo;
refreshes every 10 min while on Overview.
- validLatLon test; rebuilt embedded frontend.
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
co-authored by
Claude Opus 4.8
parent
522fe450eb
commit
5960fb4806
@@ -98,6 +98,21 @@ func TestOpenWeatherViewMasksKey(t *testing.T) {
|
||||
}
|
||||
}
|
||||
|
||||
func TestValidLatLon(t *testing.T) {
|
||||
ok := [][2]string{{"0", "0"}, {"52.2297", "21.0122"}, {"-90", "180"}, {"90", "-180"}}
|
||||
for _, c := range ok {
|
||||
if !validLatLon(c[0], c[1]) {
|
||||
t.Errorf("validLatLon(%q,%q) = false, want true", c[0], c[1])
|
||||
}
|
||||
}
|
||||
bad := [][2]string{{"", ""}, {"91", "0"}, {"0", "181"}, {"-91", "0"}, {"abc", "0"}, {"0", "x"}}
|
||||
for _, c := range bad {
|
||||
if validLatLon(c[0], c[1]) {
|
||||
t.Errorf("validLatLon(%q,%q) = true, want false", c[0], c[1])
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// mergeOpenWeather must preserve sibling plugin keys (opensky/webdav) untouched.
|
||||
func TestMergeOpenWeatherPreservesSiblings(t *testing.T) {
|
||||
existing := json.RawMessage(`{"opensky":{"enabled":true},"webdav":{"config":{"baseURL":"https://x"}}}`)
|
||||
|
||||
Reference in New Issue
Block a user