fix: handle notification endpoint failures

This commit is contained in:
zv
2026-06-12 21:33:41 +02:00
parent 11e9e01b53
commit 763de7fd05
2 changed files with 51 additions and 35 deletions

View File

@@ -26,6 +26,10 @@ function isCronAuthorized(request: Request) {
return authHeader === `Bearer ${secret}` || secretHeader === secret; return authHeader === `Bearer ${secret}` || secretHeader === secret;
} }
function getErrorMessage(error: unknown) {
return error instanceof Error ? error.message : "Unknown notification check error.";
}
export async function GET(request: Request) { export async function GET(request: Request) {
if (!isCronAuthorized(request)) { if (!isCronAuthorized(request)) {
return NextResponse.json({ error: "Unauthorized." }, { status: 401 }); return NextResponse.json({ error: "Unauthorized." }, { status: 401 });
@@ -34,6 +38,7 @@ export async function GET(request: Request) {
return NextResponse.json({ error: "Web Push is not configured." }, { status: 503 }); return NextResponse.json({ error: "Web Push is not configured." }, { status: 503 });
} }
try {
const now = Date.now(); const now = Date.now();
const warnings = (await fetchMeteoWarnings(AbortSignal.timeout(12_000))).filter((warning) => isRelevantWarning(warning, now)); const warnings = (await fetchMeteoWarnings(AbortSignal.timeout(12_000))).filter((warning) => isRelevantWarning(warning, now));
const subscriptions = getPushSubscriptions().filter((subscription) => subscription.enabled); const subscriptions = getPushSubscriptions().filter((subscription) => subscription.enabled);
@@ -74,4 +79,10 @@ export async function GET(request: Request) {
skipped, skipped,
failed, failed,
}); });
} catch (error) {
return NextResponse.json({
error: "Unable to check IMGW meteorological warnings.",
details: getErrorMessage(error),
}, { status: 502 });
}
} }

View File

@@ -42,7 +42,11 @@ export async function GET(request: Request) {
&& Number.isFinite(subscription.latitude) && Number.isFinite(subscription.latitude)
&& Number.isFinite(subscription.longitude) && Number.isFinite(subscription.longitude)
)); ));
const warnings = await fetchMeteoWarnings(AbortSignal.timeout(12_000)); let warningsUnavailable = false;
const warnings = await fetchMeteoWarnings(AbortSignal.timeout(12_000)).catch(() => {
warningsUnavailable = true;
return [];
});
let sent = 0; let sent = 0;
let skipped = 0; let skipped = 0;
let failed = 0; let failed = 0;
@@ -82,6 +86,7 @@ export async function GET(request: Request) {
ok: true, ok: true,
date: dateKey, date: dateKey,
subscriptions: subscriptions.length, subscriptions: subscriptions.length,
warningsUnavailable,
sent, sent,
skipped, skipped,
failed, failed,