iagate-querykit
Version:
QueryKit: lightweight TypeScript query toolkit with models, views, triggers, events, scheduler and adapters (better-sqlite3).
156 lines (155 loc) • 5.08 kB
JavaScript
/**
* Gerenciador de múltiplos bancos de dados usando o padrão Singleton.
* Permite executar queries em diferentes bancos simultaneamente e
* gerenciar conexões de forma centralizada.
*
* @example
* ```typescript
* // Dados iniciais
* const config: MultiDatabaseConfig = {
* defaultDatabase: 'users',
* databases: {
* users: { host: 'localhost', database: 'users_db' },
* products: { host: 'localhost', database: 'products_db' }
* }
* };
*
* // Como usar
* const manager = MultiDatabaseManager.getInstance(config);
* await manager.initialize(createPostgresAdapter);
*
* // Output: Gerenciador inicializado com adapters conectados
* ```
*/
export class MultiDatabaseManager {
static instance;
adapters = new Map();
config;
constructor(config) {
this.config = config;
}
/**
* Obtém a instância única do MultiDatabaseManager (Singleton).
* Se config for fornecido e não houver instância, cria uma nova.
*
* @param config - Configuração opcional para múltiplos bancos
* @returns Instância única do MultiDatabaseManager
*
* @example
* ```typescript
* // Dados iniciais
* const config: MultiDatabaseConfig = { ... };
*
* // Como usar
* const manager = MultiDatabaseManager.getInstance(config);
*
* // Output: Instância única do gerenciador obtida
* ```
*/
static getInstance(config) {
if (!MultiDatabaseManager.instance && config) {
MultiDatabaseManager.instance = new MultiDatabaseManager(config);
}
return MultiDatabaseManager.instance;
}
/**
* Inicializa todos os adapters de banco de dados configurados.
* Cria e conecta cada adapter usando a função factory fornecida.
*
* @param createAdapter - Função factory para criar adapters
* @returns Promise que resolve quando todos os adapters estiverem conectados
*
* @example
* ```typescript
* // Dados iniciais
* const createPostgresAdapter = (config: DatabaseConfig) => new PostgresAdapter(config);
*
* // Como usar
* await manager.initialize(createPostgresAdapter);
*
* // Output: Todos os adapters inicializados e conectados
* ```
*/
async initialize(createAdapter) {
for (const [name, dbConfig] of Object.entries(this.config.databases)) {
const adapter = createAdapter(dbConfig);
await adapter.connect();
this.adapters.set(name, adapter);
}
}
/**
* Obtém um adapter específico pelo nome.
*
* @param name - Nome do banco de dados
* @returns Adapter do banco especificado
* @throws Error se o adapter não for encontrado
*
* @example
* ```typescript
* // Dados iniciais
* const manager = MultiDatabaseManager.getInstance(config);
*
* // Como usar
* const userAdapter = manager.getAdapter('users');
*
* // Output: Adapter do banco 'users' obtido com sucesso
* ```
*/
getAdapter(name) {
const adapter = this.adapters.get(name);
if (!adapter)
throw new Error(`Database adapter '${name}' not found`);
return adapter;
}
/**
* Obtém o adapter padrão configurado.
*
* @returns Adapter do banco padrão
*
* @example
* ```typescript
* // Dados iniciais
* const manager = MultiDatabaseManager.getInstance(config);
*
* // Como usar
* const defaultAdapter = manager.getDefaultAdapter();
*
* // Output: Adapter padrão obtido (ex: 'users')
* ```
*/
getDefaultAdapter() { return this.getAdapter(this.config.defaultDatabase); }
/**
* Executa uma query em múltiplos bancos de dados simultaneamente.
* Útil para operações que precisam ser replicadas em vários bancos.
*
* @param databaseNames - Lista de nomes dos bancos onde executar a query
* @param query - Query SQL a ser executada
* @param params - Parâmetros opcionais para a query
* @returns Objeto com resultados de cada banco, indexado pelo nome
*
* @example
* ```typescript
* // Dados iniciais
* const manager = MultiDatabaseManager.getInstance(config);
* const query = 'SELECT COUNT(*) as total FROM users';
*
* // Como usar
* const results = await manager.executeOnMultiple(['users', 'analytics'], query);
*
* // Output: { users: { data: [{ total: 150 }] }, analytics: { data: [{ total: 150 }] } }
* ```
*/
async executeOnMultiple(databaseNames, query, params) {
const results = {};
await Promise.all(databaseNames.map(async (name) => {
try {
const adapter = this.getAdapter(name);
results[name] = await adapter.executeQuery(query, params);
}
catch (error) {
results[name] = { data: [], metadata: { error: error.message } };
}
}));
return results;
}
}