Files
preregister/app/Http/Controllers/Admin/SubscriberController.php
bert.hausmans 845665c8be feat: per-subscriber Mailwizz sync button on admin list
Add POST route and form request to queue SyncSubscriberToMailwizz for one
subscriber when the page has Mailwizz configured. Include Dutch strings
and feature tests for auth and edge cases.

Made-with: Cursor
2026-04-05 13:45:30 +02:00

141 lines
5.1 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Http\Controllers\Admin;
use App\Http\Controllers\Controller;
use App\Http\Requests\Admin\DestroySubscriberRequest;
use App\Http\Requests\Admin\IndexSubscriberRequest;
use App\Http\Requests\Admin\QueueMailwizzSyncRequest;
use App\Http\Requests\Admin\SyncSubscriberMailwizzRequest;
use App\Jobs\SyncSubscriberToMailwizz;
use App\Models\PreregistrationPage;
use App\Models\Subscriber;
use App\Services\CleanupSubscriberIntegrationsService;
use App\Services\DispatchUnsyncedMailwizzSyncJobsService;
use Illuminate\Http\RedirectResponse;
use Illuminate\View\View;
use Symfony\Component\HttpFoundation\StreamedResponse;
class SubscriberController extends Controller
{
public function index(IndexSubscriberRequest $request, PreregistrationPage $page): View
{
$search = $request->validated('search');
$subscribers = $page->subscribers()
->search(is_string($search) ? $search : null)
->orderByDesc('created_at')
->paginate(25)
->withQueryString();
$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 destroy(
DestroySubscriberRequest $request,
PreregistrationPage $page,
Subscriber $subscriber,
CleanupSubscriberIntegrationsService $cleanupIntegrations
): RedirectResponse {
$cleanupIntegrations->runBeforeDelete($subscriber);
$subscriber->delete();
return redirect()
->route('admin.pages.subscribers.index', $page)
->with('status', __('Subscriber removed.'));
}
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 syncSubscriberMailwizz(
SyncSubscriberMailwizzRequest $request,
PreregistrationPage $page,
Subscriber $subscriber
): RedirectResponse {
$page->loadMissing('mailwizzConfig');
if ($page->mailwizzConfig === null) {
return redirect()
->route('admin.pages.subscribers.index', $page)
->with('error', __('This page has no Mailwizz integration.'));
}
SyncSubscriberToMailwizz::dispatch($subscriber->fresh());
return redirect()
->route('admin.pages.subscribers.index', $page)
->with('status', __('Mailwizz sync has been queued for this subscriber.'));
}
public function export(IndexSubscriberRequest $request, PreregistrationPage $page): StreamedResponse
{
$search = $request->validated('search');
$subscribers = $page->subscribers()
->search(is_string($search) ? $search : null)
->orderBy('created_at')
->get();
$phoneEnabled = $page->isPhoneFieldEnabledForSubscribers();
return response()->streamDownload(function () use ($subscribers, $phoneEnabled): void {
$handle = fopen('php://output', 'w');
$headers = ['First Name', 'Last Name', 'Email'];
if ($phoneEnabled) {
$headers[] = 'Phone';
}
$headers = array_merge($headers, ['Coupon Code', 'Registered At', 'Synced to Mailwizz', 'Synced At']);
fputcsv($handle, $headers);
foreach ($subscribers as $sub) {
$row = [$sub->first_name, $sub->last_name, $sub->email];
if ($phoneEnabled) {
$row[] = $sub->phoneDisplay() ?? '';
}
$row[] = $sub->coupon_code ?? '';
$row[] = $sub->created_at?->toDateTimeString() ?? '';
$row[] = $sub->synced_to_mailwizz ? 'Yes' : 'No';
$row[] = $sub->synced_at?->toDateTimeString() ?? '';
fputcsv($handle, $row);
}
fclose($handle);
}, 'subscribers-'.$page->slug.'.csv', [
'Content-Type' => 'text/csv; charset=UTF-8',
]);
}
}