11import logging
2+ from typing import List
3+ from uuid import UUID
24
35import firebase_admin .auth
46from fastapi import HTTPException
1012 SignUpMethod ,
1113 UserCreateRequest ,
1214 UserCreateResponse ,
15+ UserResponse ,
1316 UserRole ,
17+ UserUpdateRequest ,
1418)
1519from app .utilities .constants import LOGGER_NAME
1620
@@ -79,10 +83,38 @@ async def create_user(self, user: UserCreateRequest) -> UserCreateResponse:
7983 raise HTTPException (status_code = 500 , detail = str (e ))
8084
8185 def delete_user_by_email (self , email : str ):
82- pass
86+ try :
87+ db_user = self .db .query (User ).filter (User .email == email ).first ()
88+ if not db_user :
89+ raise HTTPException (status_code = 404 , detail = "User not found" )
90+
91+ self .db .delete (db_user )
92+ self .db .commit ()
8393
94+ except HTTPException :
95+ raise
96+ except Exception as e :
97+ self .db .rollback ()
98+ self .logger .error (f"Error deleting user with email { email } : { str (e )} " )
99+ raise HTTPException (status_code = 500 , detail = str (e ))
100+
84101 def delete_user_by_id (self , user_id : str ):
85- pass
102+ try :
103+ db_user = self .db .query (User ).filter (User .id == UUID (user_id )).first ()
104+ if not db_user :
105+ raise HTTPException (status_code = 404 , detail = "User not found" )
106+
107+ self .db .delete (db_user )
108+ self .db .commit ()
109+
110+ except ValueError :
111+ raise HTTPException (status_code = 400 , detail = "Invalid user ID format" )
112+ except HTTPException :
113+ raise
114+ except Exception as e :
115+ self .db .rollback ()
116+ self .logger .error (f"Error deleting user { user_id } : { str (e )} " )
117+ raise HTTPException (status_code = 500 , detail = str (e ))
86118
87119 def get_user_id_by_auth_id (self , auth_id : str ) -> str :
88120 """Get user ID for a user by their Firebase auth_id"""
@@ -97,8 +129,19 @@ def get_user_by_email(self, email: str):
97129 raise ValueError (f"User with email { email } not found" )
98130 return user
99131
100- def get_user_by_id (self , user_id : str ):
101- pass
132+ def get_user_by_id (self , user_id : str ) -> UserResponse :
133+ try :
134+ user = self .db .query (User ).join (Role ).filter (User .id == UUID (user_id )).first ()
135+ if not user :
136+ raise HTTPException (status_code = 404 , detail = "User not found" )
137+ return UserResponse .model_validate (user )
138+ except ValueError :
139+ raise HTTPException (status_code = 400 , detail = "Invalid user ID format" )
140+ except HTTPException :
141+ raise
142+ except Exception as e :
143+ self .logger .error (f"Error retrieving user { user_id } : { str (e )} " )
144+ raise HTTPException (status_code = 500 , detail = str (e ))
102145
103146 def get_auth_id_by_user_id (self , user_id : str ) -> str :
104147 """Get Firebase auth_id for a user"""
@@ -114,8 +157,42 @@ def get_user_role_by_auth_id(self, auth_id: str) -> str:
114157 raise ValueError (f"User with auth_id { auth_id } not found" )
115158 return user .role .name
116159
117- def get_users (self ):
118- pass
160+ def get_users (self ) -> List [UserResponse ]:
161+ try :
162+ users = self .db .query (User ).join (Role ).all ()
163+ return [UserResponse .model_validate (user ) for user in users ]
164+ except Exception as e :
165+ self .logger .error (f"Error retrieving users: { str (e )} " )
166+ raise HTTPException (status_code = 500 , detail = str (e ))
167+
168+ def update_user_by_id (self , user_id : str , user_update : UserUpdateRequest ) -> UserResponse :
169+ try :
170+ db_user = self .db .query (User ).filter (User .id == UUID (user_id )).first ()
171+ if not db_user :
172+ raise HTTPException (status_code = 404 , detail = "User not found" )
173+
174+ # update provided fields only
175+ update_data = user_update .model_dump (exclude_unset = True )
176+
177+ # handle role conversion if role is being updated
178+ if "role" in update_data :
179+ update_data ["role_id" ] = UserRole .to_role_id (update_data .pop ("role" ))
119180
120- def update_user_by_id (self , user_id : str , user ):
121- pass
181+ for field , value in update_data .items ():
182+ setattr (db_user , field , value )
183+
184+ self .db .commit ()
185+ self .db .refresh (db_user )
186+
187+ # return user with role information
188+ updated_user = self .db .query (User ).join (Role ).filter (User .id == UUID (user_id )).first ()
189+ return UserResponse .model_validate (updated_user )
190+
191+ except ValueError :
192+ raise HTTPException (status_code = 400 , detail = "Invalid user ID format" )
193+ except HTTPException :
194+ raise
195+ except Exception as e :
196+ self .db .rollback ()
197+ self .logger .error (f"Error updating user { user_id } : { str (e )} " )
198+ raise HTTPException (status_code = 500 , detail = str (e ))
0 commit comments