Files
timebank-cc-public/app/Http/Controllers/MailingsController.php
Ronald Huynen 2547717edb Initial commit
2026-03-23 21:37:59 +01:00

262 lines
8.4 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Models\Mailing;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Gate;
use Illuminate\Validation\Rule;
class MailingsController extends Controller
{
/**
* Display the mailings management page
*/
public function index()
{
// Check authorization - only admins and banks can manage mailings
if (!Auth::guard('admin')->check() && !Auth::guard('bank')->check()) {
abort(403, 'Unauthorized to access mailings management.');
}
return view('mailings.manage');
}
/**
* Store a new mailing
*/
public function store(Request $request)
{
// Authorization check
if (!Auth::guard('admin')->check() && !Auth::guard('bank')->check()) {
abort(403, 'Unauthorized to create mailings.');
}
$validated = $request->validate([
'title' => 'required|string|max:255',
'type' => ['required', Rule::in(['local_newsletter', 'general_newsletter', 'system_message'])],
'subject' => 'required|string|max:255',
'content_blocks' => 'nullable|array',
'content_blocks.*.post_id' => 'required|integer|exists:posts,id',
'content_blocks.*.order' => 'required|integer|min:1',
'scheduled_at' => 'nullable|date|after:now',
]);
// Determine creator
$creator = Auth::guard('admin')->user() ?: Auth::guard('bank')->user();
$mailing = Mailing::create([
'title' => $validated['title'],
'type' => $validated['type'],
'subject' => $validated['subject'],
'content_blocks' => $validated['content_blocks'] ?? [],
'scheduled_at' => $validated['scheduled_at'] ?? null,
'status' => $validated['scheduled_at'] ? 'scheduled' : 'draft',
'created_by_id' => $creator->id,
'created_by_type' => get_class($creator),
]);
// Update recipient count
$mailing->recipients_count = $mailing->getRecipientsQuery()->count();
$mailing->save();
return response()->json([
'success' => true,
'message' => 'Mailing created successfully.',
'mailing' => $mailing->load('createdBy')
]);
}
/**
* Update an existing mailing
*/
public function update(Request $request, Mailing $mailing)
{
// Authorization check
if (!Auth::guard('admin')->check() && !Auth::guard('bank')->check()) {
abort(403, 'Unauthorized to update mailings.');
}
// Can only edit drafts
if (!$mailing->canBeScheduled()) {
return response()->json(['error' => 'Only draft mailings can be edited.'], 422);
}
$validated = $request->validate([
'title' => 'required|string|max:255',
'type' => ['required', Rule::in(['local_newsletter', 'general_newsletter', 'system_message'])],
'subject' => 'required|string|max:255',
'content_blocks' => 'nullable|array',
'content_blocks.*.post_id' => 'required|integer|exists:posts,id',
'content_blocks.*.order' => 'required|integer|min:1',
'scheduled_at' => 'nullable|date|after:now',
]);
$mailing->update([
'title' => $validated['title'],
'type' => $validated['type'],
'subject' => $validated['subject'],
'content_blocks' => $validated['content_blocks'] ?? [],
'scheduled_at' => $validated['scheduled_at'] ?? null,
'status' => $validated['scheduled_at'] ? 'scheduled' : 'draft',
]);
// Update recipient count
$mailing->recipients_count = $mailing->getRecipientsQuery()->count();
$mailing->save();
return response()->json([
'success' => true,
'message' => 'Mailing updated successfully.',
'mailing' => $mailing->load('createdBy')
]);
}
/**
* Delete a mailing (soft delete)
*/
public function destroy(Mailing $mailing)
{
// Authorization check
if (!Auth::guard('admin')->check() && !Auth::guard('bank')->check()) {
abort(403, 'Unauthorized to delete mailings.');
}
// Can only delete drafts and scheduled mailings
if (!in_array($mailing->status, ['draft', 'scheduled'])) {
return response()->json(['error' => 'Cannot delete sent or sending mailings.'], 422);
}
$mailing->delete();
return response()->json([
'success' => true,
'message' => 'Mailing deleted successfully.'
]);
}
/**
* Send a mailing immediately
*/
public function send(Request $request, Mailing $mailing)
{
// Authorization check
if (!Auth::guard('admin')->check() && !Auth::guard('bank')->check()) {
abort(403, 'Unauthorized to send mailings.');
}
if (!$mailing->canBeSent()) {
return response()->json(['error' => 'Mailing cannot be sent in its current status.'], 422);
}
// Update status to sending
$mailing->update(['status' => 'sending']);
// Dispatch bulk email job (to be implemented in Phase 6)
// SendBulkMailJob::dispatch($mailing);
return response()->json([
'success' => true,
'message' => 'Mailing is being sent. This process may take several minutes.',
'mailing' => $mailing
]);
}
/**
* Schedule a mailing for future sending
*/
public function schedule(Request $request, Mailing $mailing)
{
// Authorization check
if (!Auth::guard('admin')->check() && !Auth::guard('bank')->check()) {
abort(403, 'Unauthorized to schedule mailings.');
}
if (!$mailing->canBeScheduled()) {
return response()->json(['error' => 'Mailing cannot be scheduled in its current status.'], 422);
}
$validated = $request->validate([
'scheduled_at' => 'required|date|after:now',
]);
$mailing->update([
'scheduled_at' => $validated['scheduled_at'],
'status' => 'scheduled'
]);
return response()->json([
'success' => true,
'message' => 'Mailing scheduled successfully.',
'mailing' => $mailing
]);
}
/**
* Cancel a scheduled mailing
*/
public function cancel(Mailing $mailing)
{
// Authorization check
if (!Auth::guard('admin')->check() && !Auth::guard('bank')->check()) {
abort(403, 'Unauthorized to cancel mailings.');
}
if (!$mailing->canBeCancelled()) {
return response()->json(['error' => 'Mailing cannot be cancelled in its current status.'], 422);
}
$mailing->update([
'scheduled_at' => null,
'status' => 'draft'
]);
return response()->json([
'success' => true,
'message' => 'Scheduled mailing cancelled and reverted to draft.',
'mailing' => $mailing
]);
}
/**
* Preview a mailing
*/
public function preview(Request $request, Mailing $mailing)
{
// Authorization check
if (!Auth::guard('admin')->check() && !Auth::guard('bank')->check()) {
abort(403, 'Unauthorized to preview mailings.');
}
// Get current user as preview recipient
$recipient = Auth::guard('admin')->user() ?: Auth::guard('bank')->user();
// Generate preview using NewsletterMail
$newsletterMail = new \App\Mail\NewsletterMail($mailing, $recipient);
return response()->json([
'success' => true,
'preview_url' => route('mailings.preview_render', $mailing->id)
]);
}
/**
* Render mailing preview as HTML
*/
public function previewRender(Mailing $mailing)
{
// Authorization check
if (!Auth::guard('admin')->check() && !Auth::guard('bank')->check()) {
abort(403, 'Unauthorized to preview mailings.');
}
// Get current user as preview recipient
$recipient = Auth::guard('admin')->user() ?: Auth::guard('bank')->user();
// Generate and render preview
$newsletterMail = new \App\Mail\NewsletterMail($mailing, $recipient);
return $newsletterMail->render();
}
}