UNPKG

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.

173 lines (172 loc) 6.91 kB
"use strict"; var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); exports.SequelizeDataAccess = void 0; const sequelize_1 = require("sequelize"); const globals_1 = __importDefault(require("../../globals")); const coddyger_1 = __importDefault(require("../../coddyger")); class SequelizeDataAccess { constructor(connectionString) { this.models = new Map(); // Permet de passer la chaîne de connexion en paramètre, sinon fallback sur l'env this.connectionString = connectionString || globals_1.default.database.connectionString; } // --- Méthode privée pour créer la base si elle n'existe pas (PostgreSQL) --- ensurePostgresDatabaseExists(connectionString) { return __awaiter(this, void 0, void 0, function* () { if (!connectionString.includes('postgresql://')) return; const dbNameMatch = RegExp(/\/([a-zA-Z0-9_-]+)(\?.*)?$/).exec(connectionString); if (!dbNameMatch) return; const dbName = dbNameMatch[1]; // Connexion temporaire à la base 'postgres' const adminConnectionString = connectionString.replace(/\/([a-zA-Z0-9_-]+)(\?.*)?$/, '/postgres'); const adminSequelize = new sequelize_1.Sequelize(adminConnectionString, { logging: false }); try { yield adminSequelize.query(`CREATE DATABASE "${dbName}"`) .catch((err) => { if (!/already exists/.test(err.message)) throw err; }); } finally { yield adminSequelize.close(); } }); } // --- FIN --- connect() { return __awaiter(this, void 0, void 0, function* () { yield this.ensurePostgresDatabaseExists(this.connectionString); // Créer l'instance Sequelize ici, après la création de la base const options = { dialect: globals_1.default.database.dialect, storage: globals_1.default.database.storage, logging: false, pool: { max: 5, min: 0, acquire: 30000, idle: 10000 }, define: { timestamps: true, underscored: true } }; this.sequelize = new sequelize_1.Sequelize(this.connectionString, options); try { yield this.sequelize.authenticate(); const config = this.sequelize.config; const dbInfo = `${config.host}:${config.port}:${config.database}`; coddyger_1.default.konsole(`✅ SQL connecté :: ${dbInfo}`); } catch (err) { coddyger_1.default.konsole('❌ Erreur de connexion SQL', 1); console.error(err); throw err; } }); } getSequelize() { if (!this.sequelize) throw new Error('Sequelize non connecté'); return this.sequelize; } sync(options) { return __awaiter(this, void 0, void 0, function* () { if (!this.sequelize) throw new Error('Sequelize non connecté'); try { yield this.sequelize.sync(options); coddyger_1.default.konsole('🔄 Base de données synchronisée'); } catch (err) { coddyger_1.default.konsole('Sync error', 1); console.error(err); } }); } close() { return __awaiter(this, void 0, void 0, function* () { if (!this.sequelize) throw new Error('Sequelize non connecté'); try { yield this.sequelize.close(); coddyger_1.default.konsole('🛑 Connexion SQL fermée'); } catch (err) { coddyger_1.default.konsole('❌ Erreur lors de la fermeture de la connexion SQL', 1); console.error(err); } }); } registerModel(name, model) { this.models.set(name, model); } getModel(name) { return this.models.get(name); } // Ajoutez ici des modèles Sequelize pour vos tables de base de données // Par exemple : // User = this.sequelize.define('User', { // firstName: { // type: DataTypes.STRING, // }, // lastName: { // type: DataTypes.STRING, // }, // }); // Définissez des méthodes pour gérer les opérations CRUD, par exemple, find, create, update, delete. isConnected() { return __awaiter(this, void 0, void 0, function* () { if (!this.sequelize) return false; try { yield this.sequelize.authenticate(); return true; } catch (_a) { return false; } }); } /** * Exécute une fonction dans une transaction Sequelize (commit/rollback auto) * @param callback - Fonction asynchrone recevant le transaction object * @returns Résultat de la fonction callback */ transaction(callback) { return __awaiter(this, void 0, void 0, function* () { if (!this.sequelize) throw new Error('Sequelize non connecté'); return yield this.sequelize.transaction((t) => __awaiter(this, void 0, void 0, function* () { return yield callback(t); })); }); } /** * Démarre une transaction manuelle (à commit/rollbacker soi-même) * @returns L'objet Transaction Sequelize */ getTransaction() { return __awaiter(this, void 0, void 0, function* () { if (!this.sequelize) throw new Error('Sequelize non connecté'); return yield this.sequelize.transaction(); }); } } exports.SequelizeDataAccess = SequelizeDataAccess;