82 lines
2.5 KiB
PHP
82 lines
2.5 KiB
PHP
<?php
|
|
|
|
declare(strict_types=1);
|
|
|
|
namespace App\Http\Controllers\Api\V1;
|
|
|
|
use App\Http\Controllers\Controller;
|
|
use App\Http\Requests\Api\V1\TalkRequest;
|
|
use App\Http\Resources\TalkResource;
|
|
use App\Models\Talk;
|
|
use App\Support\TranslatablePayload;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
|
|
|
|
/**
|
|
* Talks given elsewhere. Deleted for good: there is no bin for them.
|
|
*/
|
|
class TalkController extends Controller
|
|
{
|
|
/**
|
|
* Filters: is_public, member_id, project_id, search (title or event).
|
|
*/
|
|
public function index(Request $request): AnonymousResourceCollection
|
|
{
|
|
$this->authorize('viewAny', Talk::class);
|
|
|
|
$talks = Talk::query()
|
|
->when($request->has('is_public'), fn ($q) => $q->where('is_public', $request->boolean('is_public')))
|
|
->when($request->filled('member_id'), fn ($q) => $q->where('member_id', $request->integer('member_id')))
|
|
->when($request->filled('project_id'), fn ($q) => $q->where('project_id', $request->integer('project_id')))
|
|
->when($request->filled('search'), function ($q) use ($request): void {
|
|
$term = '%'.$request->string('search').'%';
|
|
|
|
$q->where(fn ($q) => $q->where('title', 'like', $term)->orWhere('event', 'like', $term));
|
|
})
|
|
->recentFirst()
|
|
->paginate(perPage: min($request->integer('per_page', 25), 100))
|
|
->withQueryString();
|
|
|
|
return TalkResource::collection($talks);
|
|
}
|
|
|
|
public function store(TalkRequest $request): JsonResponse
|
|
{
|
|
$this->authorize('create', Talk::class);
|
|
|
|
return TalkResource::make($this->save(new Talk, $request))->response()->setStatusCode(201);
|
|
}
|
|
|
|
public function show(Talk $talk): TalkResource
|
|
{
|
|
$this->authorize('view', $talk);
|
|
|
|
return TalkResource::make($talk);
|
|
}
|
|
|
|
public function update(TalkRequest $request, Talk $talk): TalkResource
|
|
{
|
|
$this->authorize('update', $talk);
|
|
|
|
return TalkResource::make($this->save($talk, $request));
|
|
}
|
|
|
|
public function destroy(Talk $talk): JsonResponse
|
|
{
|
|
$this->authorize('delete', $talk);
|
|
|
|
$talk->delete();
|
|
|
|
return response()->json(status: 204);
|
|
}
|
|
|
|
protected function save(Talk $talk, TalkRequest $request): Talk
|
|
{
|
|
$talk->fill(TranslatablePayload::merge($talk, $request->validated(), $talk->translatable));
|
|
$talk->save();
|
|
|
|
return $talk;
|
|
}
|
|
}
|