FormController.php 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246
  1. <?php
  2. // app/Http/Controllers/FormController.php
  3. namespace App\Http\Controllers;
  4. use App\Models\Form;
  5. use App\Models\FormResponse;
  6. use Illuminate\Http\Request;
  7. use Illuminate\Http\JsonResponse;
  8. use Illuminate\Validation\ValidationException;
  9. class FormController extends Controller
  10. {
  11. /**
  12. * Guardar un formulario nuevo
  13. */
  14. public function store(Request $request): JsonResponse
  15. {
  16. try {
  17. $validated = $request->validate([
  18. 'title' => 'required|string|max:255',
  19. 'tabs' => 'required|array',
  20. 'tabs.*.id' => 'required|string',
  21. 'tabs.*.title' => 'required|string',
  22. 'tabs.*.rows' => 'required|integer|min:1',
  23. 'tabs.*.columns' => 'required|integer|min:1',
  24. 'tabs.*.elements' => 'required|array',
  25. 'tabs.*.elements.*.position' => 'required|array',
  26. 'tabs.*.elements.*.element' => 'required|array',
  27. ]);
  28. $form = Form::create([
  29. 'title' => $validated['title'],
  30. 'configuration' => [
  31. 'tabs' => $validated['tabs']
  32. ],
  33. 'is_published' => false
  34. ]);
  35. return response()->json([
  36. 'success' => true,
  37. 'message' => 'Formulario guardado exitosamente',
  38. 'form' => $form
  39. ], 201);
  40. } catch (ValidationException $e) {
  41. return response()->json([
  42. 'success' => false,
  43. 'message' => 'Error de validación',
  44. 'errors' => $e->errors()
  45. ], 422);
  46. } catch (\Exception $e) {
  47. return response()->json([
  48. 'success' => false,
  49. 'message' => 'Error interno del servidor',
  50. 'error' => $e->getMessage()
  51. ], 500);
  52. }
  53. }
  54. /**
  55. * Obtener un formulario para renderizar
  56. // */
  57. // public function show($id): JsonResponse
  58. // {
  59. // try {
  60. // $form = Form::findOrFail($id);
  61. // return response()->json([
  62. // 'success' => true,
  63. // 'form' => $form
  64. // ]);
  65. // } catch (\Exception $e) {
  66. // return response()->json([
  67. // 'success' => false,
  68. // 'message' => 'Formulario no encontrado'
  69. // ], 404);
  70. // }
  71. // }
  72. /**
  73. * Publicar un formulario
  74. // */
  75. // public function publish($id): JsonResponse
  76. // {
  77. // try {
  78. // $form = Form::findOrFail($id);
  79. // $form->update(['is_published' => true]);
  80. // return response()->json([
  81. // 'success' => true,
  82. // 'message' => 'Formulario publicado exitosamente',
  83. // 'form' => $form
  84. // ]);
  85. // } catch (\Exception $e) {
  86. // return response()->json([
  87. // 'success' => false,
  88. // 'message' => 'Error al publicar el formulario'
  89. // ], 500);
  90. // }
  91. // }
  92. /**
  93. * Obtener todos los formularios
  94. */
  95. // public function index(): JsonResponse
  96. // {
  97. // try {
  98. // $forms = Form::with('responses')->get();
  99. // return response()->json([
  100. // 'success' => true,
  101. // 'forms' => $forms
  102. // ]);
  103. // } catch (\Exception $e) {
  104. // return response()->json([
  105. // 'success' => false,
  106. // 'message' => 'Error al obtener formularios'
  107. // ], 500);
  108. // }
  109. // }
  110. /**
  111. * Guardar respuesta de un formulario
  112. */
  113. public function storeResponse(Request $request, $formId): JsonResponse
  114. {
  115. try {
  116. $form = Form::findOrFail($formId);
  117. if (!$form->is_published) {
  118. return response()->json([
  119. 'success' => false,
  120. 'message' => 'Este formulario no está publicado'
  121. ], 403);
  122. }
  123. // Validar que las respuestas coincidan con la configuración del formulario
  124. $validated = $this->validateFormResponse($request, $form);
  125. $response = FormResponse::create([
  126. 'form_id' => $formId,
  127. 'responses' => $validated,
  128. 'user_identifier' => $request->ip() // O puedes usar session()->getId()
  129. ]);
  130. return response()->json([
  131. 'success' => true,
  132. 'message' => 'Respuesta guardada exitosamente',
  133. 'response' => $response
  134. ], 201);
  135. } catch (ValidationException $e) {
  136. return response()->json([
  137. 'success' => false,
  138. 'message' => 'Error de validación',
  139. 'errors' => $e->errors()
  140. ], 422);
  141. } catch (\Exception $e) {
  142. return response()->json([
  143. 'success' => false,
  144. 'message' => 'Error al guardar la respuesta',
  145. 'error' => $e->getMessage()
  146. ], 500);
  147. }
  148. }
  149. /**
  150. * Validar respuesta del formulario dinámicamente
  151. */
  152. private function validateFormResponse(Request $request, Form $form): array
  153. {
  154. $rules = [];
  155. $validatedData = [];
  156. foreach ($form->configuration['tabs'] as $tab) {
  157. foreach ($tab['elements'] as $element) {
  158. $fieldName = $element['element']['name'];
  159. $fieldRules = [];
  160. // Aplicar reglas según el tipo de campo
  161. if ($element['element']['required']) {
  162. $fieldRules[] = 'required';
  163. }
  164. switch ($element['element']['type']) {
  165. case 'text':
  166. $fieldRules[] = 'string';
  167. if (isset($element['element']['max'])) {
  168. $fieldRules[] = 'max:' . $element['element']['max'];
  169. }
  170. if (isset($element['element']['min'])) {
  171. $fieldRules[] = 'min:' . $element['element']['min'];
  172. }
  173. break;
  174. case 'email':
  175. $fieldRules[] = 'email';
  176. break;
  177. case 'date':
  178. $fieldRules[] = 'date';
  179. break;
  180. case 'select':
  181. if (isset($element['element']['options'])) {
  182. $fieldRules[] = 'in:' . implode(',', $element['element']['options']);
  183. }
  184. break;
  185. case 'checkbox':
  186. $fieldRules[] = 'boolean';
  187. break;
  188. }
  189. $rules[$fieldName] = $fieldRules;
  190. }
  191. }
  192. $validated = $request->validate($rules);
  193. return $validated;
  194. }
  195. /**
  196. * Obtener respuestas de un formulario
  197. */
  198. public function getResponses($formId): JsonResponse
  199. {
  200. try {
  201. $form = Form::with('responses')->findOrFail($formId);
  202. return response()->json([
  203. 'success' => true,
  204. 'form' => $form->title,
  205. 'responses' => $form->responses
  206. ]);
  207. } catch (\Exception $e) {
  208. return response()->json([
  209. 'success' => false,
  210. 'message' => 'Error al obtener respuestas'
  211. ], 500);
  212. }
  213. }
  214. }