people-reading/backend/app/api/v1/endpoints/auth.py
2026-05-11 23:26:11 +08:00

54 lines
1.8 KiB
Python

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,
)