11import asyncio
22import logging
33from datetime import datetime
4- from typing import Any , Dict , List , Optional
4+ from typing import Any , Callable , Dict , List , Optional
55
66from .api_client import GcliApiClient
77
@@ -16,11 +16,16 @@ def __init__(self):
1616 self ._history : List [Dict [str , Any ]] = []
1717 self ._max_history = 100
1818 self ._on_new_log = None # SSE callback
19+ self ._on_progress = None # Progress callback for SSE
1920
2021 def set_log_callback (self , callback ):
2122 """Set callback for new log entries (for SSE)"""
2223 self ._on_new_log = callback
2324
25+ def set_progress_callback (self , callback : Optional [Callable ]):
26+ """Set callback for verify progress (for SSE)"""
27+ self ._on_progress = callback
28+
2429 @property
2530 def is_running (self ) -> bool :
2631 return self ._running
@@ -93,56 +98,45 @@ async def _check_and_verify(self, error_codes: List[int]):
9398 logger .info (f"Found { len (to_verify )} credentials to verify" )
9499 await self ._add_history ({
95100 "type" : "info" ,
96- "message" : f"发现 { len (to_verify )} 个需要恢复的凭证"
101+ "message" : f"发现 { len (to_verify )} 个需要恢复的凭证,开始并行检验... "
97102 })
98103
99- # Verify each credential
104+ # Use parallel verification with progress callback
105+ async def progress_callback (completed : int , total : int , filename : str , success : bool ):
106+ if self ._on_progress :
107+ await self ._on_progress (completed , total , filename , success )
108+
109+ results = await self ._client .verify_credentials_batch (
110+ to_verify ,
111+ progress_callback = progress_callback
112+ )
113+
114+ # Process results and add to history
100115 success_count = 0
101116 fail_count = 0
102- for cred in to_verify :
103- filename = cred .get ("filename" )
104- if not filename :
105- continue
106- old_errors = cred .get ("error_codes" , [])
107- user_email = cred .get ("user_email" , "" )
108-
109- # Log before restore
110- await self ._add_history ({
111- "type" : "info" ,
112- "message" : f"正在恢复 { filename } ,错误码: { old_errors } "
113- })
114-
115- try :
116- result = await self ._client .verify_credential (filename )
117- success = result .get ("success" , False )
118- message = result .get ("message" , "" )
119-
120- if success :
121- success_count += 1
122- await self ._add_history ({
123- "type" : "verify" ,
124- "filename" : filename ,
125- "success" : True ,
126- "message" : f"恢复成功 - { message } " if message else "恢复成功,凭证已启用" ,
127- })
128- else :
129- fail_count += 1
130- await self ._add_history ({
131- "type" : "verify" ,
132- "filename" : filename ,
133- "success" : False ,
134- "message" : f"恢复失败 - { message } " if message else "恢复失败" ,
135- })
136- logger .info (f"Verified { filename } : success={ success } " )
137- except Exception as e :
117+ for item in results :
118+ filename = item .get ("filename" , "" )
119+ success = item .get ("success" , False )
120+ result = item .get ("result" , {})
121+ message = result .get ("message" , "" )
122+
123+ if success :
124+ success_count += 1
125+ await self ._add_history ({
126+ "type" : "verify" ,
127+ "filename" : filename ,
128+ "success" : True ,
129+ "message" : f"恢复成功 - { message } " if message else "恢复成功,凭证已启用" ,
130+ })
131+ else :
138132 fail_count += 1
133+ error_msg = result .get ("error" , message )
139134 await self ._add_history ({
140135 "type" : "verify" ,
141136 "filename" : filename ,
142137 "success" : False ,
143- "message" : f"恢复异常: { str ( e ) } " ,
138+ "message" : f"恢复失败 - { error_msg } " if error_msg else "恢复失败 " ,
144139 })
145- logger .warning (f"Failed to verify { filename } : { e } " )
146140
147141 # Summary log
148142 await self ._add_history ({
@@ -151,37 +145,62 @@ async def _check_and_verify(self, error_codes: List[int]):
151145 })
152146
153147 async def trigger_now (self , error_codes : List [int ] = None ) -> Dict [str , Any ]:
154- """Manually trigger verification for all credentials"""
148+ """Manually trigger verification for all credentials (parallel execution) """
155149 if not self ._client :
156150 return {"success" : False , "message" : "Not connected" }
157151
158- results = []
159152 # Get all credentials (not just disabled)
160153 all_creds = await self ._client .get_all_credentials ()
154+ if not all_creds :
155+ return {"success" : True , "total" : 0 , "verified" : 0 , "results" : []}
161156
162- for cred in all_creds :
163- filename = cred .get ("filename" )
164- if not filename :
165- continue
166- try :
167- result = await self ._client .verify_credential (filename )
168- results .append ({
169- "filename" : filename ,
170- "success" : result .get ("success" , False ),
171- "message" : result .get ("message" , "" ),
172- })
173- await self ._add_history ({
174- "type" : "verify" ,
175- "filename" : filename ,
176- "success" : result .get ("success" , False ),
177- "message" : result .get ("message" , "" ),
178- })
179- except Exception as e :
180- results .append ({
181- "filename" : filename ,
182- "success" : False ,
183- "message" : str (e ),
184- })
157+ await self ._add_history ({
158+ "type" : "info" ,
159+ "message" : f"开始立即检验,共 { len (all_creds )} 个凭证,并行执行中..."
160+ })
161+
162+ # Use parallel verification with progress callback
163+ async def progress_callback (completed : int , total : int , filename : str , success : bool ):
164+ if self ._on_progress :
165+ await self ._on_progress (completed , total , filename , success )
166+
167+ batch_results = await self ._client .verify_credentials_batch (
168+ all_creds ,
169+ progress_callback = progress_callback
170+ )
171+
172+ # Process results and add to history
173+ results = []
174+ success_count = 0
175+ fail_count = 0
176+ for item in batch_results :
177+ filename = item .get ("filename" , "" )
178+ success = item .get ("success" , False )
179+ result = item .get ("result" , {})
180+ message = result .get ("message" , "" )
181+
182+ results .append ({
183+ "filename" : filename ,
184+ "success" : success ,
185+ "message" : message ,
186+ })
187+
188+ if success :
189+ success_count += 1
190+ else :
191+ fail_count += 1
192+
193+ await self ._add_history ({
194+ "type" : "verify" ,
195+ "filename" : filename ,
196+ "success" : success ,
197+ "message" : message if message else ("检验成功" if success else "检验失败" ),
198+ })
199+
200+ await self ._add_history ({
201+ "type" : "info" ,
202+ "message" : f"立即检验完成: 成功 { success_count } 个, 失败 { fail_count } 个"
203+ })
185204
186205 return {
187206 "success" : True ,
0 commit comments