1
0
mirror of https://github.com/Unleash/unleash.git synced 2024-10-18 20:09:08 +02:00
unleash.unleash/src/lib/db/event-store.js

108 lines
2.7 KiB
JavaScript
Raw Normal View History

2016-06-18 21:53:18 +02:00
'use strict';
2016-10-26 10:43:11 +02:00
2016-11-05 10:16:48 +01:00
const { EventEmitter } = require('events');
const { DROP_FEATURES } = require('../event-type');
2016-11-05 10:16:48 +01:00
const EVENT_COLUMNS = [
'id',
'type',
'created_by',
'created_at',
'data',
'tags',
];
2014-10-23 10:32:13 +02:00
const TABLE = 'events';
2016-11-05 10:16:48 +01:00
class EventStore extends EventEmitter {
constructor(db, getLogger) {
2016-11-05 10:16:48 +01:00
super();
this.db = db;
this.logger = getLogger('lib/db/event-store.js');
2016-11-05 10:16:48 +01:00
}
2020-09-18 09:05:09 +02:00
async store(event) {
try {
const rows = await this.db(TABLE)
.insert(this.eventToDbRow(event))
.returning(EVENT_COLUMNS);
const savedEvent = this.rowToEvent(rows[0]);
process.nextTick(() => this.emit(event.type, savedEvent));
} catch (e) {
this.logger.warn(`Failed to store event ${e}`);
}
}
2014-10-23 10:32:13 +02:00
async batchStore(events) {
try {
const savedRows = await this.db(TABLE)
.insert(events.map(this.eventToDbRow))
.returning(EVENT_COLUMNS);
const savedEvents = savedRows.map(this.rowToEvent);
process.nextTick(() =>
savedEvents.forEach(e => this.emit(e.type, e)),
);
} catch (e) {
this.logger.warn('Failed to store events');
}
}
2020-09-18 09:05:09 +02:00
async getEvents() {
try {
const rows = await this.db
.select(EVENT_COLUMNS)
.from(TABLE)
.limit(100)
.orderBy('created_at', 'desc');
2020-09-18 09:05:09 +02:00
return rows.map(this.rowToEvent);
} catch (err) {
return [];
}
}
2020-09-18 09:05:09 +02:00
async getEventsFilterByName(name) {
try {
const rows = await this.db
.select(EVENT_COLUMNS)
.from(TABLE)
.limit(100)
.whereRaw("data ->> 'name' = ?", [name])
.andWhere(
'id',
'>=',
this.db
.select(this.db.raw('coalesce(max(id),0) as id'))
.from(TABLE)
.where({ type: DROP_FEATURES }),
)
.orderBy('created_at', 'desc');
return rows.map(this.rowToEvent);
} catch (err) {
return [];
}
}
2014-10-24 15:32:33 +02:00
2017-06-28 10:17:14 +02:00
rowToEvent(row) {
return {
id: row.id,
type: row.type,
createdBy: row.created_by,
createdAt: row.created_at,
2016-06-18 21:55:46 +02:00
data: row.data,
tags: row.tags,
};
}
eventToDbRow(e) {
return {
type: e.type,
created_by: e.createdBy,
data: e.data,
tags: JSON.stringify(e.tags),
};
}
2017-06-28 10:17:14 +02:00
}
2016-11-05 10:16:48 +01:00
module.exports = EventStore;