aboutsummaryrefslogtreecommitdiff
path: root/src/lib/Data/Birthday/primary.ts
diff options
context:
space:
mode:
authorFuwn <[email protected]>2026-02-19 16:39:43 -0800
committerFuwn <[email protected]>2026-02-19 16:39:43 -0800
commit9cf831050677e1ca4117035294879470222ebc63 (patch)
tree9629bc83fc8c8f958706a07f475052089fe22fe5 /src/lib/Data/Birthday/primary.ts
parentperf(schedule): Reduce redundant work in title matching (diff)
downloaddue.moe-9cf831050677e1ca4117035294879470222ebc63.tar.xz
due.moe-9cf831050677e1ca4117035294879470222ebc63.zip
fix(birthdays): Gracefully handle partial source failures
Diffstat (limited to 'src/lib/Data/Birthday/primary.ts')
-rw-r--r--src/lib/Data/Birthday/primary.ts19
1 files changed, 17 insertions, 2 deletions
diff --git a/src/lib/Data/Birthday/primary.ts b/src/lib/Data/Birthday/primary.ts
index 89a765bc..5f8ee1d0 100644
--- a/src/lib/Data/Birthday/primary.ts
+++ b/src/lib/Data/Birthday/primary.ts
@@ -5,8 +5,23 @@ export interface aniSearchBirthday {
image: string;
}
+const isAniSearchBirthday = (entry: unknown): entry is aniSearchBirthday =>
+ typeof entry === 'object' &&
+ entry !== null &&
+ typeof (entry as { name?: unknown }).name === 'string' &&
+ typeof (entry as { image?: unknown }).image === 'string';
+
export const aniSearchBirthdays = async (
month: number,
day: number
-): Promise<aniSearchBirthday[]> =>
- await (await fetch(root(`/api/birthdays/primary?month=${month}&day=${day}`), {})).json();
+): Promise<aniSearchBirthday[]> => {
+ const response = await fetch(root(`/api/birthdays/primary?month=${month}&day=${day}`), {});
+
+ if (!response.ok) throw new Error(`Primary birthdays request failed with ${response.status}.`);
+
+ const data: unknown = await response.json();
+
+ if (!Array.isArray(data)) throw new Error('Primary birthdays response was not an array.');
+
+ return data.filter(isAniSearchBirthday);
+};