| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246 |
- <?php
- // app/Http/Controllers/FormController.php
- namespace App\Http\Controllers;
- use App\Models\Form;
- use App\Models\FormResponse;
- use Illuminate\Http\Request;
- use Illuminate\Http\JsonResponse;
- use Illuminate\Validation\ValidationException;
- class FormController extends Controller
- {
- /**
- * Guardar un formulario nuevo
- */
- public function store(Request $request): JsonResponse
- {
- try {
- $validated = $request->validate([
- 'title' => 'required|string|max:255',
- 'tabs' => 'required|array',
- 'tabs.*.id' => 'required|string',
- 'tabs.*.title' => 'required|string',
- 'tabs.*.rows' => 'required|integer|min:1',
- 'tabs.*.columns' => 'required|integer|min:1',
- 'tabs.*.elements' => 'required|array',
- 'tabs.*.elements.*.position' => 'required|array',
- 'tabs.*.elements.*.element' => 'required|array',
- ]);
- $form = Form::create([
- 'title' => $validated['title'],
- 'configuration' => [
- 'tabs' => $validated['tabs']
- ],
- 'is_published' => false
- ]);
- return response()->json([
- 'success' => true,
- 'message' => 'Formulario guardado exitosamente',
- 'form' => $form
- ], 201);
- } catch (ValidationException $e) {
- return response()->json([
- 'success' => false,
- 'message' => 'Error de validación',
- 'errors' => $e->errors()
- ], 422);
- } catch (\Exception $e) {
- return response()->json([
- 'success' => false,
- 'message' => 'Error interno del servidor',
- 'error' => $e->getMessage()
- ], 500);
- }
- }
- /**
- * Obtener un formulario para renderizar
- // */
- // public function show($id): JsonResponse
- // {
- // try {
- // $form = Form::findOrFail($id);
- // return response()->json([
- // 'success' => true,
- // 'form' => $form
- // ]);
- // } catch (\Exception $e) {
- // return response()->json([
- // 'success' => false,
- // 'message' => 'Formulario no encontrado'
- // ], 404);
- // }
- // }
- /**
- * Publicar un formulario
- // */
- // public function publish($id): JsonResponse
- // {
- // try {
- // $form = Form::findOrFail($id);
- // $form->update(['is_published' => true]);
- // return response()->json([
- // 'success' => true,
- // 'message' => 'Formulario publicado exitosamente',
- // 'form' => $form
- // ]);
- // } catch (\Exception $e) {
- // return response()->json([
- // 'success' => false,
- // 'message' => 'Error al publicar el formulario'
- // ], 500);
- // }
- // }
- /**
- * Obtener todos los formularios
- */
- // public function index(): JsonResponse
- // {
- // try {
- // $forms = Form::with('responses')->get();
- // return response()->json([
- // 'success' => true,
- // 'forms' => $forms
- // ]);
- // } catch (\Exception $e) {
- // return response()->json([
- // 'success' => false,
- // 'message' => 'Error al obtener formularios'
- // ], 500);
- // }
- // }
- /**
- * Guardar respuesta de un formulario
- */
- public function storeResponse(Request $request, $formId): JsonResponse
- {
- try {
- $form = Form::findOrFail($formId);
- if (!$form->is_published) {
- return response()->json([
- 'success' => false,
- 'message' => 'Este formulario no está publicado'
- ], 403);
- }
- // Validar que las respuestas coincidan con la configuración del formulario
- $validated = $this->validateFormResponse($request, $form);
- $response = FormResponse::create([
- 'form_id' => $formId,
- 'responses' => $validated,
- 'user_identifier' => $request->ip() // O puedes usar session()->getId()
- ]);
- return response()->json([
- 'success' => true,
- 'message' => 'Respuesta guardada exitosamente',
- 'response' => $response
- ], 201);
- } catch (ValidationException $e) {
- return response()->json([
- 'success' => false,
- 'message' => 'Error de validación',
- 'errors' => $e->errors()
- ], 422);
- } catch (\Exception $e) {
- return response()->json([
- 'success' => false,
- 'message' => 'Error al guardar la respuesta',
- 'error' => $e->getMessage()
- ], 500);
- }
- }
- /**
- * Validar respuesta del formulario dinámicamente
- */
- private function validateFormResponse(Request $request, Form $form): array
- {
- $rules = [];
- $validatedData = [];
- foreach ($form->configuration['tabs'] as $tab) {
- foreach ($tab['elements'] as $element) {
- $fieldName = $element['element']['name'];
- $fieldRules = [];
- // Aplicar reglas según el tipo de campo
- if ($element['element']['required']) {
- $fieldRules[] = 'required';
- }
- switch ($element['element']['type']) {
- case 'text':
- $fieldRules[] = 'string';
- if (isset($element['element']['max'])) {
- $fieldRules[] = 'max:' . $element['element']['max'];
- }
- if (isset($element['element']['min'])) {
- $fieldRules[] = 'min:' . $element['element']['min'];
- }
- break;
- case 'email':
- $fieldRules[] = 'email';
- break;
- case 'date':
- $fieldRules[] = 'date';
- break;
- case 'select':
- if (isset($element['element']['options'])) {
- $fieldRules[] = 'in:' . implode(',', $element['element']['options']);
- }
- break;
- case 'checkbox':
- $fieldRules[] = 'boolean';
- break;
- }
- $rules[$fieldName] = $fieldRules;
- }
- }
- $validated = $request->validate($rules);
- return $validated;
- }
- /**
- * Obtener respuestas de un formulario
- */
- public function getResponses($formId): JsonResponse
- {
- try {
- $form = Form::with('responses')->findOrFail($formId);
- return response()->json([
- 'success' => true,
- 'form' => $form->title,
- 'responses' => $form->responses
- ]);
- } catch (\Exception $e) {
- return response()->json([
- 'success' => false,
- 'message' => 'Error al obtener respuestas'
- ], 500);
- }
- }
- }
|