metis-desk/docs/logotipos-de-companias.md
David 5515191eff feat: add company logo management functionality
- Implemented CompanyLogoUseCases for retrieving, saving, and removing company logos.
- Created CompanyLogoError class for error handling related to logo operations.
- Developed CompanyLogoProcessor to optimize and validate logo images.
- Added HTTP routes for logo management, including GET and POST endpoints.
- Created Sequelize-based repository for logo persistence.
- Implemented migration for adding logoVersion to companies and creating company_logos table.
- Added frontend components for displaying and managing company logos, including avatar and logo upload fields.
- Wrote tests for logo processing and avatar components to ensure functionality and correctness.
2026-10-08 18:31:46 +02:00

2.3 KiB
Raw Blame History

Logotipos de compañías

El formulario de alta y edición permite seleccionar, sustituir y quitar el logotipo al guardar. Sin logotipo, o si su descarga falla, se mantienen las iniciales y colores deterministas.

Límites y almacenamiento

COMPANY_LOGO_LIMITS centraliza los límites: PNG, JPEG y WebP estáticos, hasta 2 MiB y 4096 × 4096 píxeles. El servidor verifica la firma y decodificación real, rechaza animaciones y limita el tiempo de procesamiento. Sharp normaliza orientación, elimina metadatos y genera WebP de hasta 128 × 128 px y 64 KiB, conservando proporciones y transparencia sin recortar. Sharp es una dependencia nueva justificada por la validación real y transformación segura en servidor; las APIs nativas de Node no ofrecen esta operación.

La migración idempotente añade companies.logoVersion y company_logos. Solo se conserva la imagen optimizada; el original se descarta. Una transacción actualiza imagen y versión. No se incorporan binarios ni base64 a las respuestas de listados. Las imágenes requieren la sesión existente y las escrituras conservan la protección CSRF/origen de la aplicación. La URL lleva el hash de contenido; caché privada y ETag permiten reutilizarla sin mostrar versiones antiguas tras una sustitución.

Los datos generales y el logotipo se guardan en dos peticiones. Si falla la segunda, el formulario informa del guardado parcial y conserva el identificador y el archivo para reintentar sin duplicar la compañía.

Componentes

  • CompanyAvatar: logotipo con carga diferida y dimensiones reservadas; iniciales como alternativa. Usa la consulta compartida de compañías cuando un listado solo aporta identificador y nombre.
  • CompanyIdentity: avatar y nombre alineados, utilizado en directorio, dashboard, tickets, intervenciones, búsqueda y detalle. El tamaño se ajusta mediante clases existentes.
  • CompanySelect: opciones y selección de compañías con avatar, reutilizando los controles shadcn/ui y conservando etiquetas de texto para búsquedas por teclado.
  • CompanyLogoField: selección con validación local de peso y MIME, mensajes accesibles y acciones de quitar/deshacer. No decodifica el original en el navegador; la imagen optimizada aparece después de guardar.

Se conserva la estructura de navegación, el shell y los componentes shadcn/ui existentes, sin modificar código vendor.