Skip to content

Commit 5a67402

Browse files
perf: User delete api
1 parent b68427a commit 5a67402

File tree

4 files changed

+68
-16
lines changed

4 files changed

+68
-16
lines changed

backend/apps/system/api/user.py

Lines changed: 51 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Optional
22
from fastapi import APIRouter, Query
3-
from sqlmodel import func, or_, select
4-
from apps.system.crud.user import get_db_user, user_ws_options
3+
from sqlmodel import func, or_, select, delete as sqlmodel_delete
4+
from apps.system.crud.user import get_db_user, single_delete, user_ws_options
55
from apps.system.models.system_model import UserWsModel, WorkspaceModel
66
from apps.system.models.user import UserModel
77
from apps.system.schemas.auth import CacheName, CacheNamespace
@@ -20,6 +20,7 @@ async def user_info(current_user: CurrentUser):
2020
@router.get("/pager/{pageNum}/{pageSize}", response_model=PaginatedResponse[UserGrid])
2121
async def pager(
2222
session: SessionDep,
23+
trans: Trans,
2324
pageNum: int,
2425
pageSize: int,
2526
keyword: Optional[str] = Query(None, description="搜索关键字(可选)"),
@@ -67,10 +68,21 @@ async def pager(
6768
)
6869
)
6970

70-
return await paginator.get_paginated_response(
71+
user_page = await paginator.get_paginated_response(
7172
stmt=stmt,
7273
pagination=pagination,
7374
**filters)
75+
76+
for item in user_page.items:
77+
space_name: str = item['space_name']
78+
if space_name and 'i18n_default_workspace' in space_name:
79+
parts = list(map(
80+
lambda x: trans(x) if x == "i18n_default_workspace" else x,
81+
space_name.split(',')
82+
))
83+
output_str = ','.join(parts)
84+
item['space_name'] = output_str
85+
return user_page
7486

7587
@router.get("/ws")
7688
async def ws_options(session: SessionDep, current_user: CurrentUser, trans: Trans) -> list[UserWs]:
@@ -88,9 +100,13 @@ async def ws_change(session: SessionDep, current_user: CurrentUser, oid: int):
88100
session.commit()
89101

90102
@router.get("/{id}", response_model=UserEditor)
91-
async def query(session: SessionDep, id: int) -> UserEditor:
103+
async def query(session: SessionDep, trans: Trans, id: int) -> UserEditor:
92104
db_user: UserModel = get_db_user(session = session, user_id = id)
93-
return db_user
105+
u_ws_options = await user_ws_options(session, id, trans)
106+
result = UserEditor.model_validate(db_user.model_dump())
107+
if u_ws_options:
108+
result.oid_list = [item.id for item in u_ws_options]
109+
return result
94110

95111
@router.post("")
96112
async def create(session: SessionDep, creator: UserCreator):
@@ -99,28 +115,53 @@ async def create(session: SessionDep, creator: UserCreator):
99115
#user_model.create_time = get_timestamp()
100116
user_model.language = "zh-CN"
101117
session.add(user_model)
118+
if creator.oid_list:
119+
# need to validate oid_list
120+
db_model_list = [
121+
UserWsModel.model_validate({
122+
"oid": oid,
123+
"uid": user_model.id,
124+
"weight": 0
125+
})
126+
for oid in creator.oid_list
127+
]
128+
session.add_all(db_model_list)
102129
session.commit()
103130

104131
@router.put("")
105132
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="editor.id")
106133
async def update(session: SessionDep, editor: UserEditor):
107134
user_model: UserModel = get_db_user(session = session, user_id = editor.id)
135+
136+
del_stmt = sqlmodel_delete(UserWsModel).where(UserWsModel.uid == editor.id)
137+
session.exec(del_stmt)
138+
108139
data = editor.model_dump(exclude_unset=True)
109140
user_model.sqlmodel_update(data)
110141
session.add(user_model)
142+
143+
if editor.oid_list:
144+
# need to validate oid_list
145+
db_model_list = [
146+
UserWsModel.model_validate({
147+
"oid": oid,
148+
"uid": user_model.id,
149+
"weight": 0
150+
})
151+
for oid in editor.oid_list
152+
]
153+
session.add_all(db_model_list)
154+
111155
session.commit()
112156

113157
@router.delete("/{id}")
114-
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id")
115158
async def delete(session: SessionDep, id: int):
116-
user_model: UserModel = get_db_user(session = session, user_id = id)
117-
session.delete(user_model)
118-
session.commit()
159+
await single_delete(session, id)
119160

120161
@router.delete("")
121162
async def batch_del(session: SessionDep, id_list: list[int]):
122163
for id in id_list:
123-
delete(session, id)
164+
await single_delete(session, id)
124165

125166
@router.put("/language")
126167
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="current_user.id")

backend/apps/system/crud/user.py

Lines changed: 12 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,12 @@
11

22
from typing import Optional
3-
from sqlmodel import Session, select
3+
from sqlmodel import Session, select, delete as sqlmodel_delete
44

55
from apps.system.models.system_model import UserWsModel, WorkspaceModel
66
from apps.system.schemas.auth import CacheName, CacheNamespace
77
from apps.system.schemas.system_schema import BaseUserDTO, UserInfoDTO, UserWs
8-
from common.core.sqlbot_cache import cache
8+
from common.core.deps import SessionDep
9+
from common.core.sqlbot_cache import cache, clear_cache
910
from common.utils.locale import I18n
1011
from ..models.user import UserModel
1112
from common.core.security import verify_md5pwd
@@ -55,4 +56,12 @@ async def user_ws_options(session: Session, uid: int, trans: Optional[I18n] = No
5556
return [
5657
UserWs(id = id, name = trans(name) if name.startswith('i18n') else name)
5758
for id, name in result.all()
58-
]
59+
]
60+
61+
@clear_cache(namespace=CacheNamespace.AUTH_INFO, cacheName=CacheName.USER_INFO, keyExpression="id")
62+
async def single_delete(session: SessionDep, id: int):
63+
user_model: UserModel = get_db_user(session = session, user_id = id)
64+
del_stmt = sqlmodel_delete(UserWsModel).where(UserWsModel.uid == id)
65+
session.exec(del_stmt)
66+
session.delete(user_model)
67+
session.commit()

backend/apps/system/schemas/system_schema.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ class UserCreator(BaseUser):
3030
name: str
3131
email: str
3232
status: int = 1
33+
oid_list: Optional[list[int]] = None
3334

3435
class UserEditor(UserCreator, BaseCreatorDTO):
3536
pass

frontend/src/views/system/user/User.vue

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -205,8 +205,8 @@
205205

206206
<el-form-item :label="$t('user.workspace')">
207207
<el-select
208-
v-model="state.form.oid"
209-
clearable
208+
v-model="state.form.oid_list"
209+
multiple
210210
:placeholder="$t('datasource.Please_select') + $t('common.empty') + $t('user.workspace')"
211211
>
212212
<el-option v-for="item in options" :key="item.id" :label="item.name" :value="item.id" />
@@ -348,10 +348,11 @@ const state = reactive<any>({
348348
id: '',
349349
name: '',
350350
account: '',
351-
oid: '',
351+
oid: 1,
352352
email: '',
353353
status: '',
354354
phoneNumber: '',
355+
oid_list: [],
355356
},
356357
pageInfo: {
357358
currentPage: 1,

0 commit comments

Comments
 (0)