feat(desfile): implement entry management with image handling and variant synchronization

This commit is contained in:
2026-08-14 11:24:17 -03:00
parent 7fbdc00c64
commit 21b0517e6c
10 changed files with 767 additions and 1 deletions

View File

@@ -0,0 +1,22 @@
<?php
namespace App\Domains\Desfile\Requests;
use Illuminate\Foundation\Http\FormRequest;
class ReplaceEntryImageRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
/** @return array<string, mixed> */
public function rules(): array
{
return [
'image' => ['required', 'image', 'mimes:jpeg,jpg,png,webp', 'max:10240'],
'is_enabled' => ['sometimes', 'boolean'],
];
}
}

View File

@@ -0,0 +1,56 @@
<?php
namespace App\Domains\Desfile\Requests;
use Illuminate\Foundation\Http\FormRequest;
use Illuminate\Validation\Validator;
class SyncEntryVariantsRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
/** @return array<string, mixed> */
public function rules(): array
{
return [
'variants' => ['required', 'array', 'min:1', 'max:1000'],
'variants.*' => ['required', 'array:id,type,sector,row,seat,price'],
'variants.*.id' => ['sometimes', 'integer', 'distinct'],
'variants.*.type' => ['required', 'string', 'max:100'],
'variants.*.sector' => ['required', 'string', 'max:100'],
'variants.*.row' => ['required', 'string', 'max:100'],
'variants.*.seat' => ['required', 'string', 'max:100'],
'variants.*.price' => ['required', 'numeric', 'min:0', 'max:99999999.99'],
];
}
/** @return array<int, callable> */
public function after(): array
{
return [function (Validator $validator): void {
$combinations = [];
foreach ($this->input('variants', []) as $index => $variant) {
if (! is_array($variant)) {
continue;
}
$combination = collect(['type', 'sector', 'row', 'seat'])
->map(fn (string $field): string => mb_strtolower(trim((string) ($variant[$field] ?? ''))))
->implode('|');
if (isset($combinations[$combination])) {
$validator->errors()->add(
"variants.{$index}",
'La combinación de tipo, sector, fila y asiento no puede repetirse.',
);
}
$combinations[$combination] = true;
}
}];
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace App\Domains\Desfile\Requests;
use Illuminate\Foundation\Http\FormRequest;
class UpdateEntryImageRequest extends FormRequest
{
public function authorize(): bool
{
return true;
}
/** @return array<string, mixed> */
public function rules(): array
{
return [
'is_enabled' => ['required', 'boolean'],
];
}
}