option('dry-run'); $memberFilter = $this->option('member'); $this->info( $dryRun ? 'DRY-RUN enabled' : 'Syncing Listmonk → Members' ); $members = Member::query() ->when($memberFilter, fn ($q) => $q->where('id', $memberFilter)) ->get() ->filter(fn (Member $m) => ! empty($m->retzien_email)) ->keyBy(fn (Member $m) => strtolower($m->retzien_email)); if ($members->isEmpty()) { $this->warn('No members to sync'); return CommandAlias::SUCCESS; } $this->info("{$members->count()} members to sync"); $listmonkUsers = $this->listmonk->getUsers(); dd($listmonkUsers); $this->info(count($listmonkUsers).' Listmonk users found'); $progress = null; if (! $dryRun) { $progress = progress( label: 'Syncing members', steps: $members->count() ); $progress->start(); } $synced = 0; foreach ($listmonkUsers as $user) { try { $email = strtolower($user['email'] ?? ''); if (! $email || ! $members->has($email)) { continue; } $member = $members[$email]; if ($dryRun) { $this->line("[DRY-RUN] {$member->id} ({$email}) ← Listmonk user #{$user['id']}"); } else { ListmonkMember::query()->updateOrCreate( ['member_id' => $member->id], [ 'listmonk_user_id' => $user['id'], 'data' => $user, ] ); $progress?->advance(); } $synced++; } catch (\Throwable $e) { Log::error('Listmonk sync error', [ 'user' => $user['id'] ?? null, 'error' => $e->getMessage(), ]); $progress?->advance(); } } if ($progress) { $progress->finish(); $this->newLine(); } $this->info("Sync complete — {$synced} accounts linked"); return CommandAlias::SUCCESS; } }