This commit is contained in:
2026-08-06 15:32:07 +08:00
parent e33d620d87
commit 9aa79bef6d
8 changed files with 101 additions and 22 deletions
@@ -0,0 +1,29 @@
import assert from 'node:assert/strict'
import test from 'node:test'
import { loadAllWarehouseRecords } from './warehousePagination.ts'
test('loads every page for one warehouse type and preserves the type query', async () => {
const queries = []
const records = await loadAllWarehouseRecords('DOMESTIC', async (query) => {
queries.push(query)
if (query.page === 1) return { records: [{ id: 'domestic-1' }], pages: '2' }
return { records: [{ id: 'domestic-2' }], pages: '2' }
})
assert.deepEqual(queries, [
{ warehouseType: 'DOMESTIC', page: 1, size: 200 },
{ warehouseType: 'DOMESTIC', page: 2, size: 200 },
])
assert.deepEqual(records, [{ id: 'domestic-1' }, { id: 'domestic-2' }])
})
test('stops after the first page when the warehouse type has no later pages', async () => {
let requestCount = 0
const records = await loadAllWarehouseRecords('FBA', async () => {
requestCount += 1
return { records: [], pages: 0 }
})
assert.equal(requestCount, 1)
assert.deepEqual(records, [])
})
@@ -0,0 +1,28 @@
export type WarehouseType = 'DOMESTIC' | 'FBA' | 'OVERSEAS'
export interface WarehousePage<T> {
records: T[]
pages: number | string
}
export interface WarehousePageQuery {
warehouseType: WarehouseType
page: number
size: number
}
export async function loadAllWarehouseRecords<T>(
warehouseType: WarehouseType,
fetchPage: (query: WarehousePageQuery) => Promise<WarehousePage<T>>,
) {
const records: T[] = []
let page = 1
let pages = 1
do {
const response = await fetchPage({ warehouseType, page, size: 200 })
records.push(...response.records)
pages = Number(response.pages) || page
page += 1
} while (page <= pages)
return records
}