a4d214964a
- 数据访问层统一: app/crud/{ad_reward,savings,signin,task,wallet}.py 移入
app/repositories/(与 user.py 同目录),删除 crud/;更新 10 处 import
(api/v1/* + scripts/* + repositories 内部交叉引用 app.crud→app.repositories)
- alembic/versions 9 个迁移文件去掉 hex 前缀,改成可读文件名(如
welfare_tables_coin_account_coin_txn.py);**仅重命名文件**,文件内
revision/down_revision 不动 → 迁移链与已迁移库的 alembic_version 不受影响
(alembic heads/history 验证链完好,单一 head c8d9e0f1a2b3)
- 测试: 37 passed(1 个 coupon 代理失败为连不到 pricebot 上游的环境问题,与本次无关)
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
45 lines
1.5 KiB
Python
45 lines
1.5 KiB
Python
"""签到 endpoint。
|
|
|
|
路由前缀 `/api/v1/signin`:
|
|
GET /status 今日签到状态 + 7 天档位
|
|
POST / 执行今日签到
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
import logging
|
|
|
|
from fastapi import APIRouter, HTTPException, status
|
|
|
|
from app.api.deps import CurrentUser, DbSession
|
|
from app.repositories import signin as crud_signin
|
|
from app.schemas.welfare import SigninResultOut, SigninStatusOut
|
|
|
|
logger = logging.getLogger("shagua.signin")
|
|
|
|
router = APIRouter(prefix="/api/v1/signin", tags=["signin"])
|
|
|
|
|
|
@router.get("/status", response_model=SigninStatusOut, summary="今日签到状态")
|
|
def signin_status(user: CurrentUser, db: DbSession) -> SigninStatusOut:
|
|
st = crud_signin.get_status(db, user.id)
|
|
return SigninStatusOut.model_validate(st, from_attributes=True)
|
|
|
|
|
|
@router.post("", response_model=SigninResultOut, summary="执行今日签到")
|
|
def do_signin(user: CurrentUser, db: DbSession) -> SigninResultOut:
|
|
try:
|
|
record, balance = crud_signin.do_signin(db, user.id)
|
|
except crud_signin.AlreadySignedError as e:
|
|
raise HTTPException(status_code=status.HTTP_409_CONFLICT, detail="already signed today") from e
|
|
|
|
logger.info(
|
|
"signin ok user_id=%d day=%d streak=%d coin=%d",
|
|
user.id, record.cycle_day, record.streak, record.coin_awarded,
|
|
)
|
|
return SigninResultOut(
|
|
coin_awarded=record.coin_awarded,
|
|
cycle_day=record.cycle_day,
|
|
streak=record.streak,
|
|
coin_balance=balance,
|
|
)
|