authorizeProject($request, $project); $rules = collect(['new_issue', 'regression', 'spike'])->map(function ($type) use ($project) { return $project->alertRules()->firstOrCreate( ['type' => $type], ['enabled' => true, 'config' => $type === 'spike' ? ['threshold' => 10, 'window_minutes' => 5] : null], ); }); $preference = $request->user()->notificationPreferenceFor($project); return view('projects.alerts', [ 'project' => $project, 'rules' => $rules->keyBy('type'), 'preference' => $preference, ]); } public function update(Request $request, Project $project): RedirectResponse { $this->authorizeProject($request, $project); foreach (['new_issue', 'regression', 'spike'] as $type) { $rule = $project->alertRules()->where('type', $type)->first(); if ($rule) { $rule->update(['enabled' => $request->boolean("rules.{$type}.enabled")]); if ($type === 'spike') { $rule->update([ 'config' => [ 'threshold' => max(1, (int) $request->input('rules.spike.threshold', 10)), 'window_minutes' => max(1, (int) $request->input('rules.spike.window_minutes', 5)), ], ]); } } } return back()->with('status', 'Alert rules updated.'); } public function updatePreference(Request $request, Project $project): RedirectResponse { $this->authorizeProject($request, $project); $pref = $request->user()->notificationPreferenceFor($project); $pref->update([ 'email_enabled' => $request->boolean('email_enabled'), 'database_enabled' => $request->boolean('database_enabled'), 'muted' => $request->boolean('muted'), ]); return back()->with('status', 'Notification preferences updated.'); } private function authorizeProject(Request $request, Project $project): void { abort_unless( $request->user()->projects()->where('projects.id', $project->id)->exists(), 403, ); } }