Files
shaguabijia-app-server/app/repositories/user.py
T
marco 8303a4fac2 refactor: 后端分层调整(集成层独立、crud 改名) + 本地启动脚本
- core 拆分: 极光/美团/短信三个外部集成从 core/ 迁出到新建的 integrations/,
  core/ 仅保留 config/security/logging 等基础设施
- crud/ 改名 repositories/; auth.py 中模块别名 crud_user -> user_repo
- 同步更新 app/api/v1/{auth,meituan}.py 的 import 路径
- 新增 run.sh: 本地开发启动脚本(校验 .env、alembic upgrade 建表、uvicorn 监听 0.0.0.0:8770)
- .gitignore 忽略 *.log, 避免 run.sh 运行日志入库

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-05-27 11:04:51 +08:00

49 lines
1.2 KiB
Python

"""user 表的 CRUD 工具函数。
业务策略 = "注册即登录":phone 不存在则 insert,存在则更新 last_login_at。
"""
from __future__ import annotations
from datetime import datetime, timezone
from sqlalchemy import select
from sqlalchemy.orm import Session
from app.models.user import User
def get_user_by_id(db: Session, user_id: int) -> User | None:
return db.get(User, user_id)
def get_user_by_phone(db: Session, phone: str) -> User | None:
stmt = select(User).where(User.phone == phone)
return db.execute(stmt).scalar_one_or_none()
def upsert_user_for_login(
db: Session,
*,
phone: str,
register_channel: str,
) -> User:
"""登录入口统一调:有则更新 last_login_at,无则新建。
返回 commit 后的 user。调用方拿到 user.id 直接签 JWT。
"""
user = get_user_by_phone(db, phone)
now = datetime.now(timezone.utc)
if user is None:
user = User(
phone=phone,
register_channel=register_channel,
last_login_at=now,
)
db.add(user)
else:
user.last_login_at = now
# 被禁用的账号被尝试登录时,不自动启用,直接抛(在调用方处理)
db.commit()
db.refresh(user)
return user