78 lines
2.6 KiB
PHP
78 lines
2.6 KiB
PHP
<?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,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|