Go

Servicio: progress-certification

Información General


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:

  1. El usuario de campo escanea un código QR para unirse a un grupo de WhatsApp
  2. Envía una fotografía o video del trabajo realizado
  3. El sistema asocia la imagen al bloque correspondiente mediante una "hoja de certificación" (sheet_code)
  4. 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

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


Alertas Técnicas