diff --git a/app/Console/Commands/SyncSurveyUsers.php b/app/Console/Commands/SyncSurveyUsers.php index f6bf967..8884c2d 100644 --- a/app/Console/Commands/SyncSurveyUsers.php +++ b/app/Console/Commands/SyncSurveyUsers.php @@ -30,38 +30,56 @@ public function handle() $failed = 0; foreach ($users as $user) { - try { - $response = Http::withToken($token) - ->get('https://api.approagency.ir/api/admin/users', [ - 'mobile' => $user->mobile, - 'per_page' => 1, - ]); - - if ($response->successful()) { - $data = $response->json('data.0'); - if ($data) { - $user->update([ - 'first_name' => $data['first_name'] ?? $user->first_name, - 'last_name' => $data['last_name'] ?? $user->last_name, - 'age' => $data['age'] ?? $user->age, - 'gender' => $data['gender'] ?? $user->gender, - 'birthday' => $data['birthday'] ?? $user->birthday, - 'identifier' => $data['uuid'] ?? $user->identifier, + $retries = 0; + while ($retries <= 3) { + try { + $response = Http::withToken($token) + ->retry(2, 2000) + ->get('https://api.approagency.ir/api/admin/users', [ + 'mobile' => $user->mobile, + 'per_page' => 1, ]); - $name = $data['first_name'] ?? 'null'; - $this->line(" synced: {$user->mobile} → {$name}"); - $synced++; + + if ($response->status() === 429) { + $retries++; + $wait = $retries * 3; + $this->warn(" rate limited on {$user->mobile}, waiting {$wait}s..."); + sleep($wait); + continue; + } + + if ($response->successful()) { + $data = $response->json('data.0'); + if ($data) { + $user->update([ + 'first_name' => $data['first_name'] ?? $user->first_name, + 'last_name' => $data['last_name'] ?? $user->last_name, + 'age' => $data['age'] ?? $user->age, + 'gender' => $data['gender'] ?? $user->gender, + 'birthday' => $data['birthday'] ?? $user->birthday, + 'identifier' => $data['uuid'] ?? $user->identifier, + ]); + $name = $data['first_name'] ?? 'null'; + $this->line(" synced: {$user->mobile} → {$name}"); + $synced++; + } + } else { + $this->warn(" skip: {$user->mobile} (HTTP {$response->status()})"); + $failed++; + } + break; + } catch (\Exception $e) { + $retries++; + if ($retries > 3) { + $this->error(" failed: {$user->mobile} — {$e->getMessage()}"); + $failed++; + } else { + sleep($retries * 2); } - } else { - $this->warn(" skip: {$user->mobile} (HTTP {$response->status()})"); - $failed++; } - } catch (\Exception $e) { - $this->error(" failed: {$user->mobile} — {$e->getMessage()}"); - $failed++; } - usleep(200000); // 200ms delay to avoid rate limits + sleep(3); // 3s between requests } $this->info("Done. Synced: {$synced}, Failed: {$failed}");