fix: clamp stale fish detail pagination
This commit is contained in:
@@ -15,14 +15,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 fish: DictionaryItem | undefined, items: Activity[] = [], media: MediaAsset[] = [], totalItems = 0, unavailable = false;
|
let fish: DictionaryItem | undefined, items: Activity[] = [], media: MediaAsset[] = [], totalItems = 0, unavailable = false;
|
||||||
try {
|
try {
|
||||||
const [fishes, fishMedia] = await Promise.all([api<DictionaryItem[]>("/api/v1/fishes?limit=500"), api<MediaAsset[]>("/api/v1/media/catalog?entity_type=fish")]);
|
const [fishes, fishMedia] = await Promise.all([api<DictionaryItem[]>("/api/v1/fishes?limit=500"), api<MediaAsset[]>("/api/v1/media/catalog?entity_type=fish")]);
|
||||||
media = fishMedia;
|
media = fishMedia;
|
||||||
fish = fishes.find(item => item.slug === slug);
|
fish = fishes.find(item => item.slug === slug);
|
||||||
if (fish) { const paginated = await api<PaginatedActivity>(`/api/v1/activity?hours=${hours}&fish=${encodeURIComponent(fish.slug)}&limit=${activityLimit}&offset=${offset}`); items = paginated.items; totalItems = paginated.total; }
|
if (fish) {
|
||||||
|
let paginated = await api<PaginatedActivity>(`/api/v1/activity?hours=${hours}&fish=${encodeURIComponent(fish.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}&fish=${encodeURIComponent(fish.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;
|
||||||
|
|||||||
Reference in New Issue
Block a user