Allow partial event updates
Some checks failed
linter / quality (push) Has been cancelled
tests / ci (push) Has been cancelled
tests / ui (push) Has been cancelled

This commit is contained in:
Codex Agent
2026-01-16 15:12:03 +01:00
parent 6d3f4f36e8
commit b316beb522
3 changed files with 36 additions and 4 deletions

View File

@@ -389,13 +389,21 @@ class EventController extends Controller
TenantMemberPermissions::ensureEventPermission($request, $event, 'events:manage'); TenantMemberPermissions::ensureEventPermission($request, $event, 'events:manage');
$validated = $request->validated(); $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'])) { if (isset($validated['event_date'])) {
$validated['date'] = $validated['event_date']; $validated['date'] = $validated['event_date'];
unset($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); $validated['slug'] = $this->generateUniqueSlug($validated['name'], $tenantId, $event->id);
} }

View File

@@ -23,13 +23,14 @@ class EventStoreRequest extends FormRequest
public function rules(): array public function rules(): array
{ {
$tenantId = request()->attributes->get('tenant_id'); $tenantId = request()->attributes->get('tenant_id');
$creating = $this->isMethod('post');
return [ return [
'name' => ['required', 'string', 'max:255'], 'name' => [$creating ? 'required' : 'sometimes', 'string', 'max:255'],
'description' => ['nullable', 'string'], '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'], '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'], 'package_id' => ['nullable', 'integer', 'exists:packages,id'],
'service_package_slug' => [ 'service_package_slug' => [
'nullable', 'nullable',

View File

@@ -199,6 +199,29 @@ class EventControllerTest extends TenantTestCase
->assertJsonPath('error.code', 'event_limit_exceeded'); ->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 public function test_create_event_rejects_unavailable_service_tier_for_partner_kontingent(): void
{ {
$tenant = $this->tenant; $tenant = $this->tenant;