setAdminPrefs(); $services = $this->siteStatusService->getAllServicesForAdmin(); $incidents = ServiceIncident::query() ->with(['services', 'creator']) ->orderByDesc('started_at') ->paginate(20) ->withQueryString(); $this->viewData = array_merge($this->viewData, [ 'services' => $services, 'incidents' => $incidents, 'meta_title' => 'Site status', 'title' => 'Site status', ]); return view('admin.status.index', $this->viewData); } /** * @throws \Exception */ public function create(): View { $this->setAdminPrefs(); $services = $this->siteStatusService->getAllServicesForAdmin(); $this->viewData = array_merge($this->viewData, [ 'services' => $services, 'meta_title' => 'Create incident', 'title' => 'Create incident', ]); return view('admin.status.create', $this->viewData); } public function store(StoreIncidentRequest $request): RedirectResponse { $data = $request->validated(); $data['created_by'] = Auth::id(); if ($data['status'] === IncidentStatusEnum::Resolved->value) { $data['resolved_at'] = $data['resolved_at'] ?? now()->toDateTimeString(); } $this->siteStatusService->createIncident($data); return redirect() ->route('admin.status.index') ->with('success', 'Incident created successfully.'); } /** * @throws \Exception */ public function edit(ServiceIncident $incident): View { $this->setAdminPrefs(); $services = $this->siteStatusService->getAllServicesForAdmin(); $this->viewData = array_merge($this->viewData, [ 'incident' => $incident->load(['services', 'creator']), 'services' => $services, 'meta_title' => 'Edit incident', 'title' => 'Edit incident', ]); return view('admin.status.edit', $this->viewData); } public function update(UpdateIncidentRequest $request, ServiceIncident $incident): RedirectResponse { $data = $request->validated(); if (($data['status'] ?? null) === IncidentStatusEnum::Resolved->value && empty($data['resolved_at'])) { $data['resolved_at'] = now()->toDateTimeString(); } if (($data['status'] ?? null) !== IncidentStatusEnum::Resolved->value) { $data['resolved_at'] = null; } $this->siteStatusService->updateIncident($incident, $data); return redirect() ->route('admin.status.index') ->with('success', 'Incident updated successfully.'); } public function resolve(ServiceIncident $incident): RedirectResponse { if ($incident->status === IncidentStatusEnum::Resolved) { return redirect() ->route('admin.status.index') ->with('info', 'Incident was already resolved.'); } $this->siteStatusService->resolveIncident($incident); return redirect() ->route('admin.status.index') ->with('success', 'Incident marked as resolved.'); } public function destroy(ServiceIncident $incident): RedirectResponse { $serviceIds = $incident->services()->pluck('id')->all(); $incident->delete(); foreach ($serviceIds as $serviceId) { $service = ServiceStatus::query()->find($serviceId); if ($service instanceof ServiceStatus) { $this->siteStatusService->recomputeServiceHealth($service); } } return redirect() ->route('admin.status.index') ->with('success', 'Incident deleted.'); } public function updateService(UpdateServiceHealthRequest $request, ServiceStatus $service): RedirectResponse { $status = ServiceStatusEnum::from($request->validated('status')); $this->siteStatusService->updateServiceStatus($service, $status); return redirect() ->route('admin.status.index') ->with('success', 'Service status updated.'); } }