authorize('viewAny', Member::class); $members = Member::query() ->with(self::WITH) ->when($request->filled('search'), fn ($q) => $q->where('name', 'like', '%'.$request->string('search').'%')) ->when($request->has('is_public'), fn ($q) => $q->where('is_public', $request->boolean('is_public'))) ->when($request->boolean('trashed'), fn ($q) => $q->onlyTrashed()) ->orderBy('position') ->orderBy('name') ->paginate(perPage: min($request->integer('per_page', 25), 100)) ->withQueryString(); return MemberResource::collection($members); } public function store(MemberRequest $request): JsonResponse { $this->authorize('create', Member::class); return MemberResource::make($this->save(new Member, $request))->response()->setStatusCode(201); } public function show(Member $member): MemberResource { $this->authorize('view', $member); return MemberResource::make($member->load(self::WITH)); } public function update(MemberRequest $request, Member $member): MemberResource { $this->authorize('update', $member); return MemberResource::make($this->save($member, $request)); } public function destroy(Member $member): JsonResponse { $this->authorize('delete', $member); $member->delete(); return response()->json(status: 204); } public function restore(Member $member): MemberResource { $this->authorize('restore', $member); $member->restore(); return MemberResource::make($member->load(self::WITH)); } protected function save(Member $member, MemberRequest $request): Member { $data = $request->validated(); DB::transaction(function () use ($member, $data): void { $member->fill(TranslatablePayload::merge( $member, collect($data)->except('technology_ids')->all(), $member->translatable, )); $member->save(); if (array_key_exists('technology_ids', $data)) { $member->technologies()->sync($data['technology_ids']); } }); return $member->load(self::WITH); } }