purchase-mcp-server
Version:
Purchase and budget management server handling requisitions, purchase orders, expenses, budgets, and vendor management with ERP access for data extraction
200 lines • 7.01 kB
JavaScript
import { MongoClient } from 'mongodb';
import { logger } from './logger.js';
import { config } from './config.js';
// Main MongoDB clients
let client = null;
let secondaryClient = null;
// Specific database clients
let devApiClient = null;
let etlDevClient = null;
let etlDevDataClient = null;
/**
* Initialize all MongoDB connections
* This should be called during server startup
*/
export async function initializeConnections() {
// Skip MongoDB connection in test environment
if (process.env.NODE_ENV === 'test') {
logger.info('Test environment detected, skipping MongoDB connections');
return;
}
try {
// Initialize primary connection
if (!client && config.mongoUri) {
client = new MongoClient(config.mongoUri);
await client.connect();
logger.info('Connected to primary MongoDB instance');
}
// Initialize secondary connection if configured
if (!secondaryClient && config.secondaryMongoUri) {
secondaryClient = new MongoClient(config.secondaryMongoUri);
await secondaryClient.connect();
logger.info('Connected to secondary MongoDB instance');
}
// Initialize dev-api connection
if (!devApiClient && config.devApiMongoUri) {
devApiClient = new MongoClient(config.devApiMongoUri);
await devApiClient.connect();
logger.info('Connected to dev-syia-api MongoDB instance');
}
// Initialize etl-dev connection
if (!etlDevClient && config.etlDevMongoUri) {
etlDevClient = new MongoClient(config.etlDevMongoUri);
await etlDevClient.connect();
logger.info('Connected to syia-etl-dev MongoDB instance');
}
// Initialize etl-dev-data connection
if (!etlDevDataClient && config.etlDevDataUri) {
etlDevDataClient = new MongoClient(config.etlDevDataUri);
await etlDevDataClient.connect();
logger.info('Connected to syia-etl-dev-data MongoDB instance');
}
logger.info('All MongoDB connections initialized successfully');
}
catch (error) {
logger.error('Error initializing MongoDB connections:', error);
throw error;
}
}
/**
* Get MongoDB client based on URI or default
*/
export async function getMongoClient(uri) {
// Skip MongoDB connection in test environment
if (process.env.NODE_ENV === 'test') {
logger.info('Test environment detected, skipping MongoDB connection');
return {};
}
// If URI is provided, use it for a specific connection
if (uri) {
// Check for dev-api connection
if (uri === config.devApiMongoUri) {
if (!devApiClient) {
// If not initialized during startup, initialize now
devApiClient = new MongoClient(uri);
await devApiClient.connect();
logger.info('Connected to dev-syia-api MongoDB instance');
}
return devApiClient;
}
// Check for etl-dev connection
if (uri === config.etlDevMongoUri) {
if (!etlDevClient) {
// If not initialized during startup, initialize now
etlDevClient = new MongoClient(uri);
await etlDevClient.connect();
logger.info('Connected to syia-etl-dev MongoDB instance');
}
return etlDevClient;
}
// Check for etl-dev-data connection
if (uri === config.etlDevDataUri) {
if (!etlDevDataClient) {
// If not initialized during startup, initialize now
etlDevDataClient = new MongoClient(uri);
await etlDevDataClient.connect();
logger.info('Connected to syia-etl-dev-data MongoDB instance');
}
return etlDevDataClient;
}
// For specific URIs that don't match any predefined connections
if (uri !== config.mongoUri && uri !== config.secondaryMongoUri) {
const tempClient = new MongoClient(uri);
await tempClient.connect();
return tempClient;
}
// If it matches secondary URI, use the secondary client
if (uri === config.secondaryMongoUri && config.secondaryMongoUri) {
if (!secondaryClient) {
// If not initialized during startup, initialize now
secondaryClient = new MongoClient(uri);
await secondaryClient.connect();
logger.info('Connected to secondary MongoDB instance');
}
return secondaryClient;
}
}
// Default case: use primary client with config.mongoUri
if (!client) {
// If not initialized during startup, initialize now
client = new MongoClient(config.mongoUri);
await client.connect();
logger.info('Connected to primary MongoDB instance');
}
return client;
}
/**
* Get dev-api MongoDB client
*/
export async function getDevApiClient() {
return getMongoClient(config.devApiMongoUri);
}
/**
* Get etl-dev MongoDB client
*/
export async function getEtlDevClient() {
return getMongoClient(config.etlDevMongoUri);
}
/**
* Get etl-dev-data MongoDB client
*/
export async function getEtlDevDataClient() {
return getMongoClient(config.etlDevDataUri);
}
/**
* Get etl-dev-data database name
*/
export function getEtlDevDataDbName() {
return config.etlDevDataDbName;
}
/**
* Get dev-api database name
*/
export function getDevApiDbName() {
return config.devApiDbName;
}
/**
* Get etl-dev database name
*/
export function getEtlDevDbName() {
return config.etlDevDbName;
}
/**
* Close all MongoDB connections
* This should be called during server shutdown
*/
export async function closeConnections() {
try {
if (client) {
await client.close();
client = null;
logger.info('Closed primary MongoDB connection');
}
if (secondaryClient) {
await secondaryClient.close();
secondaryClient = null;
logger.info('Closed secondary MongoDB connection');
}
if (devApiClient) {
await devApiClient.close();
devApiClient = null;
logger.info('Closed dev-syia-api MongoDB connection');
}
if (etlDevClient) {
await etlDevClient.close();
etlDevClient = null;
logger.info('Closed syia-etl-dev MongoDB connection');
}
if (etlDevDataClient) {
await etlDevDataClient.close();
etlDevDataClient = null;
logger.info('Closed syia-etl-dev-data MongoDB connection');
}
logger.info('All MongoDB connections closed successfully');
}
catch (error) {
logger.error('Error closing MongoDB connections:', error);
throw error;
}
}
//# sourceMappingURL=mongodb.js.map