Inicio
›
Servicios newbimtrazer
›
Servicio: api-bimtrazer
Go · API Gateway
Servicio: api-bimtrazer
Propósito: API Gateway central de la arquitectura newbimtrazer. Agrega, enruta y orquesta todos los demás microservicios. Es el único punto de entrada del frontend.
Tecnología: Go 1.22 / Gin
Puerto: :8085 (QA/PROD) | :8086 (DEV/LOCAL)
Módulo: src/bimtrazer/api-bimtrazer
CI/CD: Scripts update-docker.sh, qa-update-docker.sh, dev-update-docker.sh
Propósito de Negocio
Centraliza:
Autenticación y autorización JWT (middleware global Auth())
Generación y renovación de tokens de acceso
Enrutamiento de todas las operaciones del sistema hacia los microservicios especializados
Integración con WhatsApp (whatsmeow, wuzapi), OpenAI y reconocimiento de imágenes
WebSocket para notificaciones en tiempo real
Firma múltiple de bloques (multi-sign)
Arquitectura
El servicio actúa como proxy inteligente : recibe peticiones del frontend, les aplica autenticación JWT y las reenvía al microservicio correspondiente (users, labels, blocks, etc.). Los handlers llaman a los servicios internos usando URLs configuradas por ambiente.
[FRONTEND]
│
▼
[api-bimtrazer :8085]
│ middleware Auth() — valida JWT en todas las rutas
│ excepto: /users/login, /users/register, /gen-access-token, /gen-admin-token, /refresh-token
│
├─► users.bimtrazer.com
├─► projects.bimtrazer.com
├─► ifc.bimtrazer.com
├─► labels.bimtrazer.com
├─► blocks.bimtrazer.com
├─► sequences.bimtrazer.com
├─► displacements.bimtrazer.com
├─► lblsref.bimtrazer.com
├─► digitaltwin.bimtrazer.com
├─► registry.bimtrazer.com
├─► worktables.bimtrazer.com
├─► media.bimtrazer.com
├─► items.bimtrazer.com
├─► lbp.bimtrazer.com
├─► priority-blocks (:8087 interno)
├─► process-blocks.bimtrazer.com
├─► new-params.bimtrazer.com
├─► cert-progress.bimtrazer.com
├─► open-ai (:8093 interno)
├─► whatsmeow.bimtrazer.com
├─► whatsapp-bot.bimtrazer.com
├─► whisper.bimtrazer.com
└─► img-recognition.bimtrazer.com
Endpoints Expuestos
Autenticación y Tokens
POST
/gen-admin-token
Generar token de administrador
POST
/gen-access-token/:key
Generar token de acceso (ruta pública)
POST
/refresh-token
Renovar token de acceso
Usuarios
GET
/users
Listar todos los usuarios
GET
/users/by-project/:projectId
Usuarios de un proyecto
POST
/users/login
Login (ruta pública)
POST
/users/register
Registro de usuario (ruta pública)
POST
/users/by-email
Buscar usuario por email
POST
/users/get-by-emails
Buscar múltiples usuarios por email
POST
/users/by-email-and-project
Buscar usuario en proyecto específico
PUT
/users
Actualizar usuario
PUT
users/add-views
Agregar vistas a usuario en proyecto
DELETE
/users
Desactivar usuario
DELETE
/users/remove-project
Quitar proyecto del scope del usuario
Proyectos
GET
/projects
Listar todos los proyectos
GET
/projects/general/:projectId
Datos generales del proyecto
GET
/projects/:projectId
Proyecto por ID
GET
/projects/chart/:projectId/:labelId
Gráfica de un proyecto por etiqueta
POST
/projects
Crear proyecto
PUT
/projects
Actualizar proyecto
PUT
/assign
Asignar proyecto a usuario
PUT
/projects/assign
Asignar proyecto a usuario (alias)
DELETE
/projects
Eliminar proyecto
Bloques (blockIfc)
GET
/blocks/sequences/:projectId
Códigos de secuencias del proyecto
GET
/blocks/all-blocks-file/:projectId
Todos los bloques en archivo
GET
/blocks/dashboard-data/:projectId/:labelCode
Datos de dashboard por etiqueta
GET
/blocks/label-intersection/:projectId
Intersección de bloques por etiquetas
GET
/blocks/:projectId/:blockCode
Bloque específico por código
GET
/executed-blocks/:projectId
Bloques ejecutados del proyecto
POST
/core/blocks-ifc
Crear bloques IFC
POST
/blocks/sequences
Obtener info de secuencias
POST
/blocks/dependencies
Obtener info de dependencias
POST
/blocks/create-codes
Crear códigos de bloques
POST
/blocks/priority/by-label
Bloques prioritarios filtrados por etiqueta
POST
/blocks/filtered/by-label
Bloques filtrados por etiqueta
POST
/blocks/label-intersection
Intersección bloques/etiquetas (body)
PUT
/blocks/blocks-Json
Actualizar bloques JSON
PUT
/workprogress
Ejecutar cálculo de progreso de obra
PUT
/ifc/assign-blocks-description
Asignar descripción a bloques IFC
PUT
/ifc/urn
Actualizar URN de modelo IFC
PUT
/ifc/assign-blocks-dbIds
Asignar dbIds a bloques IFC
PUT
/ifc/blocks-ifc
Actualizar bloques IFC
DELETE
/core/ifc
Eliminar modelo IFC
DELETE
/ifc/abortUploading
Abortar subida de IFC
Bloques Prioritarios (priority-blocks)
GET
/priority/blocks/:projectId
Bloques prioritarios por proyecto
GET
/priority/classified-blocks/:projectId
Bloques clasificados
GET
/priority/blocks-to-certify/:projectId
Bloques a certificar
GET
/blocks/priority/:projectId
Bloques prioritarios (v2)
GET
/blocks/priority/classified/:projectId
Bloques clasificados (v2)
GET
/blocks/priority/to-certify/:projectId
Bloques a certificar (v2)
POST
/priority/blocks-by-label
Bloques prioritarios por etiqueta
POST
/priority/by-label-less-data
Bloques prioritarios por etiqueta (menos datos)
POST
/blocks/priority/by-label
Filtro bloques prioritarios (v2)
PUT
/priority/executed
Actualizar valor ejecutado
PUT
/priority/blocks
Actualizar bloques prioritarios
PUT
/blocks/priority/executed
Actualizar ejecutados (v2)
DELETE
/priority/blocks
Deshabilitar bloques prioritarios
DELETE
/blocks/priority/disable
Deshabilitar bloques prioritarios (v2)
Etiquetas (labels)
GET
/core/labels/:projectId
Lista de etiquetas del proyecto
GET
/core/labels-report/:projectId
Reporte de etiquetas
GET
/core/projection-chart/:projectId
Gráfica de proyección
GET
/core/general-data/:projectId
Datos generales del proyecto
GET
/labels/by-project/:projectId
Etiquetas por proyecto
GET
/labels/dashboard/:projectId
Etiquetas para dashboard
GET
/labels/groups/:projectId
Grupos de etiquetas
GET
/labels/groups/alias-and-codes/:projectId
Alias y códigos de grupos
GET
/labels/:projectId
Árbol de etiquetas del proyecto
POST
/labels/labelsRecursive
Etiquetas recursivas
POST
/labels/labels
Listar etiquetas
POST
/labels/labelIntersect
Intersección de etiquetas
POST
/labels/groups
Crear grupo de etiquetas
POST
/labels
Crear etiqueta
PUT
/labels-calculation
Ejecutar cálculo de etiquetas
PUT
/labels/assign-to-dashboard
Asignar etiquetas al dashboard
Progreso de Certificación (progress-certification)
GET
/cert-progress/users/by-id/:chatId
Usuario por chatId
GET
/cert-progress/whitelist/:chatId
Verificar whitelist
GET
/cert-progress/dictionaries/project-by-group/:chatId
Proyecto por grupo
GET
/cert-progress/sheets/available/:projectId/:spreadsheetCode
Disponibilidad de hoja
GET
/cert-progress/sheets/check-group/:projectId/:chatId/:sheetCode
Verificar grupo en hoja
GET
/cert-progress/blocks/by-sheet-code/:chatId/:sheetCode
Bloques por código de hoja
POST
/cert-progress/add-to-whitelist
Agregar a whitelist
POST
/cert-progress/send-image
Enviar imagen de certificación
POST
/cert-progress/send-video
Enviar video de certificación
POST
/cert-progress/dictionaries/assign-group
Asignar grupo a proyecto
POST
/certification/sheet-code
Generar hoja de progreso
GET
/certification/sheets/:projectId
Hojas del proyecto
GET
/certification/whatsapp-groups/:projectId
Grupos WhatsApp del proyecto
POST
/whatsapp-group
Crear grupo WhatsApp
PUT
/cert-progress/users
Actualizar usuario de certificación
PUT
/cert-progress/sheets
Actualizar hoja
PUT
/cert-progress/dictionaries/invite-url
Actualizar URL de invitación
DELETE
/sheets
Deshabilitar hoja
OpenAI / Asistente IA
GET
/open-ai/messages/assistant-response/:threadId
Respuesta del asistente por thread
POST
/open-ai/threads
Crear thread de conversación
POST
/open-ai/runs
Ejecutar asistente en thread
POST
/open-ai/whatsapp-assistant
Crear asistente de WhatsApp
PUT
/open-ai/threads/add-message
Agregar mensaje a thread
WhatsApp (whatsmeow)
GET
/whatsmeow/connect
Conectar WhatsApp (QR)
POST
/whatsmeow/feed-assistant
Alimentar asistente con contexto
POST
/whatsmeow/feed-assistant/general-context
Alimentar con contexto general
POST
/whatsmeow/handle-text-message
Procesar mensaje de texto WhatsApp
POST
/whatsapp/progress-certification
Certificación de progreso vía WhatsApp (ruta pública)
Multi-Sign (firma múltiple)
GET
/multi-sign/actions/:projectId
Acciones de firma múltiple
GET
/multi-sign/signature-schemes/:projectId
Esquemas de firma
GET
/multi-sign/blocks/:projectId
Bloques con firma múltiple
POST
/multi-sign/action
Crear acción de firma
POST
/multi-sign/level
Crear nivel de firma
POST
/multi-sign/signature-scheme
Crear esquema de firma
PUT
/multi-sign/assign-scheme
Asignar esquema a bloques
PUT
/multi-sign/assign-users
Asignar usuarios a nivel
Asistentes / For-Assistants
GET
/for-assistants/project-info/:projectId
Info del proyecto para asistentes
GET
/for-assistants/priority-data/:projectId
Datos de prioridad
GET
/for-assistants/worktables-data/:projectId
Datos de worktables
GET
/for-assistants/get-blocks/:projectId
Bloques para asistente
GET
/for-assistants/get-labels/:projectId
Etiquetas para asistente
GET
/for-assistants/get-current-date-time
Fecha/hora actual
POST
/for-assistants/resources-data
Datos de recursos
POST
/for-assistants/get-general-data
Datos generales
POST
/for-assistants/get-certification-history
Historial de certificación
POST
/for-assistants/certify-blocks
Certificar bloques vía asistente
POST
/for-assistants/send-photographs
Enviar fotografías vía asistente
POST
/for-assistants/logbook-registration
Registro en bitácora
Otros
GET
/ws
WebSocket endpoint
GET
/test
Health check
POST
/process-blocks
Procesar bloques (delegado a process-blocks)
POST
/new-params/get-format-file
Obtener archivo de formato
PUT
/new-params/assign-blocks-to-item
Asignar bloques a item (new-params)
PUT
/new-params/upload-params
Subir parámetros
POST
/img-recognition
Reconocimiento de imagen
Sistema de Autenticación
Middleware Auth()
Valida el JWT en el header Authorization: Bearer <token> en todas las rutas excepto las definidas en ALLOWED_PATHS
Rutas públicas por defecto: /users/login, /users/register, /test, /gen-access-token, /gen-admin-token, /refresh-token, /whatsapp/progress-certification
Validación adicional por IP/Host (ALLOWED_HOSTS)
Máximo de cuerpo de solicitud: 50 MB (para subida de imágenes/videos/IFC)
WebSocket
Endpoint: GET /ws
Implementado con gorilla/websocket
Hub centralizado ejecutado en goroutine separada (websocket.WebSocketHub.Run())
Propósito: notificaciones en tiempo real al frontend
Variables de Entorno
ENVIRONMENT
Ambiente: dev, qa, prod, local
{ENV}_PORT
Puerto HTTP del servicio
{ENV}_ALLOWED_ORIGINS
Orígenes CORS permitidos
{ENV}_ALLOWED_HOSTS
Hosts internos permitidos para middleware Auth
{ENV}_ALLOWED_PATHS
Rutas públicas sin autenticación
{ENV}_WUZAPI_KEY
Clave API para Wuzapi (WhatsApp)
{ENV}_WUZAPI_TOKEN
Token de Wuzapi
{ENV}_PRIORITY_URL
URL del servicio priority-blocks
{ENV}_CERT_PROGRESS_URL
URL del servicio progress-certification
{ENV}_OPEN_AI_URL
URL del servicio open-ai
{ENV}_NEW_PARAMS_URL
URL del servicio new-params
{ENV}_USERS_URL
URL del servicio users (bt-central)
{ENV}_PROJECTS_URL
URL del servicio projects (bt-central)
{ENV}_BLOCKS_URL
URL del servicio blocks (bt-central)
{ENV}_LABELS_URL
URL del servicio labels (bt-central)
{ENV}_WHATSAPP_BOT_URL
URL del servicio whatsapp-bot
Dependencias Clave (go.mod)
gin-gonic/gin
Framework HTTP
gin-contrib/cors
CORS
golang-jwt/jwt/v5
JWT
go.mongodb.org/mongo-driver
MongoDB
gorilla/websocket
WebSocket
go.mau.fi/whatsmeow
WhatsApp (protocolo nativo)
mattn/go-sqlite3
SQLite (para whatsmeow)
rs/zerolog
Logging estructurado
Alertas Técnicas
Tokens de Wuzapi hardcodeados en el código fuente — deben migrarse a vault
Actúa como monolito de orquestación : concentra toda la lógica de routing de ~20 servicios en un único proceso
Sin circuit breaker ni retry logic: si un servicio downstream falla, la petición falla directamente
El WebSocket hub se inicia después de router.Run() (que bloquea): el hub nunca arranca. Bug conocido en el orden de inicialización
Rutas duplicadas: muchos endpoints tienen versión antigua y versión v2 con la misma lógica
Puertos por Ambiente
prod
:8085
qa
:8085
dev
:8086
local
:8086
← Anterior
Servicio · s3-manager-ms
Siguiente →
Servicio · priority-blocks