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
JavaScript
;
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;