forked from eatvio/eatvio-infra
78 lines
2.1 KiB
PHP
Executable File
78 lines
2.1 KiB
PHP
Executable File
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use App\Models\Diet;
|
|
use App\Models\User;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Support\Facades\Gate;
|
|
use Illuminate\View\View;
|
|
use Spatie\QueryBuilder\AllowedFilter;
|
|
use Spatie\QueryBuilder\QueryBuilder;
|
|
|
|
class DietController extends Controller
|
|
{
|
|
public function index(Request $request): View
|
|
{
|
|
$hasTypes = [];
|
|
if ($request->has('author')) {
|
|
$author = $request->get('author');
|
|
$user = User::find($author);
|
|
$diets = $user ? $user->author_of_diets : [];
|
|
} else {
|
|
$hasTypes = data_get($request->get('filter'), 'contains_type', []);
|
|
$diets = QueryBuilder::for(Diet::class)
|
|
->allowedFilters([
|
|
'name',
|
|
AllowedFilter::callback('contains_type', function ($query, $v) use ($hasTypes) {
|
|
return $query->containsType($hasTypes);
|
|
}),
|
|
AllowedFilter::scope('duration_min'),
|
|
AllowedFilter::scope('duration_max'),
|
|
AllowedFilter::scope('involved_min'),
|
|
AllowedFilter::scope('involved_max'),
|
|
])
|
|
->get();
|
|
}
|
|
|
|
return view(
|
|
'diet/index',
|
|
[
|
|
'diets' => $diets,
|
|
'filter' => $request->get('filter'),
|
|
'hasTypes' => $hasTypes,
|
|
]
|
|
);
|
|
}
|
|
|
|
public function create(): View
|
|
{
|
|
return view('diet/edit_form');
|
|
}
|
|
|
|
public function edit(Diet $diet): View
|
|
{
|
|
if (! $this->canEditDiet($diet)) {
|
|
abort(403, 'Unauthorized action.');
|
|
}
|
|
|
|
return view('diet/edit_form', ['diet' => $diet]);
|
|
}
|
|
|
|
public function show(Diet $diet): View
|
|
{
|
|
$expiresAt = now()->addHours(24);
|
|
|
|
views($diet)
|
|
->cooldown($expiresAt)
|
|
->record();
|
|
|
|
return view('diet/show', ['diet' => $diet]);
|
|
}
|
|
|
|
private function canEditDiet(Diet $diet): bool
|
|
{
|
|
return Gate::allows('edit', $diet);
|
|
}
|
|
}
|