PagenationのAPI
APIのinterfaceを、DB側の都合に合わせて設計することになる
利用者目線ではなく、実装の都合によって決まってしまう
というか、それに合わせてUIを考えないといけない
DBの都合でUIが変わるとか変な話だけども。
APIとして、以下の2つの選択肢がある
limit / offset
DBのinterfaceをそのまま表出させた感じ
page / limit
例えば、各ページ12項目表示する時に、3ページ目を見たければ、
page=3, limit=12
とする
利用者シーンの感覚に合っている
件数を表すのに「limit」って何か変じゃない?という気もするけど

「count」とかの方が適切だと思う
これらは、互いに導出可能なので、どちらを選んでも内部に影響はない
offset = (page - 1) * limit
page = offset / limit + 1
除算したくないし、直感的だし、
page / count
を使いたいかな

APIとは関係ないけど、URLにqueryを表出させる場合も page
の方が理解しやすい
limit
は表出させずに、 /items?page=2
のようにすればいい
この観点だと、 page
を使ったほうがcacheもさせやすい
cursorの計算をbackend/frontendのどちらでやるか、という話
backendでやるなら以下のようにcursorを明示的に返す感じになる
ts const results = await prisma.fabric.findMany({
where: { ... },
take: limit,
...(cursor == null
? {}
: {
skip: 1,
cursor: {
id: cursor,
},
}),
orderBy: { id: 'asc' },
});
return {
items: results,
cursor: results.at(-1)?.id,
};
でも、情報量的には items
さえあればfrontendでも計算できる
どちらのPagenationをするかの選択で返り値を変えたくない

引数の方のinterfaceでpagenationの方法は確定するんだが。