Files

78 lines
2.6 KiB
PHP
Raw Permalink Normal View History

2026-03-19 19:47:06 +02:00
<?php
namespace App\Http\Controllers;
use App\Models\AlertRule;
use App\Models\Project;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class AlertRuleController extends Controller
{
public function edit(Request $request, Project $project): View
{
$this->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,
);
}
}