2021-02-09 09:50:17 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
|
|
2021-02-19 15:24:28 +01:00
|
|
|
use App\Enums\BalancedMenuType;
|
2021-02-09 09:50:17 +01:00
|
|
|
use App\Enums\RecipeType;
|
2021-02-10 17:49:13 +01:00
|
|
|
use App\Http\Requests\RecipeIndexRequest;
|
2021-02-10 11:38:29 +01:00
|
|
|
use App\Http\Requests\RecipeRateRequest;
|
2021-02-19 15:24:28 +01:00
|
|
|
use App\Models\BalancedMenus;
|
2021-02-09 09:50:17 +01:00
|
|
|
use App\Models\ConsumptionTimes;
|
2021-02-19 15:24:28 +01:00
|
|
|
use App\Models\Products;
|
2021-02-09 09:50:17 +01:00
|
|
|
use App\Models\Ranges;
|
|
|
|
|
use App\Models\Recipes;
|
|
|
|
|
use Illuminate\Database\Eloquent\ModelNotFoundException;
|
2021-02-19 15:24:28 +01:00
|
|
|
use Illuminate\Http\Request;
|
2021-02-09 09:50:17 +01:00
|
|
|
|
|
|
|
|
class RecipesController extends Controller
|
|
|
|
|
{
|
2021-02-10 17:49:13 +01:00
|
|
|
public function index(RecipeIndexRequest $request)
|
2021-02-09 09:50:17 +01:00
|
|
|
{
|
|
|
|
|
// @phpcs:disable PSR2.ControlStructures.ControlStructureSpacing.SpacingAfterOpenBrace
|
|
|
|
|
if (
|
|
|
|
|
!session()->has('recipes.rand') ||
|
|
|
|
|
(intval(session()->get('recipes.time', time())) - intval(time())) > (60 * 60 * 60) // 1 hour
|
|
|
|
|
) {
|
|
|
|
|
session()->put('recipes.time', time());
|
|
|
|
|
session()->put('recipes.rand', Recipes::all('id')->shuffle()->map(function ($obj) {
|
|
|
|
|
return $obj->id;
|
|
|
|
|
})->toArray());
|
|
|
|
|
session()->save();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$recipes = Recipes::select('title', 'slug', 'picture', 'catch_phrase')
|
|
|
|
|
->where('status', true)
|
|
|
|
|
->orderByRaw(\sprintf('FIELD(id, %s)', implode(", ", session()->get('recipes.rand'))));
|
|
|
|
|
|
2021-02-10 17:49:13 +01:00
|
|
|
if ($request->search) {
|
|
|
|
|
$recipes = $recipes->where('title', 'like', '%' . implode('%', explode(' ', trim($request->search))) . '%');
|
2021-02-09 09:50:17 +01:00
|
|
|
}
|
2021-02-10 17:49:13 +01:00
|
|
|
if ($request->video_recipe) {
|
2021-02-09 09:50:17 +01:00
|
|
|
$recipes = $recipes->where('type', '=', RecipeType::video()->value);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
$ranges = Ranges::select('name', 'slug')
|
|
|
|
|
->where('status', true)
|
|
|
|
|
->orderBy('order')
|
|
|
|
|
->get();
|
|
|
|
|
|
|
|
|
|
$consumptionTimes = ConsumptionTimes::select('name', 'slug')
|
|
|
|
|
->where('status', true)
|
|
|
|
|
->get();
|
|
|
|
|
|
|
|
|
|
try {
|
2021-02-10 17:49:13 +01:00
|
|
|
switch ($request->type) {
|
2021-02-09 09:50:17 +01:00
|
|
|
case 'range':
|
2021-02-10 17:49:13 +01:00
|
|
|
$recipes = $recipes->whereHas('products.range', function ($q) use ($request) {
|
|
|
|
|
$q->where('ranges.slug', $request->value);
|
2021-02-09 09:50:17 +01:00
|
|
|
});
|
|
|
|
|
break;
|
|
|
|
|
case 'consumption':
|
2021-02-10 17:49:13 +01:00
|
|
|
$recipes = $recipes->whereHas('consumptionTimes', function ($q) use ($request) {
|
|
|
|
|
$q->where('consumption_times.slug', $request->value);
|
2021-02-09 09:50:17 +01:00
|
|
|
});
|
|
|
|
|
break;
|
|
|
|
|
case 'preparation':
|
2021-02-10 17:49:13 +01:00
|
|
|
switch ($request->value) {
|
2021-02-09 09:50:17 +01:00
|
|
|
case 'less15':
|
|
|
|
|
$recipes = $recipes->where('preparation_time', '<=', 15);
|
|
|
|
|
break;
|
|
|
|
|
case '15and30':
|
|
|
|
|
$recipes = $recipes
|
|
|
|
|
->where('preparation_time', '>=', 15)
|
|
|
|
|
->where('preparation_time', '<=', 30);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
case 'more30':
|
|
|
|
|
$recipes = $recipes
|
|
|
|
|
->where('preparation_time', '>', 30);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
case 'cooking':
|
2021-02-10 17:49:13 +01:00
|
|
|
switch ($request->value) {
|
2021-02-09 09:50:17 +01:00
|
|
|
case 'less15':
|
|
|
|
|
$recipes = $recipes->where('cooking_time', '<=', 15);
|
|
|
|
|
break;
|
|
|
|
|
case '15and30':
|
|
|
|
|
$recipes = $recipes
|
|
|
|
|
->where('cooking_time', '>=', 15)
|
|
|
|
|
->where('cooking_time', '<=', 30);
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
case 'more30':
|
|
|
|
|
$recipes = $recipes
|
|
|
|
|
->where('cooking_time', '>', 30);
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
} catch (ModelNotFoundException $e) {
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
$recipes = $recipes->paginate();
|
2021-02-10 17:49:13 +01:00
|
|
|
$type = $request->type;
|
|
|
|
|
$value = $request->value;
|
2021-02-09 09:50:17 +01:00
|
|
|
|
|
|
|
|
return view('front.recipes.index', compact(
|
|
|
|
|
'recipes',
|
|
|
|
|
'ranges',
|
|
|
|
|
'consumptionTimes',
|
|
|
|
|
'type',
|
|
|
|
|
'value'
|
|
|
|
|
));
|
|
|
|
|
}
|
2021-02-09 18:43:11 +01:00
|
|
|
|
|
|
|
|
public function show(Recipes $recipe)
|
|
|
|
|
{
|
2021-02-10 11:38:29 +01:00
|
|
|
$recipe->load('products', 'articles', 'rating');
|
2021-02-09 18:43:11 +01:00
|
|
|
return view('front.recipes.show', compact('recipe'));
|
|
|
|
|
}
|
2021-02-10 11:38:29 +01:00
|
|
|
|
|
|
|
|
public function rate(Recipes $recipe, RecipeRateRequest $request)
|
|
|
|
|
{
|
|
|
|
|
if ($recipe->hasBeenRatedByUser()) {
|
|
|
|
|
return response()->json($recipe->rating->rating);
|
|
|
|
|
}
|
|
|
|
|
$recipe->setRateForUserAndSave($request->post('rating', 0));
|
2021-02-19 19:05:06 +01:00
|
|
|
return response()->json(floatval($request->post('rating', 0)));
|
2021-02-10 11:38:29 +01:00
|
|
|
}
|
2021-02-10 14:34:24 +01:00
|
|
|
|
|
|
|
|
public function kitchenside()
|
|
|
|
|
{
|
|
|
|
|
$recipesLimit = 3;
|
|
|
|
|
$featuredRecipes = Recipes::where('highlight', true)
|
|
|
|
|
->where('type', RecipeType::classic())
|
|
|
|
|
->limit($recipesLimit)
|
|
|
|
|
->inRandomOrder()
|
|
|
|
|
->get();
|
|
|
|
|
// TODO: Create video recipes to test query and css in front
|
|
|
|
|
$videoRecipes = Recipes::where('type', RecipeType::video())
|
|
|
|
|
->limit($recipesLimit)
|
|
|
|
|
->inRandomOrder()
|
|
|
|
|
->orderBy('highlight', 'desc')
|
|
|
|
|
->get();
|
|
|
|
|
if (count($featuredRecipes) < $recipesLimit) {
|
|
|
|
|
$featuredRecipes = $featuredRecipes->merge(Recipes::all()
|
|
|
|
|
->inRandomOrder()
|
|
|
|
|
->limit($recipesLimit - count($featuredRecipes))
|
|
|
|
|
->get());
|
|
|
|
|
}
|
|
|
|
|
return view('front.kitchenside', compact('featuredRecipes', 'videoRecipes'));
|
|
|
|
|
}
|
2021-02-19 15:24:28 +01:00
|
|
|
|
|
|
|
|
public function showForBalancedMenu(BalancedMenuType $type, Products $product, Request $request)
|
|
|
|
|
{
|
|
|
|
|
if (!$request->ajax()) {
|
|
|
|
|
abort(400);
|
|
|
|
|
}
|
|
|
|
|
// NE vérifie pas balancedmenu status car il faut afficher la recette du produit si il est publié
|
|
|
|
|
return response()->json(BalancedMenus::where('product_id', $product->id)
|
|
|
|
|
->where('type', $type)->firstOrFail());
|
|
|
|
|
}
|
2021-02-09 09:50:17 +01:00
|
|
|
}
|