feat: Phase 4 - Mailwizz integration with subscriber sync and retry

This commit is contained in:
2026-04-03 22:03:53 +02:00
parent a1d570254e
commit 83e2158383
13 changed files with 983 additions and 133 deletions

View File

@@ -6,7 +6,10 @@ namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\IndexSubscriberRequest;
use App\Http\Requests\Admin\QueueMailwizzSyncRequest;
use App\Models\PreregistrationPage;
use App\Services\DispatchUnsyncedMailwizzSyncJobsService;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\StreamedResponse;
@@ -21,7 +24,42 @@ class SubscriberController extends Controller
->paginate(25)
->withQueryString();
return view('admin.subscribers.index', compact('page', 'subscribers'));
$page->loadMissing('mailwizzConfig');
$unsyncedMailwizzCount = $page->mailwizzConfig !== null
? (int) $page->subscribers()->where('synced_to_mailwizz', false)->count()
: 0;
return view('admin.subscribers.index', compact('page', 'subscribers', 'unsyncedMailwizzCount'));
}
public function queueMailwizzSync(
QueueMailwizzSyncRequest $request,
PreregistrationPage $page,
DispatchUnsyncedMailwizzSyncJobsService $dispatcher
): RedirectResponse {
$page->loadMissing('mailwizzConfig');
if ($page->mailwizzConfig === null) {
return redirect()
->route('admin.pages.subscribers.index', $page)
->with('error', __('This page has no Mailwizz integration.'));
}
$count = $dispatcher->dispatch($page->id);
if ($count === 0) {
return redirect()
->route('admin.pages.subscribers.index', $page)
->with('status', __('There are no unsynced subscribers to queue for this page.'));
}
return redirect()
->route('admin.pages.subscribers.index', $page)
->with('status', trans_choice(
'Queued Mailwizz sync for :count subscriber.|Queued Mailwizz sync for :count subscribers.',
$count,
['count' => $count]
));
}
public function export(IndexSubscriberRequest $request, PreregistrationPage $page): StreamedResponse