UNPKG

event-local

Version:

Event client

104 lines 4.85 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); const MySQLModule_1 = require("./MySQLModule"); const DomenEvent_1 = require("./DomenEvent"); /** * Мы будем создавать агрегат репозитория с шаблонным кодом, передавая в нём название * сущности, за хранение которой он ответственнен. * пример кода * * new TemoeratureRepository() { * constructor() { * super(Temperature) * } * } * * const temoeratureRepository = new TemoeratureRepository(); * temoeratureRepository.find(12) * */ class AggregateRepository { constructor(entity) { this.entity_type = "none"; this.entity_type = entity.constructor.name; this.entity = entity.constructor; this.rand = Math.round(Math.random() * 100); } /** * Вставляет события в таблицу events, и создаёт сущность entities. */ async save(agregatCommand) { let id = agregatCommand.entity_id; if (!id) { id = this.rand + "-" + Date.now(); } // Проверим, исполнялась ли эта команда ранее let col = await MySQLModule_1.default.db.query("SELECT * FROM `entities` WHERE `entity_type` = '" + this.entity_type + "' AND `entity_id` = '" + id + "'"); console.log(col.length); if (col.length > 0) throw new Error("Команда уже исполнялась"); col = await MySQLModule_1.default.db.query("INSERT INTO `entities`(`entity_type`, `entity_id`, `entity_version`) VALUES " + `('${this.entity_type}','${id}','1')`); console.log(col); agregatCommand.entity_id = id; const agregate = new this.entity(); console.log(agregatCommand); let events = agregate.process(agregatCommand); events.forEach(async (event) => { agregate.apply(event); await this.saveEvent(event); }); return agregate; } async saveEvent(event) { let i = await MySQLModule_1.default.db.query("INSERT INTO `events`(" + "`event_id`, `event_type`, `event_data`, `entity_type`, `entity_id`, `triggering_event`) VALUES " + `(NULL,'${event.event_type}','${JSON.stringify(event.event_data)}','${this.entity_type}','${event.entity_id}',${event.triggering_event ? "'" + event.triggering_event + "'" : "NULL"})`); // await this.broker.emit( event.entity.constructor.name.toLowerCase() + '.'+event.type.toLowerCase(), JSON.stringify(event)) } async find(id) { // поиск снимка const entity = this.entity_type; const snapshot = await MySQLModule_1.default.db.query(`SELECT * FROM \`snapshots\` WHERE \`entity_type\` = '${entity}' and \`entity_id\` = '${id}' LIMIT 0,1`); let agregate = null; let event = []; // if есть снимок if (snapshot[0]) { agregate = new this.entity(JSON.parse(snapshot[0].snapshot_json)); // ищем все события event_id > entity_version event = await MySQLModule_1.default.db.query(`SELECT * FROM \`events\` WHERE \`entity_type\` = '${entity}' and \`entity_id\` = '${id}' and \`event_id\` > '${snapshot[0].entity_version}' ORDER BY \`event_id\` ASC `); } else { agregate = new this.entity({}); // берём все события этой сущности event = await MySQLModule_1.default.db.query(`SELECT * FROM \`events\` WHERE \`entity_type\` = '${entity}' and \`entity_id\` = '${id}' ORDER BY \`create_at\` ASC`); console.log(`SELECT * FROM \`events\` WHERE \`entity_type\` = '${entity}' and \`entity_id\` = '${id}' ORDER BY \`create_at\` ASC`); } console.log(event); event.forEach(r => { agregate.apply(new DomenEvent_1.DomenEvent(r)); }); return agregate; // Получает текущую версию из entities } /** * Вставляет события в таблицу events, Обновляет версию до актуальной. */ async update(agregatCommand) { const agregate = await this.find(agregatCommand.entity_id); let events = agregate.process(agregatCommand); console.log(agregatCommand, agregate, events); events.forEach(async (event) => { agregate.apply(event); await this.saveEvent(event); }); agregatCommand.entity = agregate; return agregate; } } exports.AggregateRepository = AggregateRepository; //# sourceMappingURL=AggregateRepository.js.map