44from fastapi import APIRouter , Depends , HTTPException
55from sqlmodel import col , delete , func , select
66
7- from app import crud
7+ from app . service . user_service import UserService
88from app .api .deps import (
99 CurrentUser ,
1010 SessionDep ,
1111 get_current_active_superuser ,
1212)
1313from app .core .config import settings
1414from app .core .security import get_password_hash , verify_password
15- from app .models import (
16- Item ,
17- Message ,
15+ from app .models import Message
16+ from app . utils import generate_new_account_email , send_email
17+ from app . model . users import (
1818 UpdatePassword ,
1919 User ,
2020 UserCreate ,
2121 UserPublic ,
2222 UserRegister ,
23- UsersPublic ,
2423 UserUpdate ,
2524 UserUpdateMe ,
25+ UsersPublic ,
2626)
27- from app .utils import generate_new_account_email , send_email
27+ from app .model . items import Item
2828
2929router = APIRouter (prefix = "/users" , tags = ["users" ])
3030
@@ -38,14 +38,9 @@ def read_users(session: SessionDep, skip: int = 0, limit: int = 100) -> Any:
3838 """
3939 Retrieve users.
4040 """
41-
42- count_statement = select (func .count ()).select_from (User )
43- count = session .exec (count_statement ).one ()
44-
45- statement = select (User ).offset (skip ).limit (limit )
46- users = session .exec (statement ).all ()
47-
48- return UsersPublic (data = users , count = count )
41+ user_service = UserService (session )
42+ result = user_service .get_users (skip = skip , limit = limit )
43+ return UsersPublic (data = result ["data" ], count = result ["count" ])
4944
5045
5146@router .post (
@@ -55,14 +50,15 @@ def create_user(*, session: SessionDep, user_in: UserCreate) -> Any:
5550 """
5651 Create new user.
5752 """
58- user = crud .get_user_by_email (session = session , email = user_in .email )
53+ user_service = UserService (session )
54+ user = user_service .get_user_by_email (email = user_in .email )
5955 if user :
6056 raise HTTPException (
6157 status_code = 400 ,
6258 detail = "The user with this email already exists in the system." ,
6359 )
6460
65- user = crud .create_user (session = session , user_create = user_in )
61+ user = user_service .create_user (user_in )
6662 if settings .emails_enabled and user_in .email :
6763 email_data = generate_new_account_email (
6864 email_to = user_in .email , username = user_in .email , password = user_in .password
@@ -82,19 +78,11 @@ def update_user_me(
8278 """
8379 Update own user.
8480 """
85-
86- if user_in .email :
87- existing_user = crud .get_user_by_email (session = session , email = user_in .email )
88- if existing_user and existing_user .id != current_user .id :
89- raise HTTPException (
90- status_code = 409 , detail = "User with this email already exists"
91- )
92- user_data = user_in .model_dump (exclude_unset = True )
93- current_user .sqlmodel_update (user_data )
94- session .add (current_user )
95- session .commit ()
96- session .refresh (current_user )
97- return current_user
81+ user_service = UserService (session )
82+ try :
83+ return user_service .update_user_me (current_user , user_in )
84+ except ValueError as e :
85+ raise HTTPException (status_code = 409 , detail = str (e ))
9886
9987
10088@router .patch ("/me/password" , response_model = Message )
@@ -104,18 +92,16 @@ def update_password_me(
10492 """
10593 Update own password.
10694 """
107- if not verify_password (body .current_password , current_user .hashed_password ):
108- raise HTTPException (status_code = 400 , detail = "Incorrect password" )
109- if body .current_password == body .new_password :
110- raise HTTPException (
111- status_code = 400 , detail = "New password cannot be the same as the current one"
95+ user_service = UserService (session )
96+ try :
97+ user_service .update_password (
98+ current_user ,
99+ body .current_password ,
100+ body .new_password
112101 )
113- hashed_password = get_password_hash (body .new_password )
114- current_user .hashed_password = hashed_password
115- session .add (current_user )
116- session .commit ()
117- return Message (message = "Password updated successfully" )
118-
102+ return Message (message = "Password updated successfully" )
103+ except ValueError as e :
104+ raise HTTPException (status_code = 400 , detail = str (e ))
119105
120106@router .get ("/me" , response_model = UserPublic )
121107def read_user_me (current_user : CurrentUser ) -> Any :
@@ -130,30 +116,33 @@ def delete_user_me(session: SessionDep, current_user: CurrentUser) -> Any:
130116 """
131117 Delete own user.
132118 """
133- if current_user .is_superuser :
134- raise HTTPException (
135- status_code = 403 , detail = "Super users are not allowed to delete themselves"
119+
120+ user_service = UserService (session )
121+ try :
122+ user_service .delete_user (
123+ str (current_user .id ),
124+ str (current_user .id ),
125+ current_user .is_superuser
136126 )
137- statement = delete (Item ).where (col (Item .owner_id ) == current_user .id )
138- session .exec (statement ) # type: ignore
139- session .delete (current_user )
140- session .commit ()
141- return Message (message = "User deleted successfully" )
127+ return Message (message = "User deleted successfully" )
128+ except ValueError as e :
129+ raise HTTPException (status_code = 403 , detail = str (e ))
142130
143131
144132@router .post ("/signup" , response_model = UserPublic )
145133def register_user (session : SessionDep , user_in : UserRegister ) -> Any :
146134 """
147135 Create new user without the need to be logged in.
148136 """
149- user = crud .get_user_by_email (session = session , email = user_in .email )
137+ user_service = UserService (session )
138+ user = user_service .get_user_by_email (email = user_in .email )
150139 if user :
151140 raise HTTPException (
152141 status_code = 400 ,
153142 detail = "The user with this email already exists in the system" ,
154143 )
155144 user_create = UserCreate .model_validate (user_in )
156- user = crud .create_user (session = session , user_create = user_create )
145+ user = user_service .create_user (user_create )
157146 return user
158147
159148
@@ -164,7 +153,10 @@ def read_user_by_id(
164153 """
165154 Get a specific user by id.
166155 """
167- user = session .get (User , user_id )
156+ user_service = UserService (session )
157+ user = user_service .get_user_by_id (str (user_id ))
158+ if not user :
159+ raise HTTPException (status_code = 404 , detail = "User not found" )
168160 if user == current_user :
169161 return user
170162 if not current_user .is_superuser :
@@ -189,22 +181,14 @@ def update_user(
189181 """
190182 Update a user.
191183 """
192-
193- db_user = session . get ( User , user_id )
184+ user_service = UserService ( session )
185+ db_user = user_service . get_user_by_id ( str ( user_id ) )
194186 if not db_user :
195187 raise HTTPException (
196188 status_code = 404 ,
197189 detail = "The user with this id does not exist in the system" ,
198190 )
199- if user_in .email :
200- existing_user = crud .get_user_by_email (session = session , email = user_in .email )
201- if existing_user and existing_user .id != user_id :
202- raise HTTPException (
203- status_code = 409 , detail = "User with this email already exists"
204- )
205-
206- db_user = crud .update_user (session = session , db_user = db_user , user_in = user_in )
207- return db_user
191+ return user_service .update_user (db_user = db_user , user_in = user_in )
208192
209193
210194@router .delete ("/{user_id}" , dependencies = [Depends (get_current_active_superuser )])
@@ -214,15 +198,13 @@ def delete_user(
214198 """
215199 Delete a user.
216200 """
217- user = session . get ( User , user_id )
218- if not user :
219- raise HTTPException ( status_code = 404 , detail = "User not found" )
220- if user == current_user :
221- raise HTTPException (
222- status_code = 403 , detail = "Super users are not allowed to delete themselves"
201+ user_service = UserService ( session )
202+ try :
203+ user_service . delete_user (
204+ str ( user_id ),
205+ str ( current_user . id ),
206+ current_user . is_superuser
223207 )
224- statement = delete (Item ).where (col (Item .owner_id ) == user_id )
225- session .exec (statement ) # type: ignore
226- session .delete (user )
227- session .commit ()
228- return Message (message = "User deleted successfully" )
208+ return Message (message = "User deleted successfully" )
209+ except ValueError as e :
210+ raise HTTPException (status_code = 403 , detail = str (e ))
0 commit comments