fix(api): query pagination accepts non-integer limit/page → fractional OFFSET/LIMIT
维护者通常 1 天内回复
评估
- 难度
- 3/5
- 预计耗时
- 1-2 天
- 新手友好度
- 76/100
- Issue 类型
- 缺陷
- 描述清晰度
- 描述清楚
- 活跃度
- 活跃
- 技术栈
- typescript
- 领域
- api, backend, databases, testing-qa
调研方向
先从 apps/api/src/schemas/query-schemas.ts 和 apps/api/src/routes/query.ts 中的 DynamicQueryRequestSchema 和 validatePaginationFields 开始,然后检查 packages/ai/src/query/index.ts 中的 QuerySchema 以及 limit/offset 构建器。复现 issue 中描述的分数输入,并添加回归测试覆盖。完成的标准是:非有限或非整数的 limit/page 值收到预期的 400 验证响应,同时有效的分页仍能构建与整数兼容的子句。
由索引模型根据 Issue 内容生成。
描述
Describe the bug
POST /v1/query DynamicQueryRequest accepts non-integer limit/page without validation and produces fractional LIMIT/OFFSET that fail ClickHouse Int32 binding.
Affected code:
apps/api/src/schemas/query-schemas.ts:49-50DynamicQueryRequestSchema: t.Optional(t.Number())— nominimum/integerconstraint.apps/api/src/routes/query.ts:294-308validatePaginationFieldsonly checks<1and>10000/<1forpage, notNumber.isInteger/isFinite.apps/api/src/routes/query.ts:1040-1041limit: request.limit || 100,offset: request.page ? (request.page-1)*(request.limit||100) :0→ withlimit=1.5, page=1.5yieldsoffset=0.75(fractional).packages/ai/src/query/simple-builder.ts:1148-1154buildLimitClause/buildOffsetClauseemitLIMIT 1.5 OFFSET 0.75vs. buildersLIMIT {limit:Int32} OFFSET {offset:Int32}(packages/ai/src/query/builders/pages.ts:182,sessions.ts:318, etc.).- Internal
packages/ai/src/query/index.ts:61-62QuerySchema: z.number().min(1).max(1000)also allows floats (missing.int()).
To Reproduce
- Authenticated request:
POST /v1/query?website_id=<id>&timezone=UTC
Content-Type: application/json
{
"parameters": ["top_pages"],
"startDate": "2026-01-01",
"endDate": "2026-01-02",
"limit": 1.5,
"page": 1.5
}
- Also try
{"limit": 0.5},{"page": 1.5},{"limit": 1.5, "page": 2.3}.
Expected behavior
400 VALIDATION_ERROR with details like:
{ "field":"limit", "message":"Limit must be an integer" }
{ "field":"page", "message":"Page must be an integer" }
limit/page should require finite integer, limit 1..10000, page 1...
Actual behavior
No validation error; request reaches ClickHouse with fractional values. Reproduced locally with copy of validatePaginationFields (D:\tmp\repro_pagination.js):
float limit {limit:1.5} => errors=[] limit=1.5 offset=0 BUG non-integer passed
float page {page:1.5} => errors=[] limit=100 offset=50 BUG
both float => offset 0.75 BUG not integer
Infinity/NaN similarly slip through (JSON NaN not encodable but Elysia coercion from query string can produce floats).
buildLimitClause(NaN) → '' (unbounded), buildLimitClause(0) → ''.
Screenshots
N/A
Environment
- OS: Windows, Bun 1.4.2 (
package.json:30[email protected]pinned) - Commit:
92c15273d(origin/staging)
Additional context
limitdefault fallback|| 100masks0/NaNinapps/api/src/routes/query.ts:1040,simple-builder.ts:1149fallback similarly.limitmax mismatch: API allows10000(validatePaginationFields:301), internalQuerySchemaallows1000— not part of this bug but worth aligning.- No existing open issue covers this (checked
gh issue list). - Minimal fix proposal: tighten
DynamicQueryRequestSchema(TypeBoxminimum), addNumber.isInteger/isFiniteinvalidatePaginationFields, add.int()toQuerySchema(packages/ai/src/query/index.ts:61-62), add regression test.
AI disclosure
Issue drafted with assistance from Muse Spark (opencode/muse-spark-1.2-contributor-free) and human-verified via local reproduction (node D:\tmp\repro_pagination.js).
- 主要语言
- TypeScript
- 星标
- 1.2k
- 派生
- 220
- 平均合并
- 12 小时 12 分钟
- 30 天内合并 PR
- 295
环境准备
- 提供 Dockerfile 或 Docker Compose 文件
- 有 Pull Request 模板
- 阅读贡献指南
从这里开始
- 先读完整个 Issue,再读项目的贡献指南。
- 在 Issue 下留言说明你要接手 —— 这能避免两个人做同样的事。
- Fork 仓库,在一个分支上完成修改。
- 提交 Pull Request,并在描述里引用这个 Issue 编号。
databuddy-analytics/Databuddy 的其他 Issue
-
fix(dashboard): connecting one social identity shows loading on all provider buttons可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 2/5 1-3 小时 新手友好度 82/100
databuddy-analytics/Databuddy#1106 ·
维护者通常 1 天内回复
-
fix(dashboard): custom profile photo URL never renders, falls back to initials可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 2/5 1-3 小时 新手友好度 75/100
databuddy-analytics/Databuddy#1104 ·
维护者通常 1 天内回复
-
feat(dashboard): add Next.js and TanStack installation snippets to tracking setup可能已有人在做 关联的 PR 仍在进行中或已合并。 未关闭
难度 2/5 1-3 小时 新手友好度 70/100
databuddy-analytics/Databuddy#1097 · 1 条评论 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 78/100
databuddy-analytics/Databuddy#1092 · 1 条评论 ·
维护者通常 1 天内回复
-
SDK cached reads still revalidate when evaluation is disabled or pending可能已有人在做 @mvanhorn 于 2 天前认领。 未关闭
难度 2/5 1-3 小时 新手友好度 78/100
databuddy-analytics/Databuddy#1091 · 1 条评论 ·
维护者通常 1 天内回复
查看 databuddy-analytics/Databuddy 的全部 Issue
相似的 Issue
-
[Bug]: [MCP/CLI] Bare loopback IP addresses (127.0.0.1:port) and hosts with ports fail to navigate due to erroneous scheme inference可能已有人在做 @alok-108 今天认领。 未关闭
难度 2/5 1-3 小时 新手友好度 78/100
microsoft/playwright#43263 ·
维护者通常 1 天内回复
-
bug priority:medium
难度 2/5 1-3 小时 新手友好度 65/100
维护者通常 1 天内回复
-
community first-timers-only good first issue hacktoberfest help wanted low hanging fruit up-for-grabs
难度 1/5 1 小时以内 新手友好度 75/100
lingdojo/kana-dojo#32018 · 1 条评论 · 5 个 reaction ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
paperclipai/paperclip#15751 ·
维护者通常 1 天内回复
-
难度 2/5 1-3 小时 新手友好度 72/100
BuilderIO/agent-native#7275 ·
维护者通常 1 天内回复