authorize('viewAny', Call::class); $locale = app()->getLocale(); $calls = Call::query() ->with(self::WITH) ->withCount('applications') ->when($request->filled('status'), fn ($q) => $q->where('status', $request->string('status'))) ->when($request->filled('project_id'), fn ($q) => $q->where('project_id', $request->integer('project_id'))) ->when($request->filled('search'), fn ($q) => $q->where("title->{$locale}", 'like', '%'.$request->string('search').'%')) ->latest('id') ->paginate(perPage: min($request->integer('per_page', 25), 100)) ->withQueryString(); return CallResource::collection($calls); } public function store(CallRequest $request): JsonResponse { $this->authorize('create', Call::class); return CallResource::make($this->save(new Call, $request))->response()->setStatusCode(201); } public function show(Call $call): CallResource { $this->authorize('view', $call); return CallResource::make($call->load(self::WITH)->loadCount('applications')); } public function update(CallRequest $request, Call $call): CallResource { $this->authorize('update', $call); return CallResource::make($this->save($call, $request)); } public function destroy(Call $call): JsonResponse { $this->authorize('delete', $call); $call->delete(); return response()->json(status: 204); } protected function save(Call $call, CallRequest $request): Call { $data = $request->validated(); DB::transaction(function () use ($call, $data): void { $call->fill(TranslatablePayload::merge( $call, collect($data)->except(['technology_ids'])->all(), $call->translatable, )); $call->save(); if (array_key_exists('technology_ids', $data)) { $call->technologies()->sync($data['technology_ids']); } }); return $call->load(self::WITH)->loadCount('applications'); } }