diff --git a/app/sitemap.js b/app/sitemap.js index 9f0f1f0..f6e6469 100644 --- a/app/sitemap.js +++ b/app/sitemap.js @@ -31,10 +31,6 @@ export default async function sitemap() { { url: `${url}/awtis`, priority: 0.6 - }, - { - url: `${url}/pwopose`, - priority: 0.5 } ] diff --git a/lib/__tests__/oki-api-pagination.test.js b/lib/__tests__/oki-api-pagination.test.js new file mode 100644 index 0000000..26cf8d6 --- /dev/null +++ b/lib/__tests__/oki-api-pagination.test.js @@ -0,0 +1,58 @@ +import {describe, it, expect, vi, afterEach} from 'vitest' +import {jwennTeksSlug} from '../oki-api' + +function fakeEntry(i) { + return {slug: `slug-${i}`} +} + +describe('jwennTeksSlug (full pagination)', () => { + const originalFetch = global.fetch + + afterEach(() => { + global.fetch = originalFetch + vi.restoreAllMocks() + }) + + it('walks every page instead of stopping at the first pageSize chunk', async () => { + const pageSize = 200 + const totalRecords = 250 + + let calls = 0 + global.fetch = vi.fn(async url => { + calls++ + if (calls > 5) { + throw new Error('too many pagination calls, likely an infinite loop') + } + + const pageMatch = url.match(/pagination\[page]=(\d+)/) + const page = pageMatch ? Number(pageMatch[1]) : 1 + const start = (page - 1) * pageSize + const end = Math.min(start + pageSize, totalRecords) + const data = Array.from({length: Math.max(end - start, 0)}, (_, i) => fakeEntry(start + i)) + + return { + ok: true, + json: async () => ({data}) + } + }) + + const slugs = await jwennTeksSlug() + + expect(slugs).toHaveLength(totalRecords) + expect(slugs[0]).toBe('slug-0') + expect(slugs.at(-1)).toBe('slug-249') + expect(global.fetch).toHaveBeenCalledTimes(2) + }) + + it('stops after a single page when there are fewer records than pageSize', async () => { + global.fetch = vi.fn(async () => ({ + ok: true, + json: async () => ({data: [fakeEntry(1), fakeEntry(2)]}) + })) + + const slugs = await jwennTeksSlug() + + expect(slugs).toEqual(['slug-1', 'slug-2']) + expect(global.fetch).toHaveBeenCalledTimes(1) + }) +}) diff --git a/lib/oki-api.js b/lib/oki-api.js index 3a5fbbc..5760ca4 100644 --- a/lib/oki-api.js +++ b/lib/oki-api.js @@ -171,32 +171,36 @@ export async function jwennTeks() { return data } -export async function jwennAwtisSlug() { - const query = qs.stringify({ - sort: ['createdAt:desc'], - pagination: { - pageSize: 200 - } - }, { - encodeValuesOnly: true - }) +async function jwennTouSlug(endpoint) { + const pageSize = 200 + const slugs = [] + let page = 1 + let hasMore = true - const {data} = await request(`/artistes?${query}`, headers) - return data.map(({slug}) => slug) + while (hasMore) { + const query = qs.stringify({ + sort: ['createdAt:desc'], + fields: ['slug'], + pagination: {page, pageSize} + }, { + encodeValuesOnly: true + }) + + const {data} = await request(`/${endpoint}?${query}`, headers) + slugs.push(...data.map(({slug}) => slug)) + hasMore = data.length === pageSize + page += 1 + } + + return slugs +} + +export async function jwennAwtisSlug() { + return jwennTouSlug('artistes') } export async function jwennTeksSlug() { - const query = qs.stringify({ - sort: ['createdAt:desc'], - pagination: { - pageSize: 200 - } - }, { - encodeValuesOnly: true - }) - - const {data} = await request(`/paroles?${query}`, headers) - return data.map(({slug}) => slug) + return jwennTouSlug('paroles') } export async function jwennDenyeTeks() {