2026-02-05 15:13:06 +08:00
|
|
|
from __future__ import annotations
|
|
|
|
|
|
2026-02-25 10:20:43 +08:00
|
|
|
from typing import Annotated
|
|
|
|
|
|
2026-02-05 15:13:06 +08:00
|
|
|
from fastapi import APIRouter, Depends, Response
|
2026-02-25 10:20:43 +08:00
|
|
|
from fastapi import HTTPException
|
2026-02-05 15:13:06 +08:00
|
|
|
|
2026-02-25 10:20:43 +08:00
|
|
|
from core.auth.models import CurrentUser
|
2026-02-05 15:13:06 +08:00
|
|
|
from v1.auth.dependencies import get_auth_service
|
2026-02-25 10:20:43 +08:00
|
|
|
from v1.profile.dependencies import get_current_user
|
2026-02-24 16:38:30 +08:00
|
|
|
from v1.auth.schemas import (
|
2026-02-05 15:13:06 +08:00
|
|
|
AuthTokenResponse,
|
2026-02-25 10:20:43 +08:00
|
|
|
AuthUserByEmailResponse,
|
2026-02-05 15:13:06 +08:00
|
|
|
LoginRequest,
|
|
|
|
|
LogoutRequest,
|
|
|
|
|
RefreshRequest,
|
|
|
|
|
SignupRequest,
|
|
|
|
|
)
|
|
|
|
|
from v1.auth.service import AuthService
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
router = APIRouter(prefix="/auth", tags=["auth"])
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/signup", response_model=AuthTokenResponse)
|
|
|
|
|
async def signup(
|
|
|
|
|
payload: SignupRequest,
|
|
|
|
|
service: AuthService = Depends(get_auth_service),
|
|
|
|
|
) -> AuthTokenResponse:
|
|
|
|
|
return await service.signup(payload)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/login", response_model=AuthTokenResponse)
|
|
|
|
|
async def login(
|
|
|
|
|
payload: LoginRequest,
|
|
|
|
|
service: AuthService = Depends(get_auth_service),
|
|
|
|
|
) -> AuthTokenResponse:
|
|
|
|
|
return await service.login(payload)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/refresh", response_model=AuthTokenResponse)
|
|
|
|
|
async def refresh(
|
|
|
|
|
payload: RefreshRequest,
|
|
|
|
|
service: AuthService = Depends(get_auth_service),
|
|
|
|
|
) -> AuthTokenResponse:
|
|
|
|
|
return await service.refresh(payload)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.post("/logout", status_code=204)
|
|
|
|
|
async def logout(
|
|
|
|
|
payload: LogoutRequest,
|
|
|
|
|
service: AuthService = Depends(get_auth_service),
|
|
|
|
|
) -> Response:
|
|
|
|
|
await service.logout(payload.refresh_token)
|
|
|
|
|
return Response(status_code=204)
|
2026-02-25 10:20:43 +08:00
|
|
|
|
|
|
|
|
|
|
|
|
|
@router.get("/users/by-email", response_model=AuthUserByEmailResponse)
|
|
|
|
|
async def get_user_by_email(
|
|
|
|
|
email: str,
|
|
|
|
|
current_user: Annotated[CurrentUser, Depends(get_current_user)],
|
|
|
|
|
service: AuthService = Depends(get_auth_service),
|
|
|
|
|
) -> AuthUserByEmailResponse:
|
|
|
|
|
if current_user.role != "service_role" and current_user.email != email:
|
|
|
|
|
raise HTTPException(status_code=403, detail="Forbidden")
|
|
|
|
|
return await service.get_user_by_email(email)
|