'use strict'; const { EventEmitter } = require('events'); const EVENT_COLUMNS = ['id', 'type', 'created_by', 'created_at', 'data']; class EventStore extends EventEmitter { constructor (db) { super(); this.db = db; } store (event) { return this.db('events').insert({ type: event.type, created_by: event.createdBy, // eslint-disable-line data: event.data, }) .then(() => this.emit(event.type, event)); } getEvents () { return this.db .select(EVENT_COLUMNS) .from('events') .limit(100) .orderBy('created_at', 'desc') .map(this.rowToEvent); } getEventsFilterByName (name) { return this.db .select(EVENT_COLUMNS) .from('events') .limit(100) .whereRaw('data ->> \'name\' = ?', [name]) .orderBy('created_at', 'desc') .map(this.rowToEvent); } rowToEvent (row) { return { id: row.id, type: row.type, createdBy: row.created_by, createdAt: row.created_at, data: row.data, }; } }; module.exports = EventStore;