diff --git a/src/app/discover/actions.ts b/src/app/discover/actions.ts index cd389b3..415ac77 100644 --- a/src/app/discover/actions.ts +++ b/src/app/discover/actions.ts @@ -92,22 +92,43 @@ export async function getDiscoverData(sort: DiscoverSortOption): Promise(); + const BATCH_SIZE = 1000; + let offset = 0; + let hasMore = true; - const tagsBySlug = new Map(); - (tagRows || []).forEach((r: any) => { - const arr = tagsBySlug.get(r.hack_slug) || []; - arr.push({ - name: r.tags.name, - order: r.order, - }); - tagsBySlug.set(r.hack_slug, arr); - }); + while (hasMore) { + const { data: tagRows, error: tagsError } = await supabase + .from("hack_tags") + .select("hack_slug,order,tags(name,category)") + .in("hack_slug", slugs) + .range(offset, offset + BATCH_SIZE - 1) + .order("hack_slug", { ascending: true }); + + if (tagsError) throw tagsError; + + if (!tagRows || tagRows.length === 0) { + hasMore = false; + } else { + tagRows.forEach((r: any) => { + if (!r.tags?.name) return; + const arr = tagsBySlug.get(r.hack_slug) || []; + arr.push({ + name: r.tags.name, + order: r.order, + }); + tagsBySlug.set(r.hack_slug, arr); + }); + + // If we got fewer rows than the batch size, we've reached the end + if (tagRows.length < BATCH_SIZE) { + hasMore = false; + } else { + offset += BATCH_SIZE; + } + } + } // Fetch patches for version mapping const patchIds = Array.from(