/** * Configuração de conexões (aliases de banco). * * Gerencia aliases estáticos (definidos em código) e customizados * (adicionados via API e persistidos em databases_custom.json). */ const path = require('path'); const fs = require('fs'); const CUSTOM_DB_PATH = path.resolve(__dirname, '..', 'databases_custom.json'); // Conexões dinâmicas salvas em JSON let customDatabases = {}; try { if (fs.existsSync(CUSTOM_DB_PATH)) { customDatabases = JSON.parse(fs.readFileSync(CUSTOM_DB_PATH, 'utf8')); } } catch (e) { console.error('[Databases] Erro ao carregar databases_custom.json:', e.message); } // Valores padrão para Firebird const DRIVER_DEFAULTS = { firebird: { host: 'localhost', port: 3050, user: 'SYSDBA', password: 'masterkey', encoding: 'UTF-8', lowercase_keys: false, pageSize: 4096, wireCrypt: 1, }, }; /** * Conexões estáticas. */ const databases = { novo_local: { driver: 'firebird', host: process.env.DB_HOST || 'localhost', port: parseInt(process.env.DB_PORT, 10) || 3050, database: process.env.DB_DATABASE || path.resolve(__dirname, '../../db/NOVO.FDB'), user: process.env.DB_USER || 'SYSDBA', password: process.env.DB_PASSWORD || 'masterkey', encoding: process.env.DB_ENCODING || 'UTF-8', lowercase_keys: false, pageSize: 4096, wireCrypt: 1, }, novo: { driver: 'firebird', host: '177.70.23.53', port: 3050, database: 'sigef_web_novo', user: process.env.DB_USER || 'SYSDBA', password: process.env.DB_PASSWORD || 'masterkey', encoding: process.env.DB_ENCODING || 'UTF-8', lowercase_keys: false, pageSize: 4096, wireCrypt: 1, }, paz_suprema: { driver: 'firebird', host: '177.70.23.53', port: 3050, database: 'sigef_web_paz_suprema', user: process.env.DB_USER || 'SYSDBA', password: process.env.DB_PASSWORD || 'masterkey', encoding: process.env.DB_ENCODING || 'UTF-8', lowercase_keys: false, pageSize: 4096, wireCrypt: 1, }, }; function salvarCustomDatabases() { try { fs.writeFileSync(CUSTOM_DB_PATH, JSON.stringify(customDatabases, null, 2), 'utf8'); return true; } catch (e) { console.error('[Databases] Erro ao salvar databases_custom.json:', e.message); return false; } } /** Normaliza uma config bruta aplicando defaults do driver. */ function normalize(raw) { const d = DRIVER_DEFAULTS['firebird']; return { driver: 'firebird', host: raw.host || d.host, port: raw.port || d.port, database: raw.database, user: raw.user || d.user, password: raw.password || d.password, encoding: raw.encoding || d.encoding, lowercase_keys: raw.lowercase_keys || d.lowercase_keys, role: raw.role || null, pageSize: raw.pageSize || d.pageSize, wireCrypt: raw.wireCrypt !== undefined ? raw.wireCrypt : d.wireCrypt, }; } /** Configuração normalizada de um alias. */ function getConfig(alias) { if (!alias) throw new Error('Alias do banco não informado.'); const aliasLower = alias.toLowerCase(); const raw = customDatabases[aliasLower] || databases[aliasLower]; if (!raw) { throw new Error(`Alias "${alias}" não encontrado. Aliases disponíveis: ${listAliases().join(', ')}`); } return normalize(raw); } /** Lista de aliases disponíveis. */ function listAliases() { return Object.keys(databases).concat( Object.keys(customDatabases).filter((a) => !databases[a]) ); } /** Todos os aliases com tipo (estático ou custom). */ function listAllDatabases() { const result = {}; Object.keys(databases).forEach((alias) => { result[alias] = Object.assign({}, databases[alias], { _tipo: 'estatico' }); }); Object.keys(customDatabases).forEach((alias) => { result[alias] = Object.assign({}, customDatabases[alias], { _tipo: 'custom' }); }); return result; } /** Adiciona/atualiza conexão customizada. */ function addDatabase(alias, config) { if (!alias || !config || !config.database) { throw new Error('Alias e database são obrigatórios.'); } const aliasLower = alias.toLowerCase().replace(/[^a-z0-9_]/g, '_'); const stored = { driver: 'firebird' }; ['host', 'port', 'database', 'user', 'password', 'encoding', 'lowercase_keys', 'role', 'pageSize', 'wireCrypt'] .forEach((k) => { if (config[k] !== undefined && config[k] !== null && config[k] !== '') { stored[k] = config[k]; } }); customDatabases[aliasLower] = stored; return salvarCustomDatabases(); } /** Remove uma conexão customizada. */ function removeDatabase(alias) { if (!alias) return false; const aliasLower = alias.toLowerCase(); if (!customDatabases[aliasLower]) return false; delete customDatabases[aliasLower]; return salvarCustomDatabases(); } /** Nome do driver de um alias (sempre 'firebird'). */ function driverOf(alias) { return 'firebird'; } module.exports = { databases, customDatabases, getConfig, listAliases, listAllDatabases, addDatabase, removeDatabase, driverOf, DRIVER_DEFAULTS, };