diff --git a/src/Actions/Incident/CreateIncident.php b/src/Actions/Incident/CreateIncident.php index 7864aa75..62aedcde 100644 --- a/src/Actions/Incident/CreateIncident.php +++ b/src/Actions/Incident/CreateIncident.php @@ -36,13 +36,18 @@ public function handle(CreateIncidentRequestData $data): Incident ['guid' => Str::uuid()], $data->except('components', 'meta')->toArray() )), function (Incident $incident) use ($data) { - if ($data->components) { - $components = collect($data->components) - ->mapWithKeys(fn (IncidentComponentRequestData $component) => [ - $component->id => ['component_status' => $component->status], - ]) - ->all(); + $components = collect($data->components) + ->mapWithKeys(fn (IncidentComponentRequestData $component) => [ + $component->id => ['component_status' => $component->status], + ]); + if ($data->componentId !== null) { + $components->put($data->componentId, [ + 'component_status' => $data->componentStatus, + ]); + } + + if ($components->isNotEmpty()) { $incident->components()->sync($components); } diff --git a/tests/Feature/Api/IncidentTest.php b/tests/Feature/Api/IncidentTest.php index 90b63758..2c7191d1 100644 --- a/tests/Feature/Api/IncidentTest.php +++ b/tests/Feature/Api/IncidentTest.php @@ -358,6 +358,32 @@ expect($response->json('data.relationships.components.data'))->toHaveCount(2); }); +it('can create an incident with a legacy component payload', function () { + Sanctum::actingAs(User::factory()->create(), ['incidents.manage']); + + $component = Component::factory()->create(); + + $response = postJson('/status/api/incidents?include=components', [ + 'name' => 'Incident With Legacy Component', + 'message' => 'Something went wrong.', + 'status' => IncidentStatusEnum::investigating->value, + 'component_id' => $component->id, + 'component_status' => ComponentStatusEnum::major_outage->value, + ]); + + $response->assertCreated(); + + $incident = Incident::where('name', 'Incident With Legacy Component')->firstOrFail(); + + $this->assertDatabaseHas('incident_components', [ + 'incident_id' => $incident->id, + 'component_id' => $component->id, + 'component_status' => ComponentStatusEnum::major_outage->value, + ]); + + expect($response->json('data.relationships.components.data'))->toHaveCount(1); +}); + it('cannot create an incident with a template that does not exist', function () { Sanctum::actingAs(User::factory()->create(), ['incidents.manage']);