ldc-le-gaulois-pro/app/Http/Requests/Bo/Advice/StoreAdviceRequest.php

257 lines
12 KiB
PHP

<?php
namespace App\Http\Requests\Bo\Advice;
use App\Enums\Advices\AdviceDifficultyEnum;
use App\Enums\Advices\AdviceTypeEnum;
use App\Rules\WysiwygLength;
use App\Traits\Requests\HasPicture;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Support\Str;
use Illuminate\Validation\Rule;
use Illuminate\Validation\Rules\Enum;
class StoreAdviceRequest extends FormRequest
{
use HasPicture;
/**
* Determine if the user is authorized to make this request.
*
* @return boolean
*/
public function authorize(): bool
{
return auth('backend')->check();
}
/**
* Prepare the data for validation.
*
* @return void
* @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh, Squiz.Commenting.FunctionComment.Missing
*/
protected function prepareForValidation(): void
{
//phpcs:enable
$this->merge([
'slug' => Str::slug(strip_tags($this->input('title'))),
'published' => $this->boolean('published'),
'tags' => $this->input('tags', []),
'products' => $this->input('products', []),
'associated_tips_list' => $this->input('associated_tips_list', []),
'associated_recipes_list' => $this->input('associated_recipes_list', []),
// * For sync relations
'tags_list' => \collect($this->input('tags'))->map(function ($value) {
return \is_array($value) ? ($value['value'] ?? null) : null;
})->filter()->all(),
'products_list' => \collect($this->input('products'))->map(function ($value) {
return \is_array($value) ? ($value['value'] ?? null) : null;
})->filter()->all(),
'tips_list' => \collect($this->input('tips'))->map(function ($value) {
return \is_array($value) ? ($value['value'] ?? null) : null;
})->filter()->all(),
'recipes_list' => \collect($this->input('recipes'))->map(function ($value) {
return \is_array($value) ? ($value['value'] ?? null) : null;
})->filter()->all(),
]);
$this->mergePicture('picture');
$this->mergePicture('sticker');
$this->mergePicture('sticker_sm');
}
/**
* Get the validation rules that apply to the request.
*
* @return array
* @phpcs:disable Generic.Metrics.CyclomaticComplexity.TooHigh, Squiz.Commenting.FunctionComment.Missing
*/
public function rules(): array
{
//phpcs:enable
$rules = [
'title' => 'required|min:3|max:255',
'seo_title' => 'required|min:45|max:70',
'seo_description' => 'required|min:50|max:160',
'type' => ['required', new Enum(AdviceTypeEnum::class)],
'picture_alt' => 'required_with:picture|nullable|min:3|max:255',
'picture_title' => 'required_with:picture|nullable|min:3|max:255',
'sticker_alt' => 'required_with:sticker|nullable|min:3|max:255',
'sticker_title' => 'required_with:sticker|nullable|min:3|max:255',
'sticker_sm_alt' => 'required_with:sticker_sm|nullable|min:3|max:255',
'sticker_sm_title' => 'required_with:sticker_sm|nullable|min:3|max:255',
'preparation' => [
'required',
'string',
new WysiwygLength(15, 2500)
],
'advice' => [
'nullable',
'string',
new WysiwygLength(15, 2500)
],
'ingredients' => [
'present',
'array',
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed
function ($attribute, array $value, $fail) {
if (count($value) < 1 || count($value) > 15) {
$fail(\trans('Vous devez associer 1 à 15 lignes d\'ingrédients.'));
}
}
],
'ingredients.*' => 'required|array',
'ingredients.*.value' => 'nullable|regex:/^\d*\.?\d{0,1}$/|between:0,65535',
'ingredients.*.label' => [
Rule::requiredIf(function () {
return $this->type === AdviceTypeEnum::recipes->value();
}),
//phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed
function ($attribute, $value, $fail) {
if ($this->type == AdviceTypeEnum::recipes->value()) {
if (!$value) {
$fail(\trans('Le champ description de l\'ingrédient doit être une chaîne de caractères.'));
}
if (strlen($value) < 3) {
$fail(\trans('Le texte description de l\'ingrédient doit contenir au moins 3 caractères.'));
}
}
},
'max:255'
],
'guests_nb' => [
//phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed
function ($attribute, $value, $fail) {
if (
\is_array($this->ingredients) and
count($this->ingredients) and
!$value
) {
$fail(\trans('Le nombre de convives est obligatoire'));
}
},
'nullable',
'numeric',
'min:1',
'max:99'
],
'youtube_title' => 'required_with:youtube_video_id|nullable|min:3|max:255',
'youtube_video_id' => 'required_with:youtube_title|nullable|min:3|max:50|regex:%([^"&?\/\s]{11})%i',
'cooking_time' => 'nullable|numeric|min:0|max:65535',
'preparation_time' => [
Rule::requiredIf(function () {
return $this->type === AdviceTypeEnum::recipes->value();
}),
'numeric',
'min:0',
'max:65535'
],
'difficulty' => [
Rule::requiredIf(function () {
return $this->type === AdviceTypeEnum::recipes->value();
}),
new Enum(AdviceDifficultyEnum::class)
],
'published' => 'required|boolean',
'tags' => [
'present',
'array',
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed
function ($attribute, array $value, $fail) {
if (count($value) > 2) {
$fail(\trans('Vous devez associer au maximum 2 tags.'));
}
}
],
'tags.*' => 'required|array',
'tags.*.id' => 'required|numeric|exists:tags,id|distinct',
'tags.*.label' => 'required|string',
'products' => [
'present',
'array',
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed
function ($attribute, array $value, $fail) {
if ($this->type == AdviceTypeEnum::recipes->value()) {
if (count($value) < 1 || count($value) > 3) {
$fail(\trans('Vous devez associer 1 à 3 produits.'));
}
} else {
if (count($value) > 3) {
$fail(\trans('Vous devez associer au maximum 3 produits.'));
}
}
}
],
'products.*' => 'required|array',
'products.*.value' => 'required|exists:products,id',
'products.*.label' => 'required|string',
'associated_tips_list' => [
'present',
'array',
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed
function ($attribute, array $value, $fail) {
if (count($value) > 3) {
$fail(\trans('Vous devez associer au maximum 3 astuces.'));
}
}
],
'associated_tips_list.*' => 'required|array',
'associated_tips_list.*.value' => 'required|exists:advice,id',
'associated_tips_list.*.label' => 'required|string',
'associated_recipes_list' => [
'present',
'array',
// phpcs:ignore Generic.CodeAnalysis.UnusedFunctionParameter.FoundBeforeLastUsed
function ($attribute, array $value, $fail) {
if (count($value) > 3) {
$fail(\trans('Vous devez associer au maximum 3 recettes.'));
}
}
],
'associated_recipes_list.*' => 'required|array',
'associated_recipes_list.*.value' => 'required|exists:advice,id',
'associated_recipes_list.*.label' => 'required|string',
];
return \array_merge(
$rules,
$this->pictureRules('picture', 650, 690, 650, 690, false),
$this->pictureRules('sticker', 370, 300, 370, 300, false),
$this->pictureRules('sticker_sm', 270, 145, 270, 145, false),
);
}
/**
* Get custom attributes for validator errors.
*
* @return array
*/
public function attributes(): array
{
return [
'title' => trans('Titre'),
'slug' => trans('Slug'),
'seo_title' => trans('title') . ' seo',
'seo_description' => trans('description') . ' seo',
'tags' => trans('tag'),
'tags.*' => trans('tag'),
'tags.*.id' => trans('id du tag'),
'tags.*.label' => trans('label du tag'),
'difficulty' => trans('Difficulté'),
'picture' => trans('Visuel'),
'picture_alt' => trans('Attribut alt du visuel'),
'picture_title' => trans('Titre du visuel'),
'sticker' => trans('Vignette'),
'sticker_alt' => trans('Attribut alt de la vignette'),
'sticker_title' => trans('Titre de la vignette'),
'sticker_sm' => trans('Petite vignette'),
'sticker_sm_alt' => trans('Attribut alt de la petite vignette'),
'sticker_sm_title' => trans('Titre de la petite vignette'),
'ingredients.*.value' => trans('quantité de l\'ingrédient'),
'ingredients.*.label' => trans('description de l\'ingrédient'),
'guests_nb' => trans('Nombre de convives'),
'youtube_title' => trans('Titre de la vidéo Youtube'),
'youtube_video_id' => trans('ID de la vidéo Youtube'),
'advice' => trans('Conseil LGP'),
];
}
}