cleanup-profile-images.ts 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { PrismaClient } from "@prisma/client";
  2. import fs from "fs";
  3. import {
  4. generateUniqueFileName,
  5. getProfileImagePath,
  6. getProfileImageUrl,
  7. extractFileNameFromUrl,
  8. } from "../src/lib/server-utils";
  9. const prisma = new PrismaClient();
  10. async function cleanupProfileImages() {
  11. try {
  12. console.log("🧹 Iniciando limpieza de imágenes de perfil...");
  13. // Obtener todos los usuarios con imágenes de perfil
  14. const users = await prisma.user.findMany({
  15. where: {
  16. profileImage: {
  17. not: null,
  18. },
  19. },
  20. select: {
  21. id: true,
  22. profileImage: true,
  23. },
  24. });
  25. console.log(
  26. `📊 Encontrados ${users.length} usuarios con imágenes de perfil`
  27. );
  28. for (const user of users) {
  29. if (!user.profileImage) continue;
  30. try {
  31. // Extraer nombre del archivo actual
  32. const currentFileName = extractFileNameFromUrl(user.profileImage);
  33. if (!currentFileName) {
  34. console.log(
  35. `⚠️ Usuario ${user.id}: No se pudo extraer nombre de archivo de ${user.profileImage}`
  36. );
  37. continue;
  38. }
  39. const currentFilePath = getProfileImagePath(currentFileName);
  40. // Verificar si el archivo existe
  41. if (!fs.existsSync(currentFilePath)) {
  42. console.log(
  43. `⚠️ Usuario ${user.id}: Archivo no encontrado: ${currentFileName}`
  44. );
  45. continue;
  46. }
  47. // Verificar si el nombre ya está en el nuevo formato (más corto)
  48. if (currentFileName.length < 50) {
  49. console.log(
  50. `✅ Usuario ${user.id}: Nombre ya optimizado: ${currentFileName}`
  51. );
  52. continue;
  53. }
  54. // Leer el archivo actual
  55. const fileBuffer = fs.readFileSync(currentFilePath);
  56. // Generar nuevo nombre optimizado
  57. const newFileName = generateUniqueFileName(currentFileName);
  58. const newFilePath = getProfileImagePath(newFileName);
  59. // Guardar con nuevo nombre
  60. fs.writeFileSync(newFilePath, fileBuffer);
  61. // Eliminar archivo anterior
  62. fs.unlinkSync(currentFilePath);
  63. // Actualizar en la base de datos
  64. const newImageUrl = getProfileImageUrl(newFileName);
  65. await prisma.user.update({
  66. where: { id: user.id },
  67. data: { profileImage: newImageUrl },
  68. });
  69. console.log(
  70. `✅ Usuario ${user.id}: ${currentFileName} → ${newFileName}`
  71. );
  72. } catch (error) {
  73. console.error(`❌ Error procesando usuario ${user.id}:`, error);
  74. }
  75. }
  76. console.log("🎉 Limpieza completada");
  77. } catch (error) {
  78. console.error("❌ Error en limpieza:", error);
  79. } finally {
  80. await prisma.$disconnect();
  81. }
  82. }
  83. // Ejecutar si se llama directamente
  84. if (require.main === module) {
  85. cleanupProfileImages()
  86. .then(() => {
  87. console.log("✅ Script completado");
  88. process.exit(0);
  89. })
  90. .catch((error) => {
  91. console.error("❌ Error:", error);
  92. process.exit(1);
  93. });
  94. }
  95. export { cleanupProfileImages };