tractatus/src/utils/mongoose.util.js
TheFlow 40601f7d27 refactor(lint): fix code style and unused variables across src/
- Fixed unused function parameters by prefixing with underscore
- Removed unused imports and variables
- Applied eslint --fix for automatic style fixes
  - Property shorthand
  - String template literals
  - Prefer const over let where appropriate
  - Spacing and formatting

Reduces lint errors from 108+ to 78 (61 unused vars, 17 other issues)

Related to CI lint failures in previous commit

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-24 20:15:26 +13:00

104 lines
2.5 KiB
JavaScript

/**
* Mongoose Connection Utility
* Manages Mongoose ODM connection for MongoDB models
*/
const mongoose = require('mongoose');
const logger = require('./logger.util');
class MongooseConnection {
constructor() {
this.connected = false;
this.uri = process.env.MONGODB_URI || 'mongodb://localhost:27017/tractatus_dev';
}
/**
* Connect to MongoDB using Mongoose
*/
async connect(retries = 5) {
if (this.connected) {
return;
}
// Mongoose connection options
const options = {
maxPoolSize: 10,
minPoolSize: 2,
maxIdleTimeMS: 30000,
serverSelectionTimeoutMS: 5000,
socketTimeoutMS: 45000,
family: 4 // Use IPv4, skip trying IPv6
};
for (let attempt = 1; attempt <= retries; attempt++) {
try {
await mongoose.connect(this.uri, options);
this.connected = true;
logger.info(`✅ Mongoose connected to MongoDB`);
// Handle connection events
mongoose.connection.on('error', err => {
logger.error('Mongoose connection error:', err);
});
mongoose.connection.on('disconnected', () => {
logger.warn('Mongoose disconnected');
this.connected = false;
});
mongoose.connection.on('reconnected', () => {
logger.info('Mongoose reconnected');
this.connected = true;
});
return;
} catch (error) {
logger.error(`Mongoose connection attempt ${attempt}/${retries} failed:`, error.message);
if (attempt === retries) {
throw new Error(`Failed to connect Mongoose after ${retries} attempts: ${error.message}`);
}
// Wait before retry (exponential backoff)
await this.sleep(Math.min(1000 * Math.pow(2, attempt - 1), 10000));
}
}
}
/**
* Close Mongoose connection
*/
async close() {
if (mongoose.connection.readyState !== 0) {
await mongoose.disconnect();
this.connected = false;
logger.info('Mongoose connection closed');
}
}
/**
* Check if connected
*/
isConnected() {
return mongoose.connection.readyState === 1;
}
/**
* Sleep utility for retry logic
*/
sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
}
// Singleton instance
const mongooseConnection = new MongooseConnection();
module.exports = {
connect: () => mongooseConnection.connect(),
close: () => mongooseConnection.close(),
isConnected: () => mongooseConnection.isConnected(),
mongoose // Export mongoose instance for direct access if needed
};