- 🏗️ Introduced CoursePolicy and CourseEventPolicy for authorization.

-  Added `StoreCourseRequest` and `UpdateCourseRequest` for structured validation.
-  Introduced `StoreCourseEventRequest` and `UpdateCourseEventRequest` for consistent request validation.
- 🖼️ Created `CourseResource` and `CourseEventResource` for API responses.
- 🔄 Refactored `CourseController` and `CourseEventController` to use Policies and FormRequests.
-  Added dedicated `uploadLogo` and `uploadAvatar` API endpoints with shared media validation.
- 🚀 Improved API by aligning Course and CourseEvent behavior with other entities.
This commit is contained in:
HolgerHatGarKeineNode
2026-06-15 15:06:07 +02:00
parent 119deb4f5c
commit 1518611bdb
25 changed files with 1186 additions and 256 deletions
@@ -0,0 +1,43 @@
<?php
namespace App\Actions\MeetupEvents;
use App\Enums\RecurrenceType;
use App\Models\MeetupEvent;
use Carbon\Carbon;
use Illuminate\Support\Collection;
/**
* Persists a recurrence rule as concrete individual MeetupEvent records,
* mirroring the Livewire editor: each occurrence is stored as a standalone
* event without recurrence metadata.
*/
class CreateMeetupEventSeries
{
public function __construct(private ExpandRecurrenceSeries $expandRecurrenceSeries) {}
/**
* @param array<string, mixed> $data Validated StoreMeetupEventRequest payload.
* @return Collection<int, MeetupEvent>
*/
public function handle(array $data): Collection
{
$dates = $this->expandRecurrenceSeries->handle(
Carbon::parse($data['start']),
Carbon::parse($data['recurrence_end_date']),
RecurrenceType::from($data['recurrence_type']),
$data['recurrence_day_of_week'] ?? null,
$data['recurrence_day_position'] ?? null,
);
return collect($dates)->map(fn (Carbon $start): MeetupEvent => MeetupEvent::create([
'meetup_id' => $data['meetup_id'],
'start' => $start,
'location' => $data['location'] ?? null,
'description' => $data['description'] ?? null,
'link' => $data['link'] ?? null,
'attendees' => [],
'might_attendees' => [],
]));
}
}