Files
trackbugs/app/Http/Controllers/IssueController.php
T

151 lines
4.6 KiB
PHP
Raw Normal View History

2026-03-19 19:40:49 +02:00
<?php
namespace App\Http\Controllers;
use App\Models\Issue;
use App\Models\Project;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class IssueController extends Controller
{
public function index(Request $request, Project $project): View
{
2026-03-21 16:13:38 +02:00
$this->authorize('view', $project);
2026-03-19 19:40:49 +02:00
$query = $project->issues();
if ($status = $request->query('status')) {
$query->where('status', $status);
} else {
$query->where('status', 'unresolved');
}
if ($level = $request->query('level')) {
$query->where('level', $level);
}
if ($search = $request->query('search')) {
$query->where(function ($q) use ($search) {
$q->where('title', 'like', "%{$search}%")
->orWhere('culprit', 'like', "%{$search}%");
});
}
2026-03-21 15:25:05 +02:00
if ($environment = $request->query('environment')) {
$query->whereHas('events', function ($q) use ($environment) {
$q->where('environment', $environment);
});
}
2026-03-19 19:40:49 +02:00
$sortField = $request->query('sort', 'last_seen_at');
$sortDir = $request->query('dir', 'desc');
$allowedSorts = ['last_seen_at', 'first_seen_at', 'times_seen', 'level'];
if (in_array($sortField, $allowedSorts)) {
$query->orderBy($sortField, $sortDir === 'asc' ? 'asc' : 'desc');
}
$issues = $query->cursorPaginate(25)->withQueryString();
2026-03-21 15:25:05 +02:00
// Get distinct environments from events for this project
$environments = $project->events()
->whereNotNull('environment')
->distinct()
->pluck('environment')
->sort()
->values();
2026-03-19 19:40:49 +02:00
return view('issues.index', [
'project' => $project,
'issues' => $issues,
'currentStatus' => $status ?: 'unresolved',
'currentLevel' => $level,
2026-03-21 15:25:05 +02:00
'currentEnvironment' => $environment,
2026-03-19 19:40:49 +02:00
'search' => $search,
2026-03-21 15:25:05 +02:00
'environments' => $environments,
2026-03-19 19:40:49 +02:00
]);
}
public function show(Request $request, Project $project, Issue $issue): View
{
2026-03-21 16:13:38 +02:00
$this->authorize('view', $project);
2026-03-19 19:40:49 +02:00
abort_unless($issue->project_id === $project->id, 404);
2026-03-21 15:25:05 +02:00
$environment = $request->query('environment');
2026-03-19 19:40:49 +02:00
2026-03-21 15:25:05 +02:00
$eventsQuery = $issue->events();
if ($environment) {
$eventsQuery->where('environment', $environment);
}
$latestEvent = (clone $eventsQuery)->latest('timestamp')->first();
$events = $eventsQuery
2026-03-19 19:40:49 +02:00
->latest('timestamp')
->cursorPaginate(10)
->withQueryString();
2026-03-21 15:25:05 +02:00
// Get distinct environments for this issue
$environments = $issue->events()
->whereNotNull('environment')
->distinct()
->pluck('environment')
->sort()
->values();
2026-03-19 19:40:49 +02:00
return view('issues.show', [
'project' => $project,
'issue' => $issue,
'latestEvent' => $latestEvent,
'events' => $events,
2026-03-21 15:25:05 +02:00
'environments' => $environments,
'currentEnvironment' => $environment,
2026-03-19 19:40:49 +02:00
]);
}
public function updateStatus(Request $request, Project $project, Issue $issue): RedirectResponse
{
2026-03-21 16:13:38 +02:00
$this->authorize('view', $project);
2026-03-19 19:40:49 +02:00
abort_unless($issue->project_id === $project->id, 404);
$action = $request->input('action');
match ($action) {
'resolve' => $issue->resolve(),
'unresolve' => $issue->unresolve(),
'ignore' => $issue->ignore(),
'mute' => $issue->mute(),
default => null,
};
return back()->with('status', 'Issue ' . $action . 'd.');
}
public function bulkAction(Request $request, Project $project): RedirectResponse
{
2026-03-21 16:13:38 +02:00
$this->authorize('view', $project);
2026-03-19 19:40:49 +02:00
$validated = $request->validate([
'action' => 'required|in:resolve,ignore,mute,delete',
'issues' => 'required|array',
'issues.*' => 'string',
]);
$query = Issue::where('project_id', $project->id)
->whereIn('id', $validated['issues']);
match ($validated['action']) {
'resolve' => $query->update(['status' => 'resolved', 'is_regression' => false]),
'ignore' => $query->update(['status' => 'ignored']),
'mute' => $query->update(['status' => 'muted']),
'delete' => $query->delete(),
};
$count = count($validated['issues']);
return back()->with('status', "{$count} issue(s) {$validated['action']}d.");
}
}