feat: add likes to posts
This commit is contained in:
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user