1
+ from fastapi import APIRouter , HTTPException , Depends , status
2
+ from fastapi .responses import JSONResponse
3
+ from fastapi .encoders import jsonable_encoder
4
+
5
+ from .schemas .user import UserCreate , User , UserLogin , Token
6
+ from services .user import user_service
7
+ from dependencies .auth import create_access_token , get_current_user
8
+
9
+ router = APIRouter (prefix = "/api/v1/users" , tags = ["Users" ])
10
+
11
+ @router .post ("/register" , response_model = User )
12
+ async def register_user (request : UserCreate ):
13
+ """
14
+ Registers a new user.
15
+ """
16
+ try :
17
+ user = await user_service .create_user (request )
18
+ return JSONResponse (status_code = status .HTTP_201_CREATED , content = jsonable_encoder (user ))
19
+ except Exception as e :
20
+ raise HTTPException (status_code = status .HTTP_400_BAD_REQUEST , detail = f"Error registering user: { str (e )} " )
21
+
22
+ @router .post ("/login" , response_model = Token )
23
+ async def login_user (request : UserLogin ):
24
+ """
25
+ Logs in a user and generates an access token.
26
+ """
27
+ try :
28
+ user = await user_service .authenticate_user (request )
29
+ access_token = create_access_token (data = {"sub" : user .id })
30
+ return JSONResponse (status_code = status .HTTP_200_OK , content = jsonable_encoder ({"access_token" : access_token , "token_type" : "bearer" }))
31
+ except Exception as e :
32
+ raise HTTPException (status_code = status .HTTP_401_UNAUTHORIZED , detail = f"Invalid credentials: { str (e )} " )
33
+
34
+ @router .get ("/me" , response_model = User )
35
+ async def get_current_user (current_user : User = Depends (get_current_user )):
36
+ """
37
+ Retrieves the current user's information.
38
+ """
39
+ try :
40
+ user = await user_service .get_user_by_id (current_user .id )
41
+ return JSONResponse (status_code = status .HTTP_200_OK , content = jsonable_encoder (user ))
42
+ except Exception as e :
43
+ raise HTTPException (status_code = status .HTTP_500_INTERNAL_SERVER_ERROR , detail = f"Error retrieving user: { str (e )} " )
0 commit comments