11from datetime import datetime , timedelta , timezone
2- from typing import Dict , Union
32from uuid import uuid4
43
54from dishka import FromDishka
1211from app .core .utils import get_client_ip
1312from app .db .repositories import UserRepository
1413from app .domain .user import User as DomainAdminUser
15- from app .schemas_pydantic .user import UserCreate , UserResponse
14+ from app .schemas_pydantic .user import (
15+ LoginResponse ,
16+ MessageResponse ,
17+ TokenValidationResponse ,
18+ UserCreate ,
19+ UserResponse ,
20+ )
1621from app .services .auth_service import AuthService
1722from app .settings import get_settings
1823
2126 route_class = DishkaRoute )
2227
2328
24- @router .post ("/login" )
29+ @router .post ("/login" , response_model = LoginResponse )
2530async def login (
2631 request : Request ,
2732 response : Response ,
2833 user_repo : FromDishka [UserRepository ],
2934 form_data : OAuth2PasswordRequestForm = Depends (),
30- ) -> Dict [ str , str ] :
35+ ) -> LoginResponse :
3136 logger .info (
3237 "Login attempt" ,
3338 extra = {
@@ -112,14 +117,12 @@ async def login(
112117 response .headers ["Cache-Control" ] = "no-store"
113118 response .headers ["Pragma" ] = "no-cache"
114119
115- # Return minimal authentication response
116- # Detailed user info should be fetched from GET /me endpoint
117- return {
118- "message" : "Login successful" ,
119- "username" : user .username ,
120- "role" : "admin" if user .is_superuser else "user" , # Coarse-grained role
121- "csrf_token" : csrf_token
122- }
120+ return LoginResponse (
121+ message = "Login successful" ,
122+ username = user .username ,
123+ role = "admin" if user .is_superuser else "user" ,
124+ csrf_token = csrf_token
125+ )
123126
124127
125128@router .post ("/register" , response_model = UserResponse )
@@ -224,11 +227,11 @@ async def get_current_user_profile(
224227 return current_user
225228
226229
227- @router .get ("/verify-token" )
230+ @router .get ("/verify-token" , response_model = TokenValidationResponse )
228231async def verify_token (
229232 request : Request ,
230233 auth_service : FromDishka [AuthService ],
231- ) -> Dict [ str , Union [ str , bool ]] :
234+ ) -> TokenValidationResponse :
232235 current_user = await auth_service .get_current_user (request )
233236 logger .info (
234237 "Token verification attempt" ,
@@ -249,15 +252,14 @@ async def verify_token(
249252 "user_agent" : request .headers .get ("user-agent" ),
250253 },
251254 )
252- # Return existing CSRF token from cookie
253255 csrf_token = request .cookies .get ("csrf_token" , "" )
254256
255- return {
256- " valid" : True ,
257- " username" : current_user .username ,
258- " role" : " admin" if current_user .is_superuser else "user" , # Coarse-grained role
259- " csrf_token" : csrf_token
260- }
257+ return TokenValidationResponse (
258+ valid = True ,
259+ username = current_user .username ,
260+ role = " admin" if current_user .is_superuser else "user" ,
261+ csrf_token = csrf_token
262+ )
261263
262264 except Exception as e :
263265 logger .error (
@@ -278,11 +280,11 @@ async def verify_token(
278280
279281
280282
281- @router .post ("/logout" )
283+ @router .post ("/logout" , response_model = MessageResponse )
282284async def logout (
283285 request : Request ,
284286 response : Response ,
285- ) -> Dict [ str , str ] :
287+ ) -> MessageResponse :
286288 logger .info (
287289 "Logout attempt" ,
288290 extra = {
@@ -312,4 +314,4 @@ async def logout(
312314 },
313315 )
314316
315- return { " message" : " Logout successful"}
317+ return MessageResponse ( message = " Logout successful")
0 commit comments