11from typing import Optional
22from fastapi import APIRouter , HTTPException , Query
33from sqlmodel import func , or_ , select , delete as sqlmodel_delete
4- from apps .system .crud .user import get_db_user , single_delete , user_ws_options
5- from apps .system .models .system_model import UserWsModel
4+ from apps .system .crud .user import check_account_exists , check_email_exists , check_email_format , check_pwd_format , get_db_user , single_delete , user_ws_options
5+ from apps .system .models .system_model import UserWsModel , WorkspaceModel
66from apps .system .models .user import UserModel
77from apps .system .schemas .auth import CacheName , CacheNamespace
8- from apps .system .schemas .system_schema import PwdEditor , UserCreator , UserEditor , UserGrid , UserLanguage , UserWs
8+ from apps .system .schemas .system_schema import PwdEditor , UserCreator , UserEditor , UserGrid , UserLanguage , UserStatus , UserWs
99from common .core .deps import CurrentUser , SessionDep , Trans
1010from common .core .pagination import Paginator
1111from common .core .schemas import PaginatedResponse , PaginationParams
@@ -96,10 +96,13 @@ async def ws_options(session: SessionDep, current_user: CurrentUser, trans: Tran
9696
9797@router .put ("/ws/{oid}" )
9898@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "current_user.id" )
99- async def ws_change (session : SessionDep , current_user : CurrentUser , oid : int ):
99+ async def ws_change (session : SessionDep , current_user : CurrentUser , trans : Trans , oid : int ):
100100 ws_list : list [UserWs ] = await user_ws_options (session , current_user .id )
101101 if not any (x .id == oid for x in ws_list ):
102- raise HTTPException (f"oid [{ oid } ] is invalid!" )
102+ db_ws = session .get (WorkspaceModel , oid )
103+ if db_ws :
104+ raise Exception (trans ('i18n_user.ws_miss' , ws = db_ws .name ))
105+ raise Exception (trans ('i18n_not_exist' , msg = f"{ trans ('i18n_ws.title' )} [{ oid } ]" ))
103106 user_model : UserModel = get_db_user (session = session , user_id = current_user .id )
104107 user_model .oid = oid
105108 session .add (user_model )
@@ -115,7 +118,13 @@ async def query(session: SessionDep, trans: Trans, id: int) -> UserEditor:
115118 return result
116119
117120@router .post ("" )
118- async def create (session : SessionDep , creator : UserCreator ):
121+ async def create (session : SessionDep , creator : UserCreator , trans : Trans ):
122+ if check_account_exists (session = session , account = creator .account ):
123+ raise Exception (trans ('i18n_exist' , msg = f"{ trans ('i18n_user.account' )} [{ creator .account } ]" ))
124+ if check_email_exists (session = session , email = creator .email ):
125+ raise Exception (trans ('i18n_exist' , msg = f"{ trans ('i18n_user.email' )} [{ creator .email } ]" ))
126+ if not check_email_format (creator .email ):
127+ raise Exception (trans ('i18n_format_invalid' , key = f"{ trans ('i18n_user.email' )} [{ creator .email } ]" ))
119128 data = creator .model_dump (exclude_unset = True )
120129 user_model = UserModel .model_validate (data )
121130 #user_model.create_time = get_timestamp()
@@ -138,8 +147,16 @@ async def create(session: SessionDep, creator: UserCreator):
138147
139148@router .put ("" )
140149@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "editor.id" )
141- async def update (session : SessionDep , editor : UserEditor ):
150+ async def update (session : SessionDep , editor : UserEditor , trans : Trans ):
142151 user_model : UserModel = get_db_user (session = session , user_id = editor .id )
152+ if not user_model :
153+ raise Exception (f"User with id [{ editor .id } ] not found!" )
154+ if editor .account != user_model .account :
155+ raise Exception (f"account cannot be changed!" )
156+ if editor .email != user_model .email and check_email_exists (session = session , account = editor .email ):
157+ raise Exception (trans ('i18n_exist' , msg = f"{ trans ('i18n_user.email' )} [{ editor .email } ]" ))
158+ if not check_email_format (editor .email ):
159+ raise Exception (trans ('i18n_format_invalid' , key = f"{ trans ('i18n_user.email' )} [{ editor .email } ]" ))
143160 origin_oid : int = user_model .oid
144161 del_stmt = sqlmodel_delete (UserWsModel ).where (UserWsModel .uid == editor .id )
145162 session .exec (del_stmt )
@@ -174,31 +191,47 @@ async def batch_del(session: SessionDep, id_list: list[int]):
174191
175192@router .put ("/language" )
176193@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "current_user.id" )
177- async def langChange (session : SessionDep , current_user : CurrentUser , language : UserLanguage ):
194+ async def langChange (session : SessionDep , current_user : CurrentUser , trans : Trans , language : UserLanguage ):
178195 lang = language .language
179196 if lang not in ["zh-CN" , "en" ]:
180- return { "message" : "Language not supported" }
197+ raise Exception ( trans ( 'i18n_user.language_not_support' , key = lang ))
181198 db_user : UserModel = get_db_user (session = session , user_id = current_user .id )
182199 db_user .language = lang
183200 session .add (db_user )
184201 session .commit ()
185202
186203@router .patch ("/pwd/{id}" )
187204@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "id" )
188- async def pwdReset (session : SessionDep , current_user : CurrentUser , id : int ):
205+ async def pwdReset (session : SessionDep , current_user : CurrentUser , trans : Trans , id : int ):
189206 if not current_user .isAdmin :
190- raise HTTPException ( 'only for admin' )
207+ raise Exception ( trans ( 'i18n_permission.no_permission' , url = " patch[/user/pwd/id]," , msg = trans ( 'i18n_permission.only_admin' )) )
191208 db_user : UserModel = get_db_user (session = session , user_id = id )
192209 db_user .password = default_md5_pwd ()
193210 session .add (db_user )
194211 session .commit ()
195212
196213@router .put ("/pwd" )
197214@clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "current_user.id" )
198- async def pwdUpdate (session : SessionDep , current_user : CurrentUser , editor : PwdEditor ):
215+ async def pwdUpdate (session : SessionDep , current_user : CurrentUser , trans : Trans , editor : PwdEditor ):
216+ new_pwd = editor .new_pwd
217+ if not check_pwd_format (new_pwd ):
218+ raise Exception (trans ('i18n_format_invalid' , key = trans ('i18n_user.password' )))
199219 db_user : UserModel = get_db_user (session = session , user_id = current_user .id )
200220 if not verify_md5pwd (editor .pwd , db_user .password ):
201- raise HTTPException ("pwd error" )
202- db_user .password = md5pwd (editor .new_pwd )
221+ raise Exception (trans ('i18n_error' , key = trans ('i18n_user.password' )))
222+ db_user .password = md5pwd (new_pwd )
223+ session .add (db_user )
224+ session .commit ()
225+
226+ @router .patch ("/status" )
227+ @clear_cache (namespace = CacheNamespace .AUTH_INFO , cacheName = CacheName .USER_INFO , keyExpression = "statusDto.id" )
228+ async def langChange (session : SessionDep , current_user : CurrentUser , trans : Trans , statusDto : UserStatus ):
229+ if not current_user .isAdmin :
230+ raise Exception (trans ('i18n_permission.no_permission' , url = ", " , msg = trans ('i18n_permission.only_admin' )))
231+ status = statusDto .status
232+ if status not in [0 , 1 ]:
233+ return {"message" : "status not supported" }
234+ db_user : UserModel = get_db_user (session = session , user_id = statusDto .id )
235+ db_user .status = status
203236 session .add (db_user )
204237 session .commit ()
0 commit comments