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; } }