integer('per_page', 15), 100)); $mealPosts = MealPosts::query() ->where('user_id', $request->user()->getKey()) ->with('user:id,name,avatar_url') ->latest('eaten_at') ->paginate($perPage) ->withQueryString(); return MealPostsResource::collection($mealPosts); } public function store(MealPostsRequest $request): JsonResponse { $mealPost = MealPosts::create([ ...$this->getValidatedDataWithImageUrl($request), 'user_id' => $request->user()->getKey(), ]); $mealPost->setRelation('user', $request->user()); return (new MealPostsResource($mealPost)) ->response() ->setStatusCode(201); } public function show(Request $request, MealPosts $mealPost): MealPostsResource { $this->abortIfNotOwner($request, $mealPost); return new MealPostsResource($mealPost->loadMissing('user:id,name,avatar_url')); } public function update(MealPostsRequest $request, MealPosts $mealPost): MealPostsResource { $this->abortIfNotOwner($request, $mealPost); $mealPost->update($this->getValidatedDataWithImageUrl($request)); return new MealPostsResource($mealPost->refresh()->loadMissing('user:id,name,avatar_url')); } public function destroy(Request $request, MealPosts $mealPost): Response { $this->abortIfNotOwner($request, $mealPost); $mealPost->delete(); return response()->noContent(); } private function abortIfNotOwner(Request $request, MealPosts $mealPost): void { abort_unless($request->user(), 401); abort_unless($mealPost->user_id === $request->user()->getKey(), 404); } private function getValidatedDataWithImageUrl(MealPostsRequest $request): array { $data = $request->validated(); if ($request->hasFile('image')) { $path = $request->file('image')->store('meal-posts', 'public'); $data['image_url'] = asset(Storage::url($path)); } unset($data['image']); return $data; } }