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); } } }