coddyger
Version:
Coddyger est une bibliothèque JavaScript/TypeScript qui fournit des fonctions communes et des plugins pour la gestion des données, la communication entre services, et des utilitaires avancés pour le développement d'applications.
96 lines (82 loc) • 3.26 kB
text/typescript
import mongoose from 'mongoose';
import env from '../../globals';
import coddyger from '../../coddyger';
export class MongooseDataAccess {
private readonly options: mongoose.ConnectOptions;
private readonly connectionUri: string;
constructor(connectionUri?: string) {
// Options recommandées pour Mongoose 8.x
this.options = {
serverSelectionTimeoutMS: 5000, // Timeout de sélection du serveur
socketTimeoutMS: 45000, // Timeout des opérations
maxPoolSize: 10, // Taille maximale du pool de connexions
minPoolSize: 1, // Taille minimale du pool de connexions
maxIdleTimeMS: 30000, // Temps maximum d'inactivité d'une connexion
waitQueueTimeoutMS: 10000, // Timeout de la file d'attente
};
// Utiliser l'URI fourni ou construire l'URI par défaut
this.connectionUri = connectionUri ||
`${env.database.connectionString}/${env.database.name}?authSource=admin`;
}
async connect(uri?: string): Promise<void> {
try {
// Utiliser l'URI fourni en paramètre, ou celui du constructeur, ou celui par défaut
const finalUri = uri || this.connectionUri;
// Activer le mode strict pour les requêtes
mongoose.set('strictQuery', true);
const connection = await mongoose.connect(finalUri, this.options);
if(uri) {
coddyger.konsole(`✅ MongoDB connecté :: ${finalUri}`);
} else {
const dbName = connection.connections[0].name || process.env.DB_NAME || 'non défini';
coddyger.konsole(`✅ MongoDB connecté :: ${connection.connections[0].host}:${connection.connections[0].port}:${dbName.replace("/undefined", '')}`);
}
// Gestion des événements de connexion
mongoose.connection.on('error', (err) => {
coddyger.konsole('❌ Erreur de connexion MongoDB', 1);
console.error(err);
});
mongoose.connection.on('disconnected', () => {
coddyger.konsole('🔌 MongoDB déconnecté', 2);
});
mongoose.connection.on('reconnected', () => {
coddyger.konsole('♻️ MongoDB reconnecté');
});
// Gestion propre de la fermeture
process.on('SIGINT', async () => {
try {
await mongoose.connection.close();
coddyger.konsole('🛑 Connexion MongoDB fermée suite à l\'arrêt de l\'application');
process.exit(0);
} catch (err) {
console.error('Erreur lors de la fermeture de la connexion MongoDB:', err);
process.exit(1);
}
});
} catch (err: any) {
coddyger.konsole('Erreur de connexion MongoDB', 1);
console.error(err);
throw err;
}
}
/**
* Exécute une fonction dans une transaction MongoDB (session)
* @param callback - Fonction asynchrone recevant la session mongoose
* @returns Résultat de la fonction callback
*/
async transaction<T>(callback: (session: mongoose.ClientSession) => Promise<T>): Promise<T> {
const session = await mongoose.startSession();
let result: T;
try {
await session.startTransaction();
result = await callback(session);
await session.commitTransaction();
} catch (err) {
await session.abortTransaction();
throw err;
} finally {
session.endSession();
}
return result;
}
}