Servicio: blocklist
Información General
- Propósito: Servicio de clasificación de bloques constructivos. Recibe una lista de bloques y verifica si ya existen en la base de datos MongoDB del proyecto, clasificándolos como
existing,newoinvalid. - Tecnología: Node.js ≥18 / Express 4
- Puerto:
3000(por defecto, configurable víaPORT) - Módulo:
block-list-service
Propósito de Negocio
Cuando se importa un nuevo modelo IFC o se carga una lista de bloques desde una fuente externa, es necesario saber cuáles bloques ya existen en el sistema y cuáles son nuevos. Este servicio hace esa clasificación consultando directamente MongoDB.
Soporta dos arquitecturas de base de datos del ecosistema BimTrazER:
- Centralizado: un servidor MongoDB único donde cada proyecto es una base de datos separada
- Tradicional: cada proyecto tiene su propia máquina MongoDB (dominios como
{projectId}.bimtrazer.com)
Endpoints Expuestos
| Método | Path | Descripción |
|---|---|---|
POST |
/api/blocks/check-existence |
Clasificar lista de bloques contra la BD del proyecto |
POST /api/blocks/check-existence
Request Body:
{
"blocks": [
{
"name": "string (opcional si hay description)",
"description": "string (opcional si hay name)",
"start": "fecha inicio",
"finish": "fecha fin"
}
],
"projectType": "centralizado | tradicional",
"projectId": "código del proyecto"
}
Respuesta exitosa (200):
{
"error": false,
"message": "Blocks classified successfully",
"data": {
"summary": {
"totalReceived": 10,
"existingCount": 6,
"newCount": 4,
"invalidCount": 0
},
"blocks": [
{
"index": 0,
"description": "NOMBRE DEL BLOQUE",
"start": "2024-01-01",
"finish": "2024-03-31",
"status": "existing | new | invalid"
}
]
}
}
Lógica de Clasificación
- Valida que
blockssea array no vacío, y queprojectTypeyprojectIdestén presentes - Resuelve la URI de MongoDB según
projectType - Conecta a MongoDB en tiempo real (sin pool, conexión nueva por request)
- Obtiene todos los bloques de la colección
blockIfc - Por cada bloque recibido: resuelve el nombre (prioriza
name, luegodescription), normaliza (elimina acentos, convierte a mayúsculas) y busca coincidencia exacta por nombre normalizado enblockIfc - Si hay algún bloque
invalid→ responde 400 con detalles - Cierra la conexión MongoDB en el bloque
finally
Base de Datos
- Motor: MongoDB (sin pool — conexión directa por request)
- Colección:
blockIfc - Timeout de conexión: 10 segundos
| ProjectId | Host por Defecto |
|---|---|
00 |
00.bimtrazer.com:27017 |
42–57 |
{id}.bimtrazer.com:27017 |
36dev, 00dev |
hosts dev |
Variables de Entorno
| Variable | Descripción | Default |
|---|---|---|
PORT |
Puerto del servidor | 3000 |
MONGO_USERNAME |
Usuario MongoDB | admin |
MONGO_PASSWORD |
Contraseña MongoDB (sensible) | hardcodeado |
MONGO_URI_CENTRAL |
URI MongoDB centralizado | construido con host fijo |
MONGO_URI_TRAD_{ID} |
URI de proyecto tradicional | construido con {id}.bimtrazer.com |
Middlewares
- CORS:
app.use(cors())— completamente abierto (sin restricción de origen) express.json()— parsing de JSON
Alertas Técnicas
- Credenciales MongoDB hardcodeadas — visibles en el código fuente (prioridad alta)
- IP del servidor MongoDB centralizado hardcodeada
- CORS completamente abierto — cualquier origen puede llamar al servicio
- Sin autenticación en el endpoint
- Conexión nueva a MongoDB por cada request (sin pool) — puede ser lento bajo carga alta
- Carga todos los bloques de la colección en memoria para comparación — puede ser problemático con colecciones grandes
- Dependencias incluidas pero no usadas en el código actual:
axios,form-data,multer