Adds DELETE route, form request authorization, admin UI with confirm, Dutch strings, and feature tests. Made-with: Cursor
112 lines
4.0 KiB
PHP
112 lines
4.0 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\Models\PreregistrationPage;
|
|
use App\Models\Subscriber;
|
|
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): RedirectResponse
|
|
{
|
|
$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 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, ['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->phone ?? '';
|
|
}
|
|
$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',
|
|
]);
|
|
}
|
|
}
|