125 lines
3.8 KiB
PHP
125 lines
3.8 KiB
PHP
<?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
|
||
|
|
{
|
||
|
|
$this->authorizeProject($request, $project);
|
||
|
|
|
||
|
|
$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}%");
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
$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();
|
||
|
|
|
||
|
|
return view('issues.index', [
|
||
|
|
'project' => $project,
|
||
|
|
'issues' => $issues,
|
||
|
|
'currentStatus' => $status ?: 'unresolved',
|
||
|
|
'currentLevel' => $level,
|
||
|
|
'search' => $search,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function show(Request $request, Project $project, Issue $issue): View
|
||
|
|
{
|
||
|
|
$this->authorizeProject($request, $project);
|
||
|
|
abort_unless($issue->project_id === $project->id, 404);
|
||
|
|
|
||
|
|
$latestEvent = $issue->events()->latest('timestamp')->first();
|
||
|
|
|
||
|
|
$events = $issue->events()
|
||
|
|
->latest('timestamp')
|
||
|
|
->cursorPaginate(10)
|
||
|
|
->withQueryString();
|
||
|
|
|
||
|
|
return view('issues.show', [
|
||
|
|
'project' => $project,
|
||
|
|
'issue' => $issue,
|
||
|
|
'latestEvent' => $latestEvent,
|
||
|
|
'events' => $events,
|
||
|
|
]);
|
||
|
|
}
|
||
|
|
|
||
|
|
public function updateStatus(Request $request, Project $project, Issue $issue): RedirectResponse
|
||
|
|
{
|
||
|
|
$this->authorizeProject($request, $project);
|
||
|
|
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
|
||
|
|
{
|
||
|
|
$this->authorizeProject($request, $project);
|
||
|
|
|
||
|
|
$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.");
|
||
|
|
}
|
||
|
|
|
||
|
|
private function authorizeProject(Request $request, Project $project): void
|
||
|
|
{
|
||
|
|
abort_unless(
|
||
|
|
$request->user()->projects()->where('projects.id', $project->id)->exists(),
|
||
|
|
403,
|
||
|
|
);
|
||
|
|
}
|
||
|
|
}
|