From b316beb522f00916527b6d7522dbff8cf4ae80be Mon Sep 17 00:00:00 2001 From: Codex Agent Date: Fri, 16 Jan 2026 15:12:03 +0100 Subject: [PATCH] Allow partial event updates --- .../Api/Tenant/EventController.php | 10 +++++++- .../Requests/Tenant/EventStoreRequest.php | 7 +++--- tests/Feature/EventControllerTest.php | 23 +++++++++++++++++++ 3 files changed, 36 insertions(+), 4 deletions(-) diff --git a/app/Http/Controllers/Api/Tenant/EventController.php b/app/Http/Controllers/Api/Tenant/EventController.php index 2454a65..efd2658 100644 --- a/app/Http/Controllers/Api/Tenant/EventController.php +++ b/app/Http/Controllers/Api/Tenant/EventController.php @@ -389,13 +389,21 @@ class EventController extends Controller TenantMemberPermissions::ensureEventPermission($request, $event, 'events:manage'); $validated = $request->validated(); + $nameProvided = array_key_exists('name', $validated); + + $validated = array_merge([ + 'name' => $event->name, + 'event_type_id' => $event->event_type_id, + 'event_date' => $event->date?->toDateString(), + 'status' => $event->status, + ], $validated); if (isset($validated['event_date'])) { $validated['date'] = $validated['event_date']; unset($validated['event_date']); } - if ($validated['name'] !== $event->name) { + if ($nameProvided && $validated['name'] !== $event->name) { $validated['slug'] = $this->generateUniqueSlug($validated['name'], $tenantId, $event->id); } diff --git a/app/Http/Requests/Tenant/EventStoreRequest.php b/app/Http/Requests/Tenant/EventStoreRequest.php index f658325..f2260d6 100644 --- a/app/Http/Requests/Tenant/EventStoreRequest.php +++ b/app/Http/Requests/Tenant/EventStoreRequest.php @@ -23,13 +23,14 @@ class EventStoreRequest extends FormRequest public function rules(): array { $tenantId = request()->attributes->get('tenant_id'); + $creating = $this->isMethod('post'); return [ - 'name' => ['required', 'string', 'max:255'], + 'name' => [$creating ? 'required' : 'sometimes', 'string', 'max:255'], 'description' => ['nullable', 'string'], - 'event_date' => ['required', 'date', 'after_or_equal:today'], + 'event_date' => $creating ? ['required', 'date', 'after_or_equal:today'] : ['sometimes', 'date'], 'location' => ['nullable', 'string', 'max:255'], - 'event_type_id' => ['required', 'exists:event_types,id'], + 'event_type_id' => [$creating ? 'required' : 'sometimes', 'exists:event_types,id'], 'package_id' => ['nullable', 'integer', 'exists:packages,id'], 'service_package_slug' => [ 'nullable', diff --git a/tests/Feature/EventControllerTest.php b/tests/Feature/EventControllerTest.php index 7b6502a..a515430 100644 --- a/tests/Feature/EventControllerTest.php +++ b/tests/Feature/EventControllerTest.php @@ -199,6 +199,29 @@ class EventControllerTest extends TenantTestCase ->assertJsonPath('error.code', 'event_limit_exceeded'); } + public function test_update_event_settings_without_required_fields_succeeds(): void + { + $tenant = $this->tenant; + $eventType = EventType::factory()->create(); + $event = Event::factory()->create([ + 'tenant_id' => $tenant->id, + 'event_type_id' => $eventType->id, + 'date' => Carbon::now()->subDays(2), + 'name' => ['de' => 'Test Event', 'en' => 'Test Event'], + 'settings' => [], + ]); + + $response = $this->authenticatedRequest('PUT', "/api/v1/tenant/events/{$event->slug}", [ + 'settings' => [ + 'engagement_mode' => 'photo_only', + ], + ]); + + $response->assertOk(); + $event->refresh(); + $this->assertSame('photo_only', data_get($event->settings, 'engagement_mode')); + } + public function test_create_event_rejects_unavailable_service_tier_for_partner_kontingent(): void { $tenant = $this->tenant;