8fa55eec3e
bug: 弹窗 engagement 表只按 (device, 日) 全局记一条,美团弹过/领过就把整台设备当天 标记 engage,淘宝/京东被压住不弹。需求是美团/淘宝/京东各自独立、每日各弹一次。 改动: - model: CouponPromptEngagement 加 package 列,唯一约束 (device,日) → (device,package,日) - alembic: 新增迁移 coupon_engage_per_package(加列 + 改唯一约束, batch_alter_table) - repository: has_engaged_today / mark_engagement 加 package 维度;新增 reset_today_completion - api: should-show / dismiss 接收 package;coupon_step(step=0) 按 App 记 engagement; 补 /prompt/shown 接口(客户端一直在调但后端缺失, 原 404); 补 /completed-today/reset(开发设置全重置用, 解首页卡置灰) 验证: curl 端到端 —— 美团弹过后 should-show 美团=false 淘宝/京东=true; shown/reset/completion-reset 端点全 ok。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> --------- Co-authored-by: no_gen_mu <liujianhishen@gmail.com> Reviewed-on: #52 Co-authored-by: liujiahui <liujiahui@wonderable.ai> Co-committed-by: liujiahui <liujiahui@wonderable.ai>
42 lines
1.4 KiB
Python
42 lines
1.4 KiB
Python
"""领券今日状态端点的收发模型。"""
|
|
from __future__ import annotations
|
|
|
|
from pydantic import BaseModel
|
|
|
|
|
|
class CouponPromptDismissIn(BaseModel):
|
|
"""客户端拒绝/关闭领券引导窗的通知体。
|
|
|
|
server 据此记一条今日 engagement(dismissed)→ 今天**这个 App** 不再弹引导窗。
|
|
频控按 (device, package, 日):各 App 独立。package 缺省 ""(老客户端兼容,退化为全局态)。
|
|
MVP 不鉴权,按 device_id 判断;user_id 登录态带上就一并记(资产),可空。
|
|
"""
|
|
|
|
device_id: str
|
|
package: str = ""
|
|
user_id: int | None = None
|
|
|
|
|
|
class CouponPromptShownIn(BaseModel):
|
|
"""客户端弹出领券引导窗即上报(记 shown)。
|
|
|
|
弹出那刻就记一条今日 engagement(shown)→ 今天**这个 App** 不再自动弹(频控主判据,
|
|
管跨重装;本地 SP 兜后台抖动)。后续用户点领取/拒绝再把 type 升级成 claim_started/dismissed。
|
|
"""
|
|
|
|
device_id: str
|
|
package: str
|
|
user_id: int | None = None
|
|
|
|
|
|
class CouponPromptShouldShowOut(BaseModel):
|
|
"""切到外卖 App 时是否还应弹领券引导窗。今天**这个 App** 已 engage(弹/领/拒)过 → false。"""
|
|
|
|
should_show: bool
|
|
|
|
|
|
class CouponCompletedTodayOut(BaseModel):
|
|
"""这台设备今天是否已跑完整轮领券(到 done 帧)。完成 → 首页「去领取」卡置灰。"""
|
|
|
|
completed: bool
|