2929 response_model = TokenOut ,
3030 status_code = status .HTTP_201_CREATED ,
3131 dependencies = [Depends (ensure_not_demo )],
32+ summary = "Create user account" ,
33+ description = "Register a new user account with email and password. Returns authentication token." ,
34+ responses = {
35+ 201 : {"description" : "User created successfully" },
36+ 400 : {"description" : "User already exists or validation error" },
37+ },
3238)
3339def signup (user_in : UserCreate , db : Session = Depends (get_db )):
3440 user = service .create_user (db , user_in )
3541 token = create_access_token ({"sub" : user .email })
3642 return {"access_token" : token , "token_type" : "bearer" }
3743
3844
39- @router .post ("/login" , response_model = TokenOut )
45+ @router .post (
46+ "/login" ,
47+ response_model = TokenOut ,
48+ summary = "Login with email and password" ,
49+ description = "Authenticate user with email and password credentials. Returns authentication token." ,
50+ responses = {
51+ 200 : {"description" : "Login successful" },
52+ 401 : {"description" : "Invalid credentials" },
53+ },
54+ )
4055def login (user_in : UserLogin , db : Session = Depends (get_db )):
4156 user = crud .get_user_by_email (db , user_in .email )
4257 if (
@@ -51,20 +66,47 @@ def login(user_in: UserLogin, db: Session = Depends(get_db)):
5166 return {"access_token" : token , "token_type" : "bearer" }
5267
5368
54- @router .post ("/oauth" , response_model = TokenOut , dependencies = [Depends (ensure_not_demo )])
69+ @router .post (
70+ "/oauth" ,
71+ response_model = TokenOut ,
72+ dependencies = [Depends (ensure_not_demo )],
73+ summary = "OAuth login" ,
74+ description = "Authenticate user with OAuth provider (GitHub, Google). Creates account if it doesn't exist." ,
75+ responses = {
76+ 200 : {"description" : "OAuth login successful" },
77+ 400 : {"description" : "Invalid OAuth payload" },
78+ },
79+ )
5580def login_oauth (payload : OAuthLogin , db : Session = Depends (get_db )):
5681 email = oauth .get_email_from_oauth (payload )
5782 user = service .get_or_create_oauth_user (db , email = email , provider = payload .provider )
5883 token = create_access_token ({"sub" : user .email })
5984 return {"access_token" : token , "token_type" : "bearer" }
6085
6186
62- @router .get ("/me" , response_model = schemas .UserOut )
87+ @router .get (
88+ "/me" ,
89+ response_model = schemas .UserOut ,
90+ summary = "Get current user" ,
91+ description = "Get details of the currently authenticated user." ,
92+ responses = {
93+ 200 : {"description" : "User details returned" },
94+ 401 : {"description" : "Not authenticated" },
95+ },
96+ )
6397def read_current_user (current_user : User = Depends (get_current_user )):
6498 return current_user
6599
66100
67- @router .post ("/token" )
101+ @router .post (
102+ "/token" ,
103+ summary = "Get access token (OAuth2 compatible)" ,
104+ description = "OAuth2 compatible token endpoint for form-based authentication." ,
105+ responses = {
106+ 200 : {"description" : "Token generated successfully" },
107+ 400 : {"description" : "Invalid credentials" },
108+ },
109+ )
68110def login_for_access_token (
69111 form_data : OAuth2PasswordRequestForm = Depends (),
70112 db : Session = Depends (get_db ),
@@ -79,11 +121,22 @@ def login_for_access_token(
79121 return {"access_token" : token , "token_type" : "bearer" }
80122
81123
82- @router .get ("/oauth/init/{provider}" , dependencies = [Depends (ensure_not_demo )])
124+ @router .get (
125+ "/oauth/init/{provider}" ,
126+ dependencies = [Depends (ensure_not_demo )],
127+ summary = "Start OAuth flow" ,
128+ description = "Initiate OAuth authentication with GitHub or Google. Redirects to provider." ,
129+ responses = {
130+ 302 : {"description" : "Redirect to OAuth provider" },
131+ 400 : {"description" : "Invalid provider" },
132+ },
133+ )
83134def start_oauth_login (
84135 provider : ProviderName ,
85136 request : Request ,
86- redirect : str = Query ("/events" ),
137+ redirect : str = Query (
138+ "/events" , description = "Where to redirect after successful login"
139+ ),
87140):
88141 redirect_uri = request .url_for ("oauth_callback" )
89142
@@ -98,10 +151,20 @@ def start_oauth_login(
98151
99152
100153@router .get (
101- "/oauth/callback" , name = "oauth_callback" , dependencies = [Depends (ensure_not_demo )]
154+ "/oauth/callback" ,
155+ name = "oauth_callback" ,
156+ dependencies = [Depends (ensure_not_demo )],
157+ summary = "OAuth callback" ,
158+ description = "Handle OAuth provider callback. Internal endpoint used by OAuth flow." ,
159+ responses = {
160+ 302 : {"description" : "Redirect to frontend with auth code" },
161+ 400 : {"description" : "Invalid callback parameters" },
162+ },
102163)
103164def handle_oauth_callback (
104- code : str = Query (...), state : str = Query (...), settings = Depends (get_settings )
165+ code : str = Query (..., description = "OAuth authorization code from provider" ),
166+ state : str = Query (..., description = "OAuth state parameter" ),
167+ settings = Depends (get_settings ),
105168):
106169 try :
107170 decoded = json .loads (base64 .b64decode (state ).decode ())
@@ -116,6 +179,12 @@ def handle_oauth_callback(
116179 return RedirectResponse (url = final_url )
117180
118181
119- @router .get ("/providers" , tags = ["auth" ])
182+ @router .get (
183+ "/providers" ,
184+ tags = ["auth" ],
185+ summary = "List OAuth providers" ,
186+ description = "Get list of available OAuth authentication providers." ,
187+ responses = {200 : {"description" : "List of available OAuth providers" }},
188+ )
120189def list_oauth_providers (settings = Depends (get_settings )):
121190 return {"providers" : settings .available_oauth_providers }
0 commit comments