refactor ClientWidgetFormController; replace validation logic with SubmitWidgetFormAction for improved maintainability and clarity

This commit is contained in:
F4ilji
2025-07-22 13:00:18 +05:00
parent eac29d8d1c
commit 7a8a6e023d
6 changed files with 186 additions and 99 deletions
@@ -2,17 +2,20 @@
namespace App\Containers\Widget\UI\API\Controllers;
use App\Containers\Widget\Data\Rules\UniqueJsonField;
use App\Containers\Widget\Actions\SubmitWidgetFormAction;
use App\Containers\Widget\Enums\CustomFormStatus;
use App\Containers\Widget\Models\CustomForm;
use App\Containers\Widget\Models\CustomFormResponse;
use App\Containers\Widget\UI\API\Transformers\FormResource;
use App\Ship\Controllers\Controller;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Validator;
use Illuminate\Validation\ValidationException;
class ClientWidgetFormController extends Controller
{
public function __construct(
private readonly SubmitWidgetFormAction $submitWidgetFormAction,
) {}
public function single(string $id)
{
return new FormResource(CustomForm::query()->where('status', CustomFormStatus::PUBLISHED)->where('form_id', $id)->firstOrFail());
@@ -20,103 +23,12 @@ class ClientWidgetFormController extends Controller
public function submit(int $id, Request $request)
{
$data = CustomForm::findOrFail($id);
$rules = $this->generateValidationRules($data['columns'], $data['id']);
$messages = $this->generateValidationMessages($data['columns']);
$validateData = Validator::make($request->all(), $rules, $messages);
if ($validateData->fails()) {
return response()->json($validateData->errors(), 422);
try {
$result = $this->submitWidgetFormAction->run($id, $request->all());
} catch (ValidationException $exception) {
return response()->json($exception->errors(), 422);
}
$this->storeResponse($id, $validateData->validated());
return response()->json([
'message' => $data['send_message'],
'status' => 'ok'
]);
}
private function generateValidationRules(array $columns, int $id): array
{
$rules = [];
foreach ($columns as $column) {
// Извлекаем информацию о поле
$name = $column['data']['name_field'];
$rulesForField = [];
// Проверяем, является ли поле массивом (множественный выбор)
if ($column['type'] === 'multiple_choice') {
$rulesForField[] = 'required'; // Обязательно для множественного выбора
$rulesForField[] = 'array'; // Указывает, что это массив
$rulesForField[] = 'min:1'; // Минимум один элемент
$rules[$name] = $rulesForField; // Правила для каждого элемента массива
} else {
// Обработка обычных полей
if (!empty($column['data']['rules']['required'])) {
$rulesForField[] = 'required';
}
if (!empty($column['data']['rules']['min'])) {
$rulesForField[] = 'min:' . $column['data']['rules']['min'];
}
if (!empty($column['data']['rules']['max'])) {
$rulesForField[] = 'max:' . $column['data']['rules']['max'];
}
if (!empty($column['data']['rules']['unique']) && $column['data']['rules']['unique'] === true) {
$rulesForField[] = new UniqueJsonField($id, $name);
}
$rules[$name] = $rulesForField; // Добавляем правила для обычного поля
}
}
return $rules;
}
private function generateValidationMessages(array $columns): array
{
$messages = [];
foreach ($columns as $column) {
$name = $column['data']['name_field'];
if (!empty($column['data']['rules']['required'])) {
$messages[$name . '.required'] = 'Поле обязательно для заполнения.';
}
if (!empty($column['data']['rules']['min'])) {
$messages[$name . '.min'] = 'Минимальная длина поля должна быть ' . $column['data']['rules']['min'] . ' символов.';
}
if (!empty($column['data']['rules']['max'])) {
$messages[$name . '.max'] = 'Максимальная длина поля должна быть ' . $column['data']['rules']['max'] . ' символов.';
}
if (!empty($column['data']['rules']['unique'])) {
$messages[$name . '.max'] = 'Поле должно быть уникальным';
}
}
return $messages;
}
private function storeResponse(int $id, array $validateData): void
{
CustomFormResponse::create([
'custom_form_id' => $id,
'answers' => $validateData,
]);
return response()->json($result);
}
}