from fastapi import APIRouter, Depends, Header from pydantic import BaseModel from sqlalchemy.orm import Session from backend.app.api.deps import get_auth_service, get_current_user from backend.app.db import get_db_session from backend.app.schemas.auth import LoginRequest from backend.app.schemas.common import success_payload from backend.app.services.auth_service import AuthService from backend.app.services.wechat_notification_service import wechat_notification_service router = APIRouter(prefix="/api/auth", tags=["auth"]) class BindOpenIdRequest(BaseModel): open_id: str @router.post("/login") def login( payload: LoginRequest, auth_service: AuthService = Depends(get_auth_service), session: Session = Depends(get_db_session), ) -> dict: return success_payload(auth_service.login(payload.username, payload.password, payload.role_type, session)) @router.get("/me") def me( current_user: dict = Depends(get_current_user), ) -> dict: return success_payload(current_user) @router.post("/logout") def logout( authorization: str | None = Header(default=None), auth_service: AuthService = Depends(get_auth_service), ) -> dict: token = (authorization or "").removeprefix("Bearer").strip() return success_payload(auth_service.logout(token)) @router.post("/bind-openid") def bind_openid( payload: BindOpenIdRequest, session: Session = Depends(get_db_session), current_user: dict = Depends(get_current_user), ) -> dict: wechat_notification_service.bind_open_id(session, current_user["user_id"], payload.open_id) return success_payload({"success": True})