* fix(maintenance): validate maintenance windows for external, DNS and SSH endpoints
ExternalEndpoint.ValidateAndSetDefaults never called
maintenance.Config.ValidateAndSetDefaults, so the window's start time and
timezone were never parsed. IsUnderMaintenance then treated every window as
starting at midnight in the server's local timezone, so alerts were still
sent during the configured window.
Endpoint.ValidateAndSetDefaults had the same problem for DNS and SSH
endpoints, which returned before reaching the maintenance window loop. The
loop now runs before those early returns.
Fixes#1551
Made by an AI agent (Claude Code, model Claude Opus 5).
* test(api): assert external endpoint maintenance window suppresses alerting
Pushes a failing result for an external endpoint whose maintenance window
(Europe/Berlin) is currently active and checks that alerting is skipped,
exercising the same maintenance check CreateExternalEndpointResult uses.
---------
Co-authored-by: TwiN <twin@linux.com>