feat(compare): 新增只读当日比价额度查询 GET /compare/quota #216
Reference in New Issue
Block a user
Delete Branch "feat-error-prompt-unify"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
概述
新增只读接口
GET /api/v1/compare/quota,供客户端「跳外卖 App」型比价入口在点击时前置查询当日比价是否已达上限(100 次/日),超限就地提示、不进入比价流程。配套客户端 PR:比价/领券异常提示统一 + 4 入口上限拦截(shaguabijia-app-android 同名分支)。
改动
app/repositories/comparison.py:新增只读get_daily_compare_used(db, user_id, reset_at)—— 按 user_id + 北京时间自然日 COUNT,窗口计算逐行复刻写路径reserve_daily_start,保证前置查询与真发起的 429 gate 口径不漂移。app/schemas/compare_record.py:新增CompareQuotaOut(exhausted, used, limit)。app/api/v1/compare_record.py:新增GET /quota端点,硬鉴权CurrentUser、只读不预占;limit_policy.resolve传phone + device_id(与/compare/start一致,命中 device 白名单)。测试
pytest tests/test_compare_daily_limit.py:8 passed(4 既有 + 4 新增,含 device 白名单 parity 测试,锁定/quota与/start口径一致)。合并 / 部署注意 ⚠️
🤖 review-pr 深审结论
🟢 可合并 — 只读当日额度查询接口,计数口径与
/compare/start严格同源;实跑测试全绿。置信度 0.9。契约
GET /api/v1/compare/quota?device_id=<可选>(需登录)→{exhausted: bool, used: int, limit: int|null}。exhausted=true即已达今日上限;limit=null表示无限制(设备白名单)。核对要点
get_daily_compare_used与reserve_daily_start的计数逐行一致——同day_start/day_end(北京自然日 naive)、同reset_at取max(当日0点, reset_at)、同where(user_id, created_at∈[day_start,day_end))、都不按 status 过滤(发起即计数、含 failed)。created_at全程存 naive 北京时间,比较口径对齐,无 8 小时时区错位。exhausted = limit is not None and used >= limit,与reserve的used >= limit → raise完全一致。/start的行锁保证;/quota仅作前端①④入口点击的前置 toast 预检。⚠️ 并发下可能出现/quota报未满但/start时已满——属只读预检固有语义,前端仍需兜底处理/start的超限响应(见配套前端 PR #385)。构建/测试(已实跑)
.venvpy3.12.7 + pytest:pytest tests/test_compare_daily_limit.py→ 8 passed in 1.75s(4 个新 quota 用例:新用户/已超限/昨日不计入/设备白名单 parity + 4 个既有 daily_limit 用例,均过;测试库为隔离的临时 sqlite)。正面
口径复刻严谨、时区处理正确、测试覆盖了新用户/超限/跨日/设备白名单四类关键场景,schema 字段有清晰 description。
🤖 自动深审 · 结论仅供参考,请以人工判断为准