/** * config.js — Configuración centralizada del Dashboard JIRA * * Carga y valida todas las variables de entorno. * Uso: import { config } from './config.js' */ // Función helper para obtener variable o lanzar error function getEnv(key, defaultValue = null) { const value = process.env[key] || defaultValue; if (!value) { throw new Error(`❌ Variable de entorno requerida no configurada: ${key}`); } return value; } // Función para convertir string a número function getEnvNumber(key, defaultValue) { const value = process.env[key] || defaultValue; const num = parseInt(value, 10); if (isNaN(num)) { throw new Error(`❌ ${key} debe ser un número válido, recibió: ${value}`); } return num; } // Validar que las credenciales estén presentes function validateCredentials() { const email = process.env.JIRA_EMAIL; const token = process.env.JIRA_TOKEN; if (!email) { throw new Error('❌ Falta JIRA_EMAIL en variables de entorno'); } if (!token) { throw new Error('❌ Falta JIRA_TOKEN en variables de entorno'); } // Validar formato de email if (!email.includes('@')) { throw new Error(`❌ JIRA_EMAIL parece inválido: ${email}`); } // Validar que el token no esté vacío if (token.length < 10) { throw new Error('❌ JIRA_TOKEN parece muy corto, verifica que sea válido'); } } // Construir JQL dinámicamente reemplazando variables function buildJQL() { const baseJQL = getEnv('JIRA_JQL', 'project = ${PROJECT} AND ${FIELD_SP_ESTIMATE} is not EMPTY ORDER BY updated DESC' ); return baseJQL .replace('${PROJECT}', getEnv('JIRA_PROJECT', 'LABS')) .replace('${FIELD_SP_ESTIMATE}', getEnv('JIRA_FIELD_SP_ESTIMATE', 'customfield_10016')); } // Exportar configuración export const config = { // ── JIRA Host ────────────────────────────────────────────────────── jira: { host: getEnv('JIRA_HOST', 'invera.atlassian.net'), email: getEnv('JIRA_EMAIL'), token: getEnv('JIRA_TOKEN'), project: getEnv('JIRA_PROJECT', 'LABS'), }, // ── Custom Fields (IDs) ──────────────────────────────────────────── fields: { spEstimate: getEnv('JIRA_FIELD_SP_ESTIMATE', 'customfield_10016'), spFinal: getEnv('JIRA_FIELD_SP_FINAL', 'customfield_11019'), developer: getEnv('JIRA_FIELD_DEVELOPER', 'customfield_10622'), // ── QA Fields ──────────────────────────────────────────────────── qaAssignee: 'customfield_10632', qaEntryRtqa: 'customfield_10821', qaTotalTimeRtqa: 'customfield_10822', qaLastDurRtqa: 'customfield_10823', qaEntryQa: 'customfield_10824', qaTotalTimeQa: 'customfield_10825', qaLastDurQa: 'customfield_10826', timesReturned: 'customfield_11217', }, // ── JQL Query ────────────────────────────────────────────────────── jql: buildJQL(), // ── API Settings ─────────────────────────────────────────────────── api: { maxResults: getEnvNumber('MAX_RESULTS', 500), cacheMsec: getEnvNumber('CACHE_MS', 86400000), // 24 horas por defecto }, // ── Environment ──────────────────────────────────────────────────── env: { nodeEnv: getEnv('NODE_ENV', 'development'), isProduction: getEnv('NODE_ENV', 'development') === 'production', isDevelopment: getEnv('NODE_ENV', 'development') === 'development', }, }; // ── Validación al cargar ─────────────────────────────────────────── try { validateCredentials(); console.log('✅ Configuración cargada correctamente'); console.log(` Host JIRA: ${config.jira.host}`); console.log(` Proyecto: ${config.jira.project}`); console.log(` Max Results: ${config.api.maxResults}`); console.log(` Cache: ${config.api.cacheMsec / 1000 / 60}min`); } catch (error) { console.error(error.message); process.exit(1); } export default config;