from uuid import uuid4 from fastapi import APIRouter, Depends, HTTPException from sqlalchemy import select from sqlalchemy.ext.asyncio import AsyncSession from app.core.database import get_db from app.core.security import create_access_token from app.models.user import User from app.schemas.auth import AnonymousLoginRequest, AuthResponse, WechatLoginRequest from app.services.wechat_service import WechatService router = APIRouter() @router.post("/anonymous-login", response_model=AuthResponse) async def anonymous_login(payload: AnonymousLoginRequest, db: AsyncSession = Depends(get_db)): client_id = payload.client_id or str(uuid4()) openid = f"web-anon-{client_id}" result = await db.execute(select(User).where(User.openid == openid)) user = result.scalar_one_or_none() if user is None: user = User(openid=openid) db.add(user) await db.flush() await db.refresh(user) return AuthResponse(access_token=create_access_token(user.id), user_id=user.id) @router.post("/wechat-login", response_model=AuthResponse) async def wechat_login(payload: WechatLoginRequest, db: AsyncSession = Depends(get_db)): try: openid, phone_number = await WechatService().login(payload.code, payload.phone_code) except RuntimeError as exc: raise HTTPException(status_code=400, detail=str(exc)) from exc result = await db.execute(select(User).where(User.openid == openid)) user = result.scalar_one_or_none() if user is None: user = User(openid=openid, phone_number=phone_number) db.add(user) await db.flush() await db.refresh(user) elif phone_number and user.phone_number != phone_number: user.phone_number = phone_number return AuthResponse( access_token=create_access_token(user.id), user_id=user.id, phone_number=user.phone_number, )