Skip to content

Commit eaaa78f

Browse files
authored
Merge pull request #99 from Rudey-ua/development
Added pagination & filters to premium recipes
2 parents 3b5717a + 8d8f413 commit eaaa78f

File tree

2 files changed

+45
-41
lines changed

2 files changed

+45
-41
lines changed

app/Http/Controllers/API/RecipeController.php

+12-34
Original file line numberDiff line numberDiff line change
@@ -32,30 +32,8 @@ public function index(RecipeFilterRequest $request)
3232
{
3333
$members = User::role(config('permission.user_roles.member'))->pluck('id');
3434

35-
$recipes = Recipe::whereIn('user_id', $members)
36-
->where('is_published', true)
37-
38-
->when($request->title, function ($query, $title) {
39-
return $query->where('title', 'like', '%' . $title . '%');
40-
})
41-
->when($request->tags, function ($query, $tags) {
42-
return $query->whereHas('tags', function ($query) use ($tags) {
43-
$query->whereIn('tag_id', $tags);
44-
});
45-
})->get();
46-
47-
switch ($request->sort) {
48-
case 'rating_asc':
49-
$recipes = $recipes->sortBy(function ($recipe) {
50-
return $recipe->countAverageRatingForRecipe();
51-
});
52-
break;
53-
case 'rating_desc':
54-
$recipes = $recipes->sortByDesc(function ($recipe) {
55-
return $recipe->countAverageRatingForRecipe();
56-
});
57-
break;
58-
}
35+
$recipes = $this->recipeRepository->getPublishedRecipesFromMembers($members, $request);
36+
$recipes = $this->recipeRepository->applySorting($request, $recipes);
5937

6038
return ShortRecipeResource::collection($recipes);
6139
}
@@ -94,22 +72,22 @@ public function update(RecipeRequest $recipeRequest, int $id)
9472
return new RecipeResource($recipe);
9573
}
9674

97-
public function destroy(int $id)
98-
{
99-
Recipe::findOrFail($id)->delete();
100-
return $this->respondNoContent();
101-
}
102-
103-
public function getPremiumRecipes()
75+
public function getPremiumRecipes(RecipeFilterRequest $request)
10476
{
10577
if (is_null($this->subscriptionRepository->getActiveSubscription(Auth::id()))) {
10678
return $this->respondError(__("You don't have an active subscription!"));
10779
}
10880
$chiefs = User::role(config('permission.user_roles.chief'))->pluck('id');
109-
$recipes = Recipe::whereIn('user_id', $chiefs)
110-
->where('is_published', true)
111-
->get();
81+
82+
$recipes = $this->recipeRepository->getPublishedRecipesFromMembers($chiefs, $request);
83+
$recipes = $this->recipeRepository->applySorting($request, $recipes);
11284

11385
return PremiumRecipeResource::collection($recipes);
11486
}
87+
88+
public function destroy(int $id)
89+
{
90+
Recipe::findOrFail($id)->delete();
91+
return $this->respondNoContent();
92+
}
11593
}

app/Repositories/RecipeRepository.php

+33-7
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
use App\Models\Recipe;
88
use App\Models\Step;
99
use App\Traits\FIleTrait;
10+
use Illuminate\Http\Request;
11+
use Illuminate\Support\Collection;
1012
use Illuminate\Support\Facades\DB;
1113

1214
class RecipeRepository
@@ -24,7 +26,6 @@ public function createRecipeWithDetails(RecipeData $recipeData): Recipe
2426
$recipe = $this->createRecipe($recipeData);
2527
$this->createIngredients($recipe->id, $recipeData->ingredients);
2628
$this->createSteps($recipe->id, $recipeData->steps);
27-
//!empty($recipeData->tags) ? $this->syncTags($recipe, $recipeData->tags) : null;
2829

2930
if (!empty($recipeData->tags)) {
3031
$this->updateTags($recipe, $recipeData->tags);
@@ -66,11 +67,6 @@ protected function createSteps(int $recipeId, array $steps): void
6667
}
6768
}
6869

69-
/*protected function syncTags(Recipe $recipe, array $tagIds): void
70-
{
71-
$recipe->tags()->sync($tagIds);
72-
}*/
73-
7470
protected function updateTags(Recipe $recipe, array $tagIds): void
7571
{
7672
$recipe->tags()->detach();
@@ -86,7 +82,6 @@ public function updateRecipeWithDetails(int $recipeId, RecipeData $recipeData):
8682
$recipe = $this->updateRecipe($recipeId, $recipeData);
8783
$this->updateIngredients($recipeId, $recipeData->ingredients);
8884
$this->updateSteps($recipeId, $recipeData->steps);
89-
//!empty($recipeData->tags) ? $this->syncTags($recipe, $recipeData->tags) : null;
9085

9186
if (!empty($recipeData->tags)) {
9287
$this->updateTags($recipe, $recipeData->tags);
@@ -144,4 +139,35 @@ protected function updateSteps(int $recipeId, array $steps): void
144139
$this->stepModel->create(array_merge($stepDataArray, ['recipe_id' => $recipeId]));
145140
}
146141
}
142+
143+
public function getPublishedRecipesFromMembers(Collection $users, Request $request)
144+
{
145+
return Recipe::whereIn('user_id', $users)
146+
->where('is_published', true)
147+
148+
->when($request->title, function ($query, $title) {
149+
return $query->where('title', 'like', '%' . $title . '%');
150+
})
151+
->when($request->tags, function ($query, $tags) {
152+
return $query->whereHas('tags', function ($query) use ($tags) {
153+
$query->whereIn('tag_id', $tags);
154+
});
155+
})->paginate(2);
156+
}
157+
158+
public function applySorting(Request $request, $recipes) {
159+
switch ($request->sort) {
160+
case 'rating_asc':
161+
$recipes = $recipes->sortBy(function ($recipe) {
162+
return $recipe->countAverageRatingForRecipe();
163+
});
164+
break;
165+
case 'rating_desc':
166+
$recipes = $recipes->sortByDesc(function ($recipe) {
167+
return $recipe->countAverageRatingForRecipe();
168+
});
169+
break;
170+
}
171+
return $recipes;
172+
}
147173
}

0 commit comments

Comments
 (0)