@@ -71,6 +71,8 @@ async def import_credential(payload: dict,
7171 credential_data = credential_data ,
7272 nickname = str (payload .get ("nickname" ) or "" ),
7373 added_by = principal .username )
74+ logger .info ("管理员 %s 新增凭证 %s(上游 %s)" , principal .username , credential_id ,
75+ provider_id )
7476 schedule_probe (credential_id )
7577 return {"id" : credential_id }
7678
@@ -81,14 +83,29 @@ async def toggle_credential(credential_id: str, payload: dict,
8183 require_admin (principal )
8284 if not credentials .set_enabled (credential_id , bool (payload .get ("enabled" , True ))):
8385 raise InvalidRequest ("credential not found" )
86+ logger .info ("管理员 %s 开关凭证 %s -> %s" , principal .username , credential_id ,
87+ payload .get ("enabled" , True ))
88+ return {"ok" : True }
89+
90+ @router .post ("/api/credentials/{credential_id}/revive" )
91+ async def revive_credential (credential_id : str ,
92+ _csrf : None = Depends (csrf_protected ),
93+ principal = Depends (principal_from_request )):
94+ """解除硬禁用/冷却,让重新登录后的凭证回到池子。"""
95+ require_admin (principal )
96+ if not credentials .revive (credential_id ):
97+ raise InvalidRequest ("credential not found" )
98+ logger .info ("管理员 %s 恢复了凭证 %s" , principal .username , credential_id )
8499 return {"ok" : True }
85100
86101 @router .post ("/api/credentials/pin" )
87102 async def pin_credential (payload : dict ,
88103 _csrf : None = Depends (csrf_protected ),
89104 principal = Depends (principal_from_request )):
90105 require_admin (principal )
91- credentials .set_pinned (payload .get ("credential_id" ))
106+ pin = payload .get ("credential_id" )
107+ credentials .set_pinned (pin )
108+ logger .info ("管理员 %s 固定凭证 %s" , principal .username , pin )
92109 return {"ok" : True }
93110
94111 @router .delete ("/api/credentials/{credential_id}" )
@@ -98,6 +115,7 @@ async def delete_credential(credential_id: str,
98115 require_admin (principal )
99116 if not credentials .delete (credential_id ):
100117 raise InvalidRequest ("credential not found" )
118+ logger .info ("管理员 %s 删除凭证 %s" , principal .username , credential_id )
101119 return {"ok" : True }
102120
103121 @router .post ("/api/credentials/{credential_id}/probe" )
@@ -164,6 +182,8 @@ async def select_credential_account(credential_id: str, payload: dict,
164182 raise InvalidRequest ("credential does not support account switching" )
165183 switched = await provider .switch_account (data , str (payload .get ("account_id" ) or "" ))
166184 credentials .save_credential_data (credential_id , switched )
185+ logger .info ("管理员 %s 切换凭证 %s 账号 -> %s" , principal .username , credential_id ,
186+ payload .get ("account_id" ))
167187 # 账号切换后额度对应的是新账号,必须重探测而不是沿用旧值
168188 schedule_probe (credential_id )
169189 return {"switched" : True }
0 commit comments