Files
back-meditation/app/Console/Commands/SyncSurveyUsers.php
T
2026-08-20 18:38:04 +03:30

89 lines
3.2 KiB
PHP

<?php
namespace App\Console\Commands;
use App\Models\User;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\Http;
class SyncSurveyUsers extends Command
{
protected $signature = 'survey:sync-users {--token= : Approagency admin token}';
protected $description = 'Sync user profile fields (name, age, gender) from approagency for all meditation users with missing data';
public function handle()
{
$token = $this->option('token') ?: config('services.approagency.token');
if (empty($token)) {
$this->error('Provide --token=<approagency_admin_token> or set APPROAGENCY_ADMIN_TOKEN in .env');
return 1;
}
$users = User::whereNull('first_name')
->whereNotNull('mobile')
->get();
$this->info("Found {$users->count()} users with missing first_name. Syncing...");
$synced = 0;
$failed = 0;
foreach ($users as $user) {
$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,
]);
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);
}
}
}
sleep(3); // 3s between requests
}
$this->info("Done. Synced: {$synced}, Failed: {$failed}");
return 0;
}
}