1
1
from fastapi import APIRouter , Depends , status
2
2
from fastapi .security import OAuth2PasswordRequestForm
3
- from sqlalchemy import select
4
3
from sqlalchemy .ext .asyncio import AsyncSession
5
4
from sqlalchemy .orm import selectinload
6
5
7
6
from src import errors
8
7
from src ._types import IdResponse , ListT
9
8
from src .auth import schemas
10
- from src .auth .models import Group , Menu , Permission , Role , User
11
- from src .auth .services import GroupDto , MenuDto , RoleDto , UserDto
9
+ from src .auth .models import Group , Menu , Role , User
10
+ from src .auth .services import MenuDto , UserDto
12
11
from src .cbv import cbv
12
+ from src .db .dtobase import DtoBase
13
13
from src .deps import auth , get_session
14
14
from src .exceptions import GenerError
15
15
from src .security import generate_access_token_response
@@ -23,21 +23,21 @@ async def login_pwd(
23
23
user : OAuth2PasswordRequestForm = Depends (),
24
24
session : AsyncSession = Depends (get_session ),
25
25
) -> schemas .AccessToken :
26
- user_dto = UserDto (User )
27
- result = await user_dto .verify_user (session , user )
26
+ dto = UserDto (User )
27
+ result = await dto .verify_user (session , user )
28
28
return generate_access_token_response (result .id )
29
29
30
30
31
31
@cbv (router )
32
32
class UserAPI :
33
33
user : User = Depends (auth )
34
34
session : AsyncSession = Depends (get_session )
35
- user_dto = UserDto (User )
35
+ dto = UserDto (User )
36
36
37
37
@router .post ("/users" , operation_id = "5091fff6-1adc-4a22-8a8c-ef0107122df7" , summary = "创建新用户/Create new user" )
38
38
async def create_user (self , user : schemas .UserCreate ) -> IdResponse :
39
- new_user = await self .user_dto .create (self .session , user )
40
- result = await self .user_dto .commit (self .session , new_user )
39
+ new_user = await self .dto .create (self .session , user )
40
+ result = await self .dto .commit (self .session , new_user )
41
41
return IdResponse (id = result .id )
42
42
43
43
@router .get (
@@ -46,7 +46,7 @@ async def create_user(self, user: schemas.UserCreate) -> IdResponse:
46
46
summary = "获取单个用户/Get user information by ID" ,
47
47
)
48
48
async def get_user (self , id : int ) -> schemas .UserDetail :
49
- db_user = await self .user_dto .get_one_or_404 (
49
+ db_user = await self .dto .get_one_or_404 (
50
50
self .session ,
51
51
id ,
52
52
selectinload (User .role ).load_only (Role .id , Role .name ),
@@ -55,8 +55,8 @@ async def get_user(self, id: int) -> schemas.UserDetail:
55
55
return schemas .UserDetail .model_validate (db_user )
56
56
57
57
@router .get ("/users" , operation_id = "2485e2a2-4d81-4601-a6fd-c633b23ce5fc" )
58
- async def get_users (self , query : schemas .UserQuery = Depends ()) -> ListT [list [ schemas .UserDetail ] ]:
59
- count , results = await self .user_dto .list_and_count (
58
+ async def get_users (self , query : schemas .UserQuery = Depends ()) -> ListT [schemas .UserDetail ]:
59
+ count , results = await self .dto .list_and_count (
60
60
self .session ,
61
61
query ,
62
62
selectinload (User .role ).load_only (Role .id , Role .name ),
@@ -68,129 +68,110 @@ async def get_users(self, query: schemas.UserQuery = Depends()) -> ListT[list[sc
68
68
async def update_user (self , id : int , user : schemas .UserUpdate ) -> IdResponse :
69
69
update_user = user .model_dump (exclude_unset = True )
70
70
if "password" in update_user and update_user ["password" ] is None :
71
- raise GenerError (errors .ERR_10006 , status_code = status .HTTP_406_NOT_ACCEPTABLE )
72
- db_user = await self .user_dto .get_one_or_404 (self .session , id )
73
- await self .user_dto .update (self .session , db_user , user )
71
+ raise GenerError (errors .ERR_10005 , status_code = status .HTTP_406_NOT_ACCEPTABLE )
72
+ db_user = await self .dto .get_one_or_404 (self .session , id )
73
+ await self .dto .update (self .session , db_user , user )
74
74
return IdResponse (id = id )
75
75
76
76
@router .delete ("/users/{id}" , operation_id = "78e48ceb-d7cf-46fe-bf9e-d04958aade7d" )
77
77
async def delete_user (self , id : int ) -> IdResponse :
78
- db_user = await self .user_dto .get_one_or_404 (self .session , id )
79
- await self .user_dto .delete (self .session , db_user )
78
+ db_user = await self .dto .get_one_or_404 (self .session , id )
79
+ await self .dto .delete (self .session , db_user )
80
80
return IdResponse (id = id )
81
81
82
82
83
83
@cbv (router )
84
84
class GroupAPI :
85
85
user : User = Depends (auth )
86
86
session : AsyncSession = Depends (get_session )
87
- group_dto = GroupDto (Group )
87
+ dto = DtoBase (Group )
88
88
89
89
@router .post ("/groups" , operation_id = "9e3e639d-c694-467d-9209-717b038cf267" )
90
90
async def create_group (self , group : schemas .GroupCreate ) -> IdResponse :
91
- if not group .user_ids :
92
- new_group = await self .group_dto .create (self .session , group )
93
- else :
94
- users = (await self .session .scalars (select (User ).where (User .id .in_ (group .user_ids )))).all ()
95
- new_group = await self .group_dto .create_with_users (self .session , group , users )
91
+ new_group = await self .dto .create (self .session , group )
96
92
return IdResponse (id = new_group .id )
97
93
98
94
@router .get ("/groups/{id}" , operation_id = "00327087-9443-4d24-8d04-e396e3244744" )
99
95
async def get_group (self , id : int ) -> schemas .GroupDetail :
100
- db_group = await self .group_dto .get_one_or_404 (self .session , id , undefer_load = True )
96
+ db_group = await self .dto .get_one_or_404 (self .session , id , undefer_load = True )
101
97
return schemas .GroupDetail .model_validate (db_group )
102
98
103
99
@router .get ("/groups" , operation_id = "a1d1f8f1-4d4d-4fab-868b-3f977df26e05" )
104
- async def get_groups (self , query : schemas .GroupQuery = Depends ()) -> ListT [list [ schemas .GroupDetail ] ]:
105
- count , results = await self .group_dto .list_and_count (self .session , query )
100
+ async def get_groups (self , query : schemas .GroupQuery = Depends ()) -> ListT [schemas .GroupDetail ]:
101
+ count , results = await self .dto .list_and_count (self .session , query )
106
102
return ListT (count = count , results = [schemas .GroupDetail .model_validate (r ) for r in results ])
107
103
108
104
@router .put ("/groups/{id}" , operation_id = "3d5badd1-665c-49f8-85c4-6f6d7f3a1b2a" )
109
105
async def update_group (self , id : int , group : schemas .GroupUpdate ) -> IdResponse :
110
- db_group = await self .group_dto .get_one_or_404 (self .session , id , selectinload (Group .user ))
111
- update_group = group .model_dump (exclude_unset = True )
112
- if "user_ids" in update_group :
113
- db_group = await self .group_dto .update_relationship_field (
114
- self .session , db_group , User , "user" , group .user_ids
115
- )
116
- await self .group_dto .update (self .session , db_group , group , excludes = {"user_ids" })
106
+ db_group = await self .dto .get_one_or_404 (self .session , id , selectinload (Group .user ))
107
+ await self .dto .update (self .session , db_group , group )
117
108
return IdResponse (id = id )
118
109
119
110
@router .delete ("/groups/{id}" , operation_id = "e16830da-2973-4369-8e75-da9b4174ab72" )
120
111
async def delete_group (self , id : int ) -> IdResponse :
121
- db_group = await self .group_dto .get_one_or_404 (self .session , id )
122
- await self .group_dto .delete (self .session , db_group )
112
+ db_group = await self .dto .get_one_or_404 (self .session , id )
113
+ await self .dto .delete (self .session , db_group )
123
114
return IdResponse (id = id )
124
115
125
116
126
117
@cbv (router )
127
118
class RoleAPI :
128
119
user : User = Depends (auth )
129
120
session : AsyncSession = Depends (get_session )
130
- role_dto = RoleDto (Role )
121
+ dto = DtoBase (Role )
131
122
132
123
@router .post ("/roles" , operation_id = "a18a152b-e9e9-4128-b8be-8a8e9c842abb" )
133
124
async def create_role (self , role : schemas .RoleCreate ) -> IdResponse :
134
- if not role .permission_ids :
135
- new_role = await self .role_dto .create (self .session , role )
136
- else :
137
- permissions = (
138
- await self .session .scalars (select (Permission ).where (Permission .id .in_ (role .permission_ids )))
139
- ).all ()
140
- new_role = await self .role_dto .create_with_permissions (self .session , role , permissions )
125
+ new_role = await self .dto .create (self .session , role )
141
126
return IdResponse (id = new_role .id )
142
127
143
128
@router .get ("/roles/{id}" , operation_id = "2b45f59a-77a1-45d4-bf43-94373da517e3" )
144
129
async def get_role (self , id : int ) -> schemas .RoleDetail :
145
- db_role = await self .role_dto .get_one_or_404 (self .session , id , selectinload (Role .permission ), undefer_load = True )
130
+ db_role = await self .dto .get_one_or_404 (self .session , id , selectinload (Role .permission ), undefer_load = True )
146
131
return schemas .RoleDetail .model_validate (db_role )
147
132
148
133
@router .get ("/roles" , operation_id = "c5f793b1-7adf-4b4e-a498-732b0fa7d758" )
149
- async def get_roles (self , query : schemas .RoleQuery = Depends ()) -> ListT [list [ schemas .RoleList ] ]:
150
- count , results = await self .role_dto .list_and_count (self .session , query )
134
+ async def get_roles (self , query : schemas .RoleQuery = Depends ()) -> ListT [schemas .RoleList ]:
135
+ count , results = await self .dto .list_and_count (self .session , query )
151
136
return ListT (count = count , results = [schemas .RoleList .model_validate (r ) for r in results ])
152
137
153
138
@router .put ("/roles/{id}" , operation_id = "2fda2e00-ad86-4296-a1d4-c7f02366b52e" )
154
139
async def update_role (self , id : int , role : schemas .RoleUpdate ) -> IdResponse :
155
- db_role = await self .role_dto .get_one_or_404 (self .session , id , selectinload (Role .permission ))
156
- if "permission_ids" in role .model_dump (exclude_unset = True ):
157
- db_role = await self .role_dto .update_relationship_field (
158
- self .session , db_role , Permission , "permission" , role .permission_ids
159
- )
160
- await self .role_dto .update (self .session , db_role , role , excludes = {"permission_ids" })
140
+ db_role = await self .dto .get_one_or_404 (self .session , id , selectinload (Role .permission ))
141
+ await self .dto .update (self .session , db_role , role )
161
142
return IdResponse (id = id )
162
143
163
144
@router .delete ("/roles/{id}" , operation_id = "c4e9e0e8-6b0c-4f6f-9e6c-8d9f9f9f9f9f" )
164
145
async def delete_role (self , id : int ) -> IdResponse :
165
- db_role = await self .role_dto .get_one_or_404 (self .session , id )
166
- await self .role_dto .delete (self .session , db_role )
146
+ db_role = await self .dto .get_one_or_404 (self .session , id )
147
+ await self .dto .delete (self .session , db_role )
167
148
return IdResponse (id = id )
168
149
169
150
170
151
@cbv (router )
171
152
class MenuAPI :
172
153
user : User = Depends (auth )
173
154
session : AsyncSession = Depends (get_session )
174
- menu_dto = MenuDto (Menu )
155
+ dto = MenuDto (Menu )
175
156
176
157
@router .post ("/menus" , operation_id = "008bf4d4-cc01-48b0-82b8-1a67c0348b31" )
177
158
async def create_menu (self , meun : schemas .MenuCreate ) -> IdResponse :
178
- new_menu = await self .menu_dto .create (self .session , meun )
159
+ new_menu = await self .dto .create (self .session , meun )
179
160
return IdResponse (id = new_menu .id )
180
161
181
162
@router .get ("/menus" , operation_id = "cb7f25ab-798b-4668-a838-6339425e2889" )
182
163
async def get_menus (self ) -> schemas .MenuTree :
183
- results = await self .menu_dto .get_all (self .session )
164
+ results = await self .dto .get_all (self .session )
184
165
data = list_to_tree ([r .dict () for r in results ])
185
166
return schemas .MenuTree .model_validate (data )
186
167
187
168
@router .put ("menus/{id}" , operation_id = "b4d7ac97-a182-4bd1-a75c-6ae44b5fcf0a" )
188
169
async def update_menu (self , id : int , meun : schemas .MenuUpdate ) -> IdResponse :
189
- db_menu = await self .menu_dto .get_one_or_404 (self .session , id )
190
- await self .menu_dto .update (self .session , db_menu , meun )
170
+ db_menu = await self .dto .get_one_or_404 (self .session , id )
171
+ await self .dto .update (self .session , db_menu , meun )
191
172
return IdResponse (id = id )
192
173
193
174
async def delete_menu (self , id : int ) -> IdResponse :
194
- db_menu = await self .menu_dto .get_one_or_404 (self .session , id )
195
- await self .menu_dto .delete (self .session , db_menu )
175
+ db_menu = await self .dto .get_one_or_404 (self .session , id )
176
+ await self .dto .delete (self .session , db_menu )
196
177
return IdResponse (id = id )
0 commit comments