bowler/src/app/Http/Controllers/ProjectController.php

87 lines
2.3 KiB
PHP

<?php
namespace App\Http\Controllers;
use App\Http\Controllers\Concerns\SyncsChartExclusions;
use App\Models\Project;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Illuminate\View\View;
class ProjectController extends Controller
{
use SyncsChartExclusions;
public function index(Request $request): View
{
$projects = $request->user()->projects()
->withCount('entries')
->with('latestEntry', 'team', 'category')
->orderBy('name')
->get();
return view('projects.index', ['projects' => $projects]);
}
public function create(): View
{
return view('projects.create');
}
public function store(Request $request): RedirectResponse
{
$data = $request->validate(Project::validationRules($request->user()) + $this->chartRules());
$project = $request->user()->projects()->create($data);
$this->syncChartExclusions($request, $project);
return redirect()
->route('projects.entries.index', $project)
->with('status', "Project \"{$project->name}\" created. Add your first status entry below.");
}
public function edit(Project $project): View
{
$this->authorize('update', $project);
return view('projects.edit', ['project' => $project]);
}
public function update(Request $request, Project $project): RedirectResponse
{
$this->authorize('update', $project);
$data = $request->validate(Project::validationRules($project->user) + $this->chartRules());
$project->update($data);
$this->syncChartExclusions($request, $project);
return redirect()
->route('projects.index')
->with('status', "Project \"{$project->name}\" updated.");
}
/**
* @return array<string, array<int, string>>
*/
private function chartRules(): array
{
return [
'charts' => ['nullable', 'array'],
'charts.*' => ['integer'],
];
}
public function destroy(Project $project): RedirectResponse
{
$this->authorize('delete', $project);
$name = $project->name;
$project->delete();
return redirect()
->route('projects.index')
->with('status', "Project \"{$name}\" and all its entries deleted.");
}
}