77from typing import Optional , Dict , Any
88from services .auth import get_auth_service
99from middleware .auth import get_current_user
10+ from services .observability import (
11+ logger ,
12+ capture_exception ,
13+ track_time ,
14+ add_breadcrumb ,
15+ set_operation_context
16+ )
1017
1118# Create router
1219router = APIRouter (prefix = "/auth" , tags = ["Authentication" ])
@@ -45,12 +52,31 @@ async def signup(request: SignupRequest):
4552
4653 Returns user data and session tokens (access_token, refresh_token)
4754 """
48- auth_service = get_auth_service ()
49- return await auth_service .signup (
50- email = request .email ,
51- password = request .password ,
52- github_username = request .github_username
53- )
55+ set_operation_context ("auth_signup" , email = request .email )
56+ add_breadcrumb ("Signup attempt" , category = "auth" , email = request .email )
57+
58+ logger .info ("Signup attempt" , email = request .email , has_github = bool (request .github_username ))
59+
60+ try :
61+ auth_service = get_auth_service ()
62+
63+ with track_time ("auth_signup" ):
64+ result = await auth_service .signup (
65+ email = request .email ,
66+ password = request .password ,
67+ github_username = request .github_username
68+ )
69+
70+ logger .info ("Signup successful" , email = request .email )
71+ return result
72+
73+ except HTTPException :
74+ logger .warning ("Signup failed (client error)" , email = request .email )
75+ raise
76+ except Exception as e :
77+ logger .error ("Signup failed" , email = request .email , error = str (e ))
78+ capture_exception (e , operation = "auth_signup" , email = request .email )
79+ raise HTTPException (status_code = 500 , detail = "Signup failed" )
5480
5581
5682@router .post ("/login" , response_model = AuthResponse )
@@ -63,11 +89,30 @@ async def login(request: LoginRequest):
6389
6490 Returns user data and session tokens
6591 """
66- auth_service = get_auth_service ()
67- return await auth_service .login (
68- email = request .email ,
69- password = request .password
70- )
92+ set_operation_context ("auth_login" , email = request .email )
93+ add_breadcrumb ("Login attempt" , category = "auth" , email = request .email )
94+
95+ logger .info ("Login attempt" , email = request .email )
96+
97+ try :
98+ auth_service = get_auth_service ()
99+
100+ with track_time ("auth_login" ):
101+ result = await auth_service .login (
102+ email = request .email ,
103+ password = request .password
104+ )
105+
106+ logger .info ("Login successful" , email = request .email )
107+ return result
108+
109+ except HTTPException :
110+ logger .warning ("Login failed (invalid credentials)" , email = request .email )
111+ raise
112+ except Exception as e :
113+ logger .error ("Login failed" , email = request .email , error = str (e ))
114+ capture_exception (e , operation = "auth_login" , email = request .email )
115+ raise HTTPException (status_code = 500 , detail = "Login failed" )
71116
72117
73118@router .post ("/refresh" )
@@ -79,8 +124,27 @@ async def refresh(request: RefreshRequest):
79124
80125 Returns new access token
81126 """
82- auth_service = get_auth_service ()
83- return await auth_service .refresh_session (request .refresh_token )
127+ set_operation_context ("auth_refresh" )
128+ add_breadcrumb ("Token refresh attempt" , category = "auth" )
129+
130+ logger .debug ("Token refresh attempt" )
131+
132+ try :
133+ auth_service = get_auth_service ()
134+
135+ with track_time ("auth_refresh" ):
136+ result = await auth_service .refresh_session (request .refresh_token )
137+
138+ logger .debug ("Token refresh successful" )
139+ return result
140+
141+ except HTTPException :
142+ logger .warning ("Token refresh failed (invalid token)" )
143+ raise
144+ except Exception as e :
145+ logger .error ("Token refresh failed" , error = str (e ))
146+ capture_exception (e , operation = "auth_refresh" )
147+ raise HTTPException (status_code = 500 , detail = "Token refresh failed" )
84148
85149
86150@router .post ("/logout" )
@@ -90,8 +154,25 @@ async def logout(user: Dict = Depends(get_current_user)):
90154
91155 Requires: Valid JWT token in Authorization header
92156 """
93- auth_service = get_auth_service ()
94- return await auth_service .logout (token = "" ) # Supabase handles session
157+ user_id = user .get ("id" ) or user .get ("user_id" )
158+ set_operation_context ("auth_logout" , user_id = user_id )
159+ add_breadcrumb ("Logout attempt" , category = "auth" , user_id = user_id )
160+
161+ logger .info ("Logout attempt" , user_id = user_id )
162+
163+ try :
164+ auth_service = get_auth_service ()
165+
166+ with track_time ("auth_logout" ):
167+ result = await auth_service .logout (token = "" ) # Supabase handles session
168+
169+ logger .info ("Logout successful" , user_id = user_id )
170+ return result
171+
172+ except Exception as e :
173+ logger .error ("Logout failed" , user_id = user_id , error = str (e ))
174+ capture_exception (e , operation = "auth_logout" , user_id = user_id )
175+ raise HTTPException (status_code = 500 , detail = "Logout failed" )
95176
96177
97178@router .get ("/me" )
@@ -103,4 +184,9 @@ async def get_current_user_info(user: Dict = Depends(get_current_user)):
103184
104185 Returns user profile data
105186 """
187+ user_id = user .get ("id" ) or user .get ("user_id" )
188+ set_operation_context ("auth_me" , user_id = user_id )
189+
190+ logger .debug ("User info requested" , user_id = user_id )
191+
106192 return {"user" : user }
0 commit comments