Skip to content

feat(checkin): optimize and compress check-in images before S3 storage - #77

Merged
lucas-matw-unq merged 3 commits into
mainfrom
feature/compress-checkin-images
Oct 4, 2026
Merged

lucas-matw-unq merged 3 commits into
mainfrom
feature/compress-checkin-images

Conversation

@lucas-matw-unq

@lucas-matw-unq lucas-matw-unq commented Oct 4, 2026 •

Copy link
Copy Markdown
Collaborator

Resumen

Integra la optimización de imágenes en el pipeline de check-in del servidor mediante sharp, asegurando dimensiones uniformes, auto-orientación y eficiencia de almacenamiento en Garage S3 con una arquitectura de fallback tolerante a fallos (fail-open).

Motivación y Contexto

El objetivo principal de esta implementación es cuidar el uso del almacenamiento (storage), dado que la capacidad de almacenamiento de objetos (S3) es limitada.
Las cámaras modernas capturan fotografías con resoluciones masivas ($12\text{ a }48\text{ MP}+$), generando archivos de entre $3\text{ MB}$ y $15\text{ MB}+$ cada una. Para los fines de la plataforma Rayuela (validación comunitaria y científica de observaciones), no es necesaria tanta calidad ni resoluciones extremas de impresión.
Por ello, unificamos todas las imágenes en un tamaño estándar máximo (bounding box de 1600px) y formato JPEG optimizado (calidad 80), logrando reducir más del 90% del espacio ocupado en storage.

Cambios Clave

  • Pipeline de imágenes: Se agregó optimizeImage() en CheckinService utilizando sharp para normalizar las imágenes subidas (rotate(), resize max 1600px proporcional sin ampliación, JPEG calidad 80) antes de persistirlas en S3.
  • Resiliencia fail-open: Si la normalización de la imagen encuentra un formato no soportado o un error de procesamiento, se registra un warning en logs y se sube el buffer original recibido, garantizando que el check-in nunca falle para el usuario.
  • Dependencias y compatibilidad: Se instaló sharp@0.32.6 (compatible con el entorno Node.js 16/18 de CI y Node 20+ en ejecución) y se habilitó esModuleInterop: true en tsconfig.json.
  • Documentación: Se incorporó docs/mobile/image-compression.md con el flujo completo de arquitectura y se vinculó en _sidebar.md y mobile/workflows.md.

Resultados Empíricos (Prueba End-to-End)

Verificado contra el bucket rayuela-checkins en Garage S3:

Métrica Foto original del dispositivo Almacenada en Garage S3 Impacto
Tamaño de archivo 6,605 KB (6.6 MB) 398.46 KB -94% de reducción
Resolución Cámara nativa ($4000\times3000$+ px) $1600\times1000$ px Reducción proporcional
Calidad 100% 80% (JPEG) Metadata EXIF limpiada

Verificación

  • npm run lint: Limpio
  • npm run build: Compilación exitosa
  • npm run test: 57/57 suites pasadas (477/477 tests, incluyendo tests unitarios para optimizeImage y fallback fail-open)

@lucas-matw-unq
lucas-matw-unq merged commit f7549b4 into main Oct 4, 2026
2 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants