54 lines
1.8 KiB
Python
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,
|
|
)
|