fix: clamp stale waterbody pagination

This commit is contained in:
ik
2026-09-21 20:10:49 +07:00
parent 060aacff92
commit 9dfad82dd0
+9 -2
View File
@@ -17,14 +17,21 @@ const requestedHours = Astro.url.searchParams.get("hours") ?? "72";
const hours = ["24", "72", "168"].includes(requestedHours) ? requestedHours : "72"; const hours = ["24", "72", "168"].includes(requestedHours) ? requestedHours : "72";
const periodLabel = { "24": "24 часа", "72": "72 часа", "168": "7 дней" }[hours]; const periodLabel = { "24": "24 часа", "72": "72 часа", "168": "7 дней" }[hours];
const requestedOffset = Number(Astro.url.searchParams.get("offset") ?? 0); const requestedOffset = Number(Astro.url.searchParams.get("offset") ?? 0);
const offset = Number.isInteger(requestedOffset) && requestedOffset >= 0 ? requestedOffset : 0; let offset = Number.isInteger(requestedOffset) && requestedOffset >= 0 ? requestedOffset : 0;
const activityLimit = 24; const activityLimit = 24;
let water: DictionaryItem | undefined, items: Activity[] = [], media: MediaAsset[] = [], totalItems = 0, unavailable = false; let water: DictionaryItem | undefined, items: Activity[] = [], media: MediaAsset[] = [], totalItems = 0, unavailable = false;
try { try {
const [waters, waterMedia] = await Promise.all([api<DictionaryItem[]>("/api/v1/waterbodies?limit=500"), api<MediaAsset[]>("/api/v1/media/catalog?entity_type=waterbody")]); const [waters, waterMedia] = await Promise.all([api<DictionaryItem[]>("/api/v1/waterbodies?limit=500"), api<MediaAsset[]>("/api/v1/media/catalog?entity_type=waterbody")]);
media = waterMedia; media = waterMedia;
water = waters.find(item => item.slug === slug); water = waters.find(item => item.slug === slug);
if (water) { const paginated = await api<PaginatedActivity>(`/api/v1/activity?hours=${hours}&waterbody=${encodeURIComponent(water.slug)}&limit=${activityLimit}&offset=${offset}`); items = paginated.items; totalItems = paginated.total; } if (water) {
let paginated = await api<PaginatedActivity>(`/api/v1/activity?hours=${hours}&waterbody=${encodeURIComponent(water.slug)}&limit=${activityLimit}&offset=${offset}`);
if (paginated.total > 0 && offset >= paginated.total) {
offset = Math.floor((paginated.total - 1) / activityLimit) * activityLimit;
paginated = await api<PaginatedActivity>(`/api/v1/activity?hours=${hours}&waterbody=${encodeURIComponent(water.slug)}&limit=${activityLimit}&offset=${offset}`);
}
items = paginated.items; totalItems = paginated.total;
}
} catch { unavailable = true; } } catch { unavailable = true; }
if (unavailable) { if (unavailable) {
Astro.response.status = 503; Astro.response.status = 503;