优化鉴权系统
This commit is contained in:
@@ -4,6 +4,10 @@ from auth import CurrentUser
|
||||
from schemas import (
|
||||
CreateSessionRequest,
|
||||
CreateSessionResponse,
|
||||
LoginRequest,
|
||||
LoginResponse,
|
||||
RegisterRequest,
|
||||
RegisterResponse,
|
||||
SendMessageRequest,
|
||||
SendMessageResponse,
|
||||
SessionHistoryResponse,
|
||||
@@ -11,6 +15,12 @@ from schemas import (
|
||||
)
|
||||
from service import ChatProviderError, ChatService
|
||||
from storage import SessionNotFoundError, SessionStorageError
|
||||
from users import (
|
||||
InvalidCredentialsError,
|
||||
UserStore,
|
||||
UserStoreError,
|
||||
UsernameExistsError,
|
||||
)
|
||||
|
||||
|
||||
router = APIRouter()
|
||||
@@ -20,6 +30,55 @@ def get_chat_service(request: Request) -> ChatService:
|
||||
return request.app.state.chat_service
|
||||
|
||||
|
||||
def get_user_store(request: Request) -> UserStore:
|
||||
return request.app.state.user_store
|
||||
|
||||
|
||||
@router.post(
|
||||
"/auth/register",
|
||||
response_model=RegisterResponse,
|
||||
status_code=status.HTTP_201_CREATED,
|
||||
tags=["auth"],
|
||||
)
|
||||
async def register(
|
||||
body: RegisterRequest,
|
||||
request: Request,
|
||||
) -> RegisterResponse:
|
||||
store = get_user_store(request)
|
||||
try:
|
||||
user = await store.register(body.username, body.password)
|
||||
except UsernameExistsError as exc:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_409_CONFLICT,
|
||||
detail="username already exists",
|
||||
) from exc
|
||||
except UserStoreError as exc:
|
||||
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
||||
return RegisterResponse(user_id=user.user_id, created_at=user.created_at)
|
||||
|
||||
|
||||
@router.post(
|
||||
"/auth/login",
|
||||
response_model=LoginResponse,
|
||||
tags=["auth"],
|
||||
)
|
||||
async def login(
|
||||
body: LoginRequest,
|
||||
request: Request,
|
||||
) -> LoginResponse:
|
||||
store = get_user_store(request)
|
||||
try:
|
||||
user = await store.login(body.username, body.password)
|
||||
except InvalidCredentialsError as exc:
|
||||
raise HTTPException(
|
||||
status_code=status.HTTP_401_UNAUTHORIZED,
|
||||
detail="invalid username or password",
|
||||
) from exc
|
||||
except UserStoreError as exc:
|
||||
raise HTTPException(status_code=500, detail=str(exc)) from exc
|
||||
return LoginResponse(user_id=user.user_id, api_key=user.api_key)
|
||||
|
||||
|
||||
@router.post(
|
||||
"/sessions",
|
||||
response_model=CreateSessionResponse,
|
||||
@@ -89,4 +148,4 @@ async def get_current_user_usage(
|
||||
request: Request,
|
||||
user: CurrentUser,
|
||||
) -> UserUsageResponse:
|
||||
return await get_chat_service(request).get_user_usage(user.user_id)
|
||||
return await get_chat_service(request).get_user_usage(user.user_id)
|
||||
Reference in New Issue
Block a user