22import app .schemas as schemas , app .enums as enums
33from app .db import models
44from app .core import auth
5- from sqlalchemy .orm import Session
6- from app .db import get_db
5+ from app .db import get_async_session
76from app .core .user import delete_user
87from app .core .smtp import EmailSender
8+ from sqlalchemy .ext .asyncio import AsyncSession
9+ from sqlalchemy import select
910
1011router = APIRouter (tags = ["admin" ], prefix = "/admin" )
1112
1213
1314@router .get ("/users" , response_model = list [schemas .User ])
14- def get_users_list (
15- db : Session = Depends (get_db ), admin : models .User = Depends (auth .is_user_admin )
15+ async def get_users_list (
16+ session : AsyncSession = Depends (get_async_session ),
17+ _ : models .User = Depends (auth .is_user_admin ),
1618):
17- return db .query (models .User ).all ()
19+ stmt = select (models .User )
20+ result = await session .execute (stmt )
21+ return result .scalars ().all ()
1822
1923
2024@router .delete ("/users/{user_id}" )
21- def admin_delete_user (
25+ async def admin_delete_user (
2226 user_id : int ,
23- db : Session = Depends (get_db ),
27+ session : AsyncSession = Depends (get_async_session ),
2428 admin : models .User = Depends (auth .is_user_admin ),
2529):
2630 if user_id == admin .id :
2731 raise HTTPException (
2832 403 , "Admin cannot delete his own account with this function."
2933 )
3034
31- user = db .query (models .User ).filter_by (id = user_id ).first ()
35+ stmt = select (models .User ).where (models .User .id == user_id ).limit (1 )
36+ result = await session .execute (stmt )
37+ user = result .scalar_one_or_none ()
38+
3239 if not user :
3340 raise HTTPException (404 , "User not found" )
3441
35- return delete_user (db , user )
42+ if (
43+ admin .role_code == enums .EUserRole .ADMIN
44+ and user .role_code == enums .EUserRole .ADMIN
45+ ):
46+ raise HTTPException (403 , "Admin cannot delete admin." )
47+
48+ return await delete_user (session , user )
3649
3750
3851@router .put (
3952 "/users/role" , description = "Change the user role. Only owner can change roles."
4053)
41- def owner_change_user_role (
54+ async def owner_change_user_role (
4255 user_id : int ,
4356 role_code : enums .EUserRole ,
44- db : Session = Depends (get_db ),
45- admin : models .User = Depends (auth .is_user_owner ),
57+ session : AsyncSession = Depends (get_async_session ),
58+ owner : models .User = Depends (auth .is_user_owner ),
4659):
60+ owner_assign_error = HTTPException (403 , "Owner role cannot be reassigned." )
61+
4762 if role_code == enums .EUserRole .OWNER :
48- raise HTTPException ( 403 , "Owner role cannot be assigned." )
63+ raise owner_assign_error
4964
50- if user_id == admin .id :
51- raise HTTPException (403 , "Owner cannot change his own role." )
65+ if user_id == owner .id :
66+ raise owner_assign_error
67+
68+ stmt = select (models .User ).where (models .User .id == user_id ).limit (1 )
69+ result = await session .execute (stmt )
70+ user = result .scalar_one_or_none ()
5271
53- user = db .query (models .User ).filter_by (id = user_id ).first ()
5472 if not user :
5573 raise HTTPException (404 , "User not found" )
5674
57- if user .role_code == enums .EUserRole .OWNER :
58- raise HTTPException (403 , "Owner role cannot be reassigned." )
59-
6075 user .role_code = role_code
61- db .commit ()
76+ await session .commit ()
77+ await session .refresh (user )
78+ return {"detail" : "User role has been changed" }
6279
6380
6481@router .get ("/settings" , response_model = schemas .GetSettingsRequest )
65- def get_system_settings (
66- db : Session = Depends (get_db ), admin : models .User = Depends (auth .is_user_admin )
82+ async def get_system_settings (
83+ session : AsyncSession = Depends (get_async_session ),
84+ _ : models .User = Depends (auth .is_user_admin ),
6785):
68- settings = db .query (models .Setting ).all ()
69- result = []
86+ stmt = select (models .Setting )
87+ result = await session .execute (stmt )
88+ settings = result .scalars ()
89+ res = []
7090 for s in settings :
7191 val = s .value
7292 try :
@@ -79,7 +99,7 @@ def get_system_settings(
7999 except Exception :
80100 pass
81101
82- result .append (
102+ res .append (
83103 {
84104 "key" : s .key ,
85105 "value" : val ,
@@ -88,17 +108,19 @@ def get_system_settings(
88108 }
89109 )
90110
91- return result
111+ return res
92112
93113
94114@router .patch ("/settings" )
95- def change_system_settings (
115+ async def change_system_settings (
96116 request : list [schemas .PatchSettingsRequestItem ],
97- db : Session = Depends (get_db ),
98- admin : models .User = Depends (auth .is_user_admin ),
117+ session : AsyncSession = Depends (get_async_session ),
118+ _ : models .User = Depends (auth .is_user_admin ),
99119):
100120 for s in request :
101- setting = db .query (models .Setting ).filter_by (key = s .key ).first ()
121+ stmt = select (models .Setting ).where (models .Setting .key == s .key ).limit (1 )
122+ result = await session .execute (stmt )
123+ setting = result .scalar_one_or_none ()
102124 if not setting :
103125 raise HTTPException (status_code = 404 , detail = f"Setting '{ s .key } ' not found" )
104126 if setting .value_type != type (s .value ).__name__ :
@@ -108,17 +130,17 @@ def change_system_settings(
108130
109131 setting .value = str (s .value )
110132
111- db .commit ()
133+ await session .commit ()
112134 return {"status" : "updated" , "count" : len (request )}
113135
114136
115137@router .get ("/smtp/status" , response_model = bool )
116- def get_smtp_status (_ : models .User = Depends (auth .is_user_admin )):
138+ async def get_smtp_status (_ : models .User = Depends (auth .is_user_admin )):
117139 return EmailSender .status ()
118140
119141
120142@router .post ("/smtp/test" )
121- def send_test_email (admin : models .User = Depends (auth .is_user_admin )):
143+ async def send_test_email (admin : models .User = Depends (auth .is_user_admin )):
122144 EmailSender .send_email (
123145 admin .email ,
124146 "Test email from Cardholder PWA" ,
0 commit comments