Курсорная пагинация по (created_at, id)
Условие
Напиши paginate(items, limit, cursor). items уже отсортированы по createdAt убыванию, при равенстве по id убыванию (как ORDER BY created_at DESC, id DESC). cursor это null (первая страница) или строка, которую ты сам вернул в прошлый раз.
Верни { items: [...], nextCursor }: до limit элементов строго после позиции курсора и курсор следующей страницы (null, если дальше ничего нет). Курсор кодирует пару createdAt, id последнего элемента страницы строкой JSON.stringify([createdAt, id]) (в проде её ещё упаковывают в base64url, здесь без этого). Ищи позицию по значениям, а не по индексу: между запросами элементы могут удаляться и добавляться.
Что проверяют тесты
листание до конца
ровно limit элементов: курсора нет
вставка в начало не сдвигает страницу
удаление элемента курсора не ломает
одинаковые createdAt разводятся по id
курсор это JSON пары
пустой список
Как подойти
Подсказки: 2
- Условие «после курсора» для сортировки по убыванию:
createdAt < cили (createdAt === cиid < id0). - Есть ли следующая страница: осталось больше, чем
limit.
Решите в тренажёре
Редактор с автотестами прямо в браузере. Можно решить спокойно, вслух или под таймером, как на собесе.
Предыдущий вопрос
compose: цепочка middleware как в Koa
Следующий вопрос
Ошибки домена в HTTP-ответ (problem+json)