diff --git a/src/database.js b/src/database.js index 820d60b19..2e35a3438 100644 --- a/src/database.js +++ b/src/database.js @@ -121,7 +121,8 @@ function clear(callback) { require('./tokendb.js')._clear, require('./groupdb.js')._clear, require('./userdb.js')._clear, - require('./settingsdb.js')._clear + require('./settingsdb.js')._clear, + require('./eventlogdb.js')._clear ], callback); } diff --git a/src/eventlogdb.js b/src/eventlogdb.js new file mode 100644 index 000000000..109162f15 --- /dev/null +++ b/src/eventlogdb.js @@ -0,0 +1,83 @@ +'use strict'; + +exports = module.exports = { + get: get, + getAllPaged: getAllPaged, + add: add, + count: count, + + _clear: clear +}; + +var assert = require('assert'), + database = require('./database.js'), + DatabaseError = require('./databaseerror'), + safe = require('safetydance'); + +var EVENTLOGS_FIELDS = [ 'id', 'action', 'dataJson', 'creationTime' ].join(','); + +function postProcess(eventLog) { + eventLog.data = safe.JSON.parse(eventLog.dataJson); + + delete eventLog.dataJson; + + return eventLog; +} + +function get(eventId, callback) { + assert.strictEqual(typeof eventId, 'string'); + assert.strictEqual(typeof callback, 'function'); + + database.query('SELECT ' + EVENTLOGS_FIELDS + ' FROM eventlog WHERE id = ?', [ eventId ], function (error, result) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + if (result.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); + + callback(null, postProcess(result[0])); + }); +} + +function getAllPaged(page, perPage, callback) { + assert.strictEqual(typeof page, 'number'); + assert.strictEqual(typeof perPage, 'number'); + assert.strictEqual(typeof callback, 'function'); + + database.query('SELECT ' + EVENTLOGS_FIELDS + 'FROM eventlog ORDER BY creationTime DESC LIMIT ?,?', [ (page-1)*perPage, perPage ], function (error, results) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + results.forEach(postProcess); + + callback(null, results); + }); +} + +function add(id, action, data, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof action, 'string'); + assert.strictEqual(typeof data, 'object'); + assert.strictEqual(typeof callback, 'function'); + + database.query('INSERT INTO eventlog (id, action, dataJson) VALUES (?, ?, ?)', [ id, action, JSON.stringify(data) ], function (error, result) { + if (error && error.code === 'ER_DUP_ENTRY') return callback(new DatabaseError(DatabaseError.ALREADY_EXISTS, error)); + if (error || result.affectedRows !== 1) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(null); + }); +} + +function count(callback) { + assert.strictEqual(typeof callback, 'function'); + + database.query('SELECT COUNT(*) AS total FROM eventlog', function (error, result) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + return callback(null, result[0].total); + }); +} + +function clear(callback) { + database.query('DELETE FROM eventlog', function (error) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(error); + }); +}