ldc-legaulois/app/Http/Controllers/RecipesController.php

162 lines
5.9 KiB
PHP
Raw Normal View History

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-04-29 10:23:46 +02:00
use App\Enums\RecipeFilter;
use App\Enums\RecipeFilterTimes;
2021-02-09 09:50:17 +01:00
use App\Enums\RecipeType;
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;
2021-04-29 10:23:46 +02:00
use BadMethodCallException;
2021-02-19 15:24:28 +01:00
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
2021-02-09 09:50:17 +01:00
class RecipesController extends Controller
{
public function index(RecipeIndexRequest $request)
2021-02-09 09:50:17 +01:00
{
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', DB::table(resolve(Recipes::class)->getTable())
->select('id')->inRandomOrder()->get()->pluck('id')->toArray());
2021-02-09 09:50:17 +01:00
session()->save();
}
$recipes = Recipes::select('title', 'slug', 'picture', 'catch_phrase')
->where('status', true)
->orderByRaw(\sprintf('FIELD(id, %s)', implode(", ", session()->get('recipes.rand'))));
if ($request->search) {
$recipes = $recipes->where('title', 'like', '%' . implode('%', explode(' ', trim($request->search))) . '%');
2021-02-09 09:50:17 +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();
2021-03-21 22:51:19 +01:00
switch ($request->type) {
2021-04-29 10:23:46 +02:00
case RecipeFilter::range()->value:
2021-03-21 22:51:19 +01:00
$recipes = $recipes->whereHas('products.range', function ($q) use ($request) {
$q->where('ranges.slug', $request->value);
});
break;
2021-04-29 10:23:46 +02:00
case RecipeFilter::consumption()->value:
2021-03-21 22:51:19 +01:00
$recipes = $recipes->whereHas('consumptionTimes', function ($q) use ($request) {
$q->where('consumption_times.slug', $request->value);
});
break;
2021-04-29 10:23:46 +02:00
case RecipeFilter::cooking()->value:
case RecipeFilter::preparation()->value:
2021-03-21 22:51:19 +01:00
switch ($request->value) {
2021-04-29 10:23:46 +02:00
case RecipeFilterTimes::less15()->value:
$recipes = $recipes->where(
RecipeFilter::make($request->type)->getDefinition() . '_time',
'<=',
15
);
2021-03-21 22:51:19 +01:00
break;
2021-04-29 10:23:46 +02:00
case RecipeFilterTimes::between15and30()->value:
2021-03-21 22:51:19 +01:00
$recipes = $recipes
2021-04-29 10:23:46 +02:00
->where(RecipeFilter::make($request->type)->getDefinition() . '_time', '>=', 15)
->where(RecipeFilter::make($request->type)->getDefinition() . '_time', '<=', 30);
2021-03-21 22:51:19 +01:00
break;
default:
2021-04-29 10:23:46 +02:00
case RecipeFilterTimes::more30()->value:
2021-03-21 22:51:19 +01:00
$recipes = $recipes
2021-04-29 10:23:46 +02:00
->where(RecipeFilter::make($request->type)->getDefinition() . '_time', '>', 30);
2021-03-21 22:51:19 +01:00
break;
}
break;
2021-02-09 09:50:17 +01:00
}
$recipes = $recipes->paginate();
2021-04-29 10:23:46 +02:00
$type = $request->type ? RecipeFilter::make($request->type) : null;
try {
$value = $request->value ? RecipeFilterTimes::make($request->value) : null;
} catch (BadMethodCallException $e) {
$value = null;
}
2021-02-09 09:50:17 +01:00
return view('front.recipes.index', compact(
'recipes',
'ranges',
'consumptionTimes',
'type',
'value'
));
}
public function show(Recipes $recipe)
{
2021-04-28 13:57:12 +02:00
if (!$recipe->status) {
abort('404');
}
$recipe->load('products.range', 'articles', 'rating');
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));
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)
2021-04-29 17:33:05 +02:00
->where('status', true)
2021-02-10 14:34:24 +01:00
->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())
2021-04-29 17:33:05 +02:00
->where('status', true)
2021-02-10 14:34:24 +01:00
->limit($recipesLimit)
->inRandomOrder()
->orderBy('highlight', 'desc')
->get();
if (count($featuredRecipes) < $recipesLimit) {
2021-03-26 08:21:11 +01:00
$featuredRecipes = $featuredRecipes->merge(Recipes::query()
2021-04-29 17:33:05 +02:00
->where('status', true)
2021-02-10 14:34:24 +01:00
->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)
2021-04-28 13:57:12 +02:00
->where('type', $type)->where('status', true)->firstOrFail());
2021-02-19 15:24:28 +01:00
}
2021-02-09 09:50:17 +01:00
}