mirror of
https://gitea.toothfairyai.com/ToothFairyAI/tf_code.git
synced 2026-04-07 17:28:53 +00:00
perf(server): paginate session history (#17134)
This commit is contained in:
@@ -569,17 +569,65 @@ export const SessionRoutes = lazy(() =>
|
||||
),
|
||||
validator(
|
||||
"query",
|
||||
z.object({
|
||||
limit: z.coerce.number().optional(),
|
||||
}),
|
||||
z
|
||||
.object({
|
||||
limit: z.coerce
|
||||
.number()
|
||||
.int()
|
||||
.min(0)
|
||||
.optional()
|
||||
.meta({ description: "Maximum number of messages to return" }),
|
||||
before: z
|
||||
.string()
|
||||
.optional()
|
||||
.meta({ description: "Opaque cursor for loading older messages" })
|
||||
.refine(
|
||||
(value) => {
|
||||
if (!value) return true
|
||||
try {
|
||||
MessageV2.cursor.decode(value)
|
||||
return true
|
||||
} catch {
|
||||
return false
|
||||
}
|
||||
},
|
||||
{ message: "Invalid cursor" },
|
||||
),
|
||||
})
|
||||
.refine((value) => !value.before || value.limit !== undefined, {
|
||||
message: "before requires limit",
|
||||
path: ["before"],
|
||||
}),
|
||||
),
|
||||
async (c) => {
|
||||
const query = c.req.valid("query")
|
||||
const messages = await Session.messages({
|
||||
sessionID: c.req.valid("param").sessionID,
|
||||
const sessionID = c.req.valid("param").sessionID
|
||||
if (query.limit === undefined) {
|
||||
await Session.get(sessionID)
|
||||
const messages = await Session.messages({ sessionID })
|
||||
return c.json(messages)
|
||||
}
|
||||
|
||||
if (query.limit === 0) {
|
||||
await Session.get(sessionID)
|
||||
const messages = await Session.messages({ sessionID })
|
||||
return c.json(messages)
|
||||
}
|
||||
|
||||
const page = await MessageV2.page({
|
||||
sessionID,
|
||||
limit: query.limit,
|
||||
before: query.before,
|
||||
})
|
||||
return c.json(messages)
|
||||
if (page.cursor) {
|
||||
const url = new URL(c.req.url)
|
||||
url.searchParams.set("limit", query.limit.toString())
|
||||
url.searchParams.set("before", page.cursor)
|
||||
c.header("Access-Control-Expose-Headers", "Link, X-Next-Cursor")
|
||||
c.header("Link", `<${url.toString()}>; rel=\"next\"`)
|
||||
c.header("X-Next-Cursor", page.cursor)
|
||||
}
|
||||
return c.json(page.items)
|
||||
},
|
||||
)
|
||||
.get(
|
||||
|
||||
Reference in New Issue
Block a user