PersonalizarController.php 8.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. <?php
  2. namespace App\Http\Controllers;
  3. use App\Models\Personalizar;
  4. use Illuminate\Http\Request;
  5. use Illuminate\Support\Facades\Validator;
  6. use Illuminate\Support\Facades\DB;
  7. use Illuminate\Support\Facades\Storage;
  8. use Illuminate\Support\Str;
  9. class PersonalizarController extends Controller
  10. {
  11. public function show()
  12. {
  13. $personalizar = Personalizar::find(1);
  14. if ($personalizar) {
  15. /** @var \Illuminate\Contracts\Filesystem\Cloud $disk */
  16. $disk = Storage::disk('s3');
  17. return response()->json([
  18. 'personalizacion' => [
  19. 'PERMENSAJE' => $personalizar->PERMENSAJE,
  20. 'PERNOMBRE' => $personalizar->PERNOMBRE,
  21. 'PERESLOGAN' => $personalizar->PERESLOGAN,
  22. 'PERLOGO' => $personalizar->PERLOGO ? $disk->url($personalizar->PERLOGO) : null,
  23. 'PERLOGO1' => $personalizar->PERLOGO1 ? $disk->url($personalizar->PERLOGO1) : null,
  24. 'PERLOGO2' => $personalizar->PERLOGO2 ? $disk->url($personalizar->PERLOGO2) : null,
  25. 'PERPR_COL_BAR' => $personalizar->PERPR_COL_BAR,
  26. 'PERSDO_COL_BAR' => $personalizar->PERSDO_COL_BAR,
  27. 'PERTXT_BAR' => $personalizar->PERTXT_BAR,
  28. 'PERCOL_LTR_BAR' => $personalizar->PERCOL_LTR_BAR,
  29. 'PERPR_COL_TIT' => $personalizar->PERPR_COL_TIT,
  30. 'PERVINCULOS' => $personalizar->PERVINCULOS,
  31. ],
  32. 'status' => 200
  33. ]);
  34. }
  35. return response()->json([
  36. 'message' => 'No se encontró la personalización',
  37. 'status' => 400
  38. ]);
  39. }
  40. public function eliminarPerlogo(Request $request)
  41. {
  42. try {
  43. $request->validate([
  44. 'rutaArchivo' => 'required|string'
  45. ]);
  46. $ruta = $request->input('rutaArchivo');
  47. $campos = ['PERLOGO', 'PERLOGO1', 'PERLOGO2'];
  48. $registro = DB::table('personalizar')
  49. ->where(function ($query) use ($campos, $ruta) {
  50. foreach ($campos as $campo) {
  51. $query->orWhere($campo, $ruta);
  52. }
  53. })->first();
  54. if (!$registro) {
  55. return response()->json(['mensaje' => 'No se encontró ningún campo con esa ruta'], 404);
  56. }
  57. // Verificar si el archivo existe en S3
  58. if (Storage::disk('s3')->exists($ruta)) {
  59. Storage::disk('s3')->delete($ruta);
  60. } else {
  61. return response()->json(['mensaje' => 'El archivo no existe en S3'], 404);
  62. }
  63. // Detectar qué campo contiene la ruta
  64. $campoAActualizar = null;
  65. foreach ($campos as $campo) {
  66. if ($registro->$campo === $ruta) {
  67. $campoAActualizar = $campo;
  68. break;
  69. }
  70. }
  71. if (!$campoAActualizar) {
  72. return response()->json(['mensaje' => 'No se pudo determinar qué campo actualizar'], 400);
  73. }
  74. // Actualizar el campo a null
  75. DB::table('personalizar')
  76. ->where('id', $registro->id)
  77. ->update([
  78. $campoAActualizar => null,
  79. 'updated_at' => now()
  80. ]);
  81. return response()->json(['mensaje' => 'Imagen eliminada correctamente'], 200);
  82. } catch (\Exception $e) {
  83. return response()->json([
  84. 'mensaje' => 'Error al eliminar imagen',
  85. 'error' => $e->getMessage()
  86. ], 500);
  87. }
  88. }
  89. public function update(Request $request)
  90. {
  91. $personalizar = Personalizar::find(1);
  92. if ($personalizar) {
  93. $personalizar->PERMENSAJE = $request->mensajeBienvenida;
  94. $personalizar->PERNOMBRE = $request->nombreColegio;
  95. $personalizar->PERESLOGAN = $request->eslogan;
  96. $personalizar->PERPR_COL_BAR = $request->primerColorBarra;
  97. $personalizar->PERSDO_COL_BAR = $request->segundoColorBarra;
  98. $personalizar->PERTXT_BAR = $request->texturaBarra;
  99. $personalizar->PERCOL_LTR_BAR = $request->colorLetraNav;
  100. $personalizar->PERPR_COL_TIT = $request->primerColorTitulos;
  101. $personalizar->PERVINCULOS = $request->colorVinculos;
  102. $procesarImagen = function(?string $imageData, string $nombreArchivoBase, ?string $rutaActual) {
  103. if (empty($imageData) || $imageData === 'null') {
  104. return $rutaActual;
  105. }
  106. if (!str_starts_with($imageData, 'data:image')) {
  107. // Manejo de URL ya subida (igual que antes)
  108. $pathActual = $rutaActual ?? '';
  109. $urlActualCompleta = Storage::disk('s3')->url($pathActual);
  110. if ($imageData === $urlActualCompleta || $imageData === $rutaActual) {
  111. return $rutaActual;
  112. }
  113. return $imageData;
  114. }
  115. if (preg_match('/^data:image\/(\w+);base64,/', $imageData, $matches)) {
  116. $fileExtension = strtolower($matches[1]); // png, jpeg, jpg, etc.
  117. } else {
  118. return $rutaActual;
  119. }
  120. $allowedExtensions = ['jpeg', 'jpg', 'png'];
  121. if (!in_array($fileExtension, $allowedExtensions)) {
  122. throw new \Exception('Formato de imagen no soportado. Por favor, utiliza JPEG o PNG.');
  123. }
  124. $imageBase64 = substr($imageData, strpos($imageData, ',') + 1);
  125. $imageBase64 = str_replace(' ', '+', $imageBase64);
  126. // Validar tamaño máximo 1MB
  127. $decodedSize = strlen(base64_decode($imageBase64));
  128. if ($decodedSize > 1 * 1024 * 1024) {
  129. throw new \Exception('El tamaño de la imagen excede el límite permitido (1 MB).');
  130. }
  131. // Generar sufijo único con timestamp y UUID
  132. $uniqueSuffix = time() . '_' . Str::uuid();
  133. $path = 'personalizar/' . $nombreArchivoBase . '_' . $uniqueSuffix . '.' . $fileExtension;
  134. // Subir a S3 con visibilidad pública
  135. Storage::disk('s3')->put($path, base64_decode($imageBase64), 'public');
  136. return $path;
  137. };
  138. try {
  139. $personalizar->PERLOGO = $procesarImagen($request->imagen, 'personalizar', $personalizar->PERLOGO);
  140. $personalizar->PERLOGO1 = $procesarImagen($request->imagen1, 'personalizar1', $personalizar->PERLOGO1);
  141. $personalizar->PERLOGO2 = $procesarImagen($request->imagen2, 'personalizar2', $personalizar->PERLOGO2);
  142. } catch (\Exception $ex) {
  143. return response()->json([
  144. 'message' => $ex->getMessage(),
  145. 'status' => 400,
  146. ], 400);
  147. }
  148. $personalizar->save();
  149. return response()->json([
  150. 'message' => 'Personalización del sistema actualizada',
  151. 'status' => 200
  152. ], 200);
  153. }
  154. return response()->json([
  155. 'message' => 'No se encontró la personalización',
  156. 'status' => 400
  157. ], 400);
  158. }
  159. public function getNombreColegio()
  160. {
  161. try {
  162. $personalizacion = DB::table('personalizar')->first();
  163. return response()->json([
  164. 'nombreColegio' => $personalizacion->PERNOMBRE ?? 'Sin nombre'
  165. ], 200);
  166. } catch (\Exception $e) {
  167. return response()->json([
  168. 'error' => 'No se pudo obtener el nombre del colegio',
  169. 'detalle' => $e->getMessage()
  170. ], 500);
  171. }
  172. }
  173. public function getEsloganColegio()
  174. {
  175. try {
  176. $personalizacion = DB::table('personalizar')->first();
  177. return response()->json([
  178. 'eslogan' => $personalizacion->PERESLOGAN ?? 'Sin nombre'
  179. ], 200);
  180. } catch (\Exception $e) {
  181. return response()->json([
  182. 'error' => 'No se pudo obtener el eslogan del colegio',
  183. 'detalle' => $e->getMessage()
  184. ], 500);
  185. }
  186. }
  187. public function getPerLogo1()
  188. {
  189. $personalizar = Personalizar::find(1);
  190. if ($personalizar && $personalizar->PERLOGO1) {
  191. $url = Storage::disk('s3')->url($personalizar->PERLOGO1);
  192. return response()->json(['PERLOGO1' => $url], 200);
  193. }
  194. return response()->json(['PERLOGO1' => null], 404);
  195. }
  196. public function getPerLogo2()
  197. {
  198. $personalizar = Personalizar::find(1);
  199. if ($personalizar && $personalizar->PERLOGO2) {
  200. $url = Storage::disk('s3')->url($personalizar->PERLOGO2);
  201. return response()->json(['PERLOGO2' => $url], 200);
  202. }
  203. return response()->json(['PERLOGO2' => null], 404);
  204. }
  205. }