feat: add likes to posts

This commit is contained in:
2026-05-18 21:16:02 +02:00
parent d706dd587a
commit bb409610a8
7 changed files with 156 additions and 5 deletions
+32 -5
View File
@@ -9,6 +9,7 @@ use App\Http\Resources\MealPostsResource;
use App\Models\MealPosts;
use Carbon\CarbonImmutable;
use Carbon\CarbonInterface;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse;
use Illuminate\Http\Request;
use Illuminate\Http\Resources\Json\AnonymousResourceCollection;
@@ -24,6 +25,10 @@ class MealPostController extends Controller
$mealPosts = MealPosts::query()
->with('user:id,name,avatar_url')
->withCount('likedByUsers')
->withExists([
'likedByUsers as liked_by_current_user' => fn (Builder $query): Builder => $query->whereKey($request->user()->getKey()),
])
->latest('eaten_at')
->paginate($perPage)
->withQueryString();
@@ -116,17 +121,15 @@ class MealPostController extends Controller
});
$mealPost->setRelation('user', $request->user());
$mealPost->loadMissing('ingredients');
return (new MealPostsResource($mealPost))
return (new MealPostsResource($this->loadMealPostForResponse($mealPost, $request)))
->response()
->setStatusCode(201);
}
public function show(Request $request, MealPosts $mealPost): MealPostsResource
{
return new MealPostsResource($mealPost->loadMissing('user:id,name,avatar_url', 'ingredients'));
return new MealPostsResource($this->loadMealPostForResponse($mealPost, $request));
}
public function update(MealPostsRequest $request, MealPosts $mealPost): MealPostsResource
@@ -155,7 +158,21 @@ class MealPostController extends Controller
return $mealPost->refresh();
});
return new MealPostsResource($mealPost->loadMissing('user:id,name,avatar_url', 'ingredients'));
return new MealPostsResource($this->loadMealPostForResponse($mealPost, $request));
}
public function like(Request $request, MealPosts $mealPost): MealPostsResource
{
$mealPost->likedByUsers()->syncWithoutDetaching([$request->user()->getKey()]);
return new MealPostsResource($this->loadMealPostForResponse($mealPost, $request));
}
public function unlike(Request $request, MealPosts $mealPost): MealPostsResource
{
$mealPost->likedByUsers()->detach($request->user()->getKey());
return new MealPostsResource($this->loadMealPostForResponse($mealPost, $request));
}
public function destroy(Request $request, MealPosts $mealPost): Response
@@ -173,6 +190,16 @@ class MealPostController extends Controller
abort_unless($mealPost->user_id === $request->user()->getKey(), 404);
}
private function loadMealPostForResponse(MealPosts $mealPost, Request $request): MealPosts
{
return $mealPost
->loadMissing('user:id,name,avatar_url', 'ingredients')
->loadCount('likedByUsers')
->loadExists([
'likedByUsers as liked_by_current_user' => fn (Builder $query): Builder => $query->whereKey($request->user()->getKey()),
]);
}
private function getValidatedDataWithImageUrl(MealPostsRequest $request): array
{
$data = $request->validated();