Propósito: Gestión del sistema de certificación de avance de obra vía WhatsApp. Mantiene usuarios, hojas de certificación, grupos de WhatsApp y procesa imágenes/videos de certificación.
Puerto: Variable por ambiente. URL externa: https://cert-progress.bimtrazer.com
Módulo:src/bimtrazer/progress-certification
CI/CD:update-docker.sh, dev-update-docker.sh
Propósito de Negocio
Permite que el personal de obra certifique el avance de bloques constructivos directamente desde WhatsApp, sin necesidad de acceder a la plataforma web. El flujo es:
El usuario de campo escanea un código QR para unirse a un grupo de WhatsApp
Envía una fotografía o video del trabajo realizado
El sistema asocia la imagen al bloque correspondiente mediante una "hoja de certificación" (sheet_code)
El bloque queda certificado en el sistema
Endpoints Expuestos
Whitelist
Método
Path
Descripción
GET
/whitelist/:chatId
Verificar si un chatId está en la whitelist
POST
/whitelist
Agregar chatId a la whitelist
Usuarios
Método
Path
Descripción
GET
/users/by-id/:chatId
Obtener usuario por chatId de WhatsApp
GET
/users/status/:chatId
Estado del usuario
GET
/users/last-blocks-sent/:chatId
Últimos bloques enviados por el usuario
POST
/users
Crear usuario de certificación
POST
/demo-user
Crear usuario de demostración
PUT
/users
Actualizar usuario
Hojas de Certificación (Sheets)
Método
Path
Descripción
GET
/sheets/:projectId
Obtener todas las hojas del proyecto
GET
/sheets/available/:projectId/:sheetCode
Verificar disponibilidad de hoja
GET
/sheets/check-group/:projectId/:chatId/:sheetCode
Verificar que el grupo sea el correcto para la hoja
POST
/sheets
Crear hoja de certificación
PUT
/sheets
Actualizar hoja por código
DELETE
/sheets
Deshabilitar hoja
Diccionarios (Grupos ↔ Proyectos)
Método
Path
Descripción
GET
/dictionaries/project-by-group/:chatId
Obtener proyecto asociado a un grupo WhatsApp
GET
/dicitionaries/groups/:projectId
Obtener grupos del proyecto
POST
/dictionaries/assign-group
Asignar grupo WhatsApp a proyecto
PUT
/dictionaries/invite-url
Actualizar URL de invitación al grupo
Bloques y Certificación
Método
Path
Descripción
GET
/blocks/by-sheet-code/:chatId/:sheetCode
Obtener bloques asociados a una hoja
POST
/send-image
Certificar bloque con imagen
POST
/send-video
Enviar video al almacenamiento
POST
/whatsapp-group
Crear grupo WhatsApp
Estructura de Datos
Usuario de Certificación
{
"chatId": "string (ID de WhatsApp del usuario)",
"name": "string",
"projectId": "string",
"status": true,
"lastBlocksSent": ["blockCode1", "blockCode2"]
}
Hoja de Certificación (Sheet)
{
"sheetCode": "string (código único de la hoja)",
"projectId": "string",
"blocks": ["blockCode1", "blockCode2"],
"groupChatId": "string (ID del grupo WhatsApp)",
"status": true,
"createdAt": "timestamp"
}
Base de Datos
Motor: MongoDB v1.13.1 + SQLite (para whatsmeow)
Colección
Descripción
cert_users
Usuarios del sistema de certificación WhatsApp
cert_whitelist
Lista blanca de chatIds autorizados
cert_sheets
Hojas de certificación (sheet codes)
cert_dictionaries
Mapeo grupos WhatsApp ↔ proyectos
SQLite: Usado internamente por whatsmeow para persistir sesiones de WhatsApp (claves de cifrado, estado de sincronización)
Variables de Entorno
Variable
Descripción
ENVIRONMENT
Ambiente: dev, qa, prod
{ENV}_PORT
Puerto HTTP
{ENV}_DB_*
Credenciales MongoDB
Dependencias Clave (go.mod)
Librería
Propósito
gin-gonic/gin
Framework HTTP
go.mau.fi/whatsmeow
Integración WhatsApp (protocolo nativo)
mattn/go-sqlite3
SQLite para persistencia de sesiones WhatsApp
gorilla/websocket
WebSocket (requerido por whatsmeow)
mdp/qrterminal
Generación de QR en terminal para pairing WhatsApp
rs/zerolog
Logging estructurado
Flujo de Certificación por WhatsApp
[Usuario de Campo]
│ Envía imagen por WhatsApp al grupo del proyecto
▼
[Servidor WhatsApp / whatsmeow]
│ Recibe el mensaje (webhook interno)
▼
[progress-certification]
│
├── GET /whitelist/:chatId → ¿Está autorizado el usuario?
├── GET /dictionaries/project-by-group/:chatId → ¿A qué proyecto pertenece el grupo?
├── GET /blocks/by-sheet-code/:chatId/:sheetCode → ¿Qué bloques debe certificar?
└── POST /send-image → Certifica el bloque con la imagen
│
▼
[media service / bt-central]
Almacena la imagen y notifica certificación
Rol en el Sistema
Llamado por:api-bimtrazer (rutas /cert-progress/* y /certification/*)
Lee de: colecciones de certificación en MongoDB, datos de bloques del proyecto
Interactúa con: WhatsApp (vía whatsmeow para recibir mensajes y grupos)
Alertas Técnicas
El sistema de whitelist es la única barrera de acceso para la certificación WhatsApp — cualquier número en la whitelist puede certificar bloques en el proyecto
Sin autenticación JWT propia (depende de que sea llamado desde api-bimtrazer)
Requiere SQLite en el filesystem del contenedor para la sesión de WhatsApp — el contenedor no es completamente stateless
La sesión de WhatsApp requiere re-escanear el QR si el contenedor se reinicia sin persistencia del archivo SQLite