diff --git a/src/eventlog.js b/src/eventlog.js index ed95077b4..40aca5714 100644 --- a/src/eventlog.js +++ b/src/eventlog.js @@ -90,14 +90,14 @@ function get(id, callback) { }); } -function getAllPaged(action, search, page, perPage, callback) { - assert(typeof action === 'string' || action === null); +function getAllPaged(actions, search, page, perPage, callback) { + assert(Array.isArray(actions)); assert(typeof search === 'string' || search === null); assert.strictEqual(typeof page, 'number'); assert.strictEqual(typeof perPage, 'number'); assert.strictEqual(typeof callback, 'function'); - eventlogdb.getAllPaged(action, search, page, perPage, function (error, events) { + eventlogdb.getAllPaged(actions, search, page, perPage, function (error, events) { if (error) return callback(new EventLogError(EventLogError.INTERNAL_ERROR, error)); callback(null, events); diff --git a/src/eventlogdb.js b/src/eventlogdb.js index 6a474b0e1..4cbffe198 100644 --- a/src/eventlogdb.js +++ b/src/eventlogdb.js @@ -40,8 +40,8 @@ function get(eventId, callback) { }); } -function getAllPaged(action, search, page, perPage, callback) { - assert(typeof action === 'string' || action === null); +function getAllPaged(actions, search, page, perPage, callback) { + assert(Array.isArray(actions)); assert(typeof search === 'string' || search === null); assert.strictEqual(typeof page, 'number'); assert.strictEqual(typeof perPage, 'number'); @@ -50,10 +50,15 @@ function getAllPaged(action, search, page, perPage, callback) { var data = []; var query = 'SELECT ' + EVENTLOGS_FIELDS + ' FROM eventlog'; - if (action || search) query += ' WHERE'; + if (actions.length || search) query += ' WHERE'; if (search) query += ' (source LIKE ' + mysql.escape('%' + search + '%') + ' OR data LIKE ' + mysql.escape('%' + search + '%') + ')'; - if (action && search) query += ' AND '; - if (action) query += ' (action LIKE ' + mysql.escape(`%${action}%`) + ') '; + + if (actions.length && search) query += ' AND ( '; + actions.forEach(function (action, i) { + query += ' (action LIKE ' + mysql.escape(`%${action}%`) + ') '; + if (i < actions.length-1) query += ' OR '; + }); + if (actions.length && search) query += ' ) '; query += ' ORDER BY creationTime DESC LIMIT ?,?'; diff --git a/src/routes/eventlog.js b/src/routes/eventlog.js index 34299b636..e4e68a134 100644 --- a/src/routes/eventlog.js +++ b/src/routes/eventlog.js @@ -15,10 +15,14 @@ function get(req, res, next) { var perPage = typeof req.query.per_page !== 'undefined'? parseInt(req.query.per_page) : 25; if (!perPage || perPage < 0) return next(new HttpError(400, 'per_page query param has to be a postive number')); + if (req.query.actions && typeof req.query.actions !== 'string') return next(new HttpError(400, 'actions must be a comma separated string')); if (req.query.action && typeof req.query.action !== 'string') return next(new HttpError(400, 'action must be a string')); if (req.query.search && typeof req.query.search !== 'string') return next(new HttpError(400, 'search must be a string')); - eventlog.getAllPaged(req.query.action || null, req.query.search || null, page, perPage, function (error, result) { + var actions = req.query.actions ? req.query.actions.split(',').map(function (s) { return s.trim(); }) : []; + if (req.query.action) actions.push(req.query.action); + + eventlog.getAllPaged(actions, req.query.search || null, page, perPage, function (error, result) { if (error) return next(new HttpError(500, error)); next(new HttpSuccess(200, { eventlogs: result })); diff --git a/src/routes/test/eventlog-test.js b/src/routes/test/eventlog-test.js index 9ac0f90c9..e9447bac0 100644 --- a/src/routes/test/eventlog-test.js +++ b/src/routes/test/eventlog-test.js @@ -77,6 +77,8 @@ function cleanup(done) { } describe('Eventlog API', function () { + this.timeout(10000); + before(setup); after(cleanup); @@ -111,7 +113,7 @@ describe('Eventlog API', function () { }); }); - it('succeeds with action', function (done) { + it('succeeds with deprecated action', function (done) { superagent.get(SERVER_URL + '/api/v1/cloudron/eventlog') .query({ access_token: token, page: 1, per_page: 10, action: 'cloudron.activate' }) .end(function (error, result) { @@ -122,6 +124,17 @@ describe('Eventlog API', function () { }); }); + it('succeeds with actions', function (done) { + superagent.get(SERVER_URL + '/api/v1/cloudron/eventlog') + .query({ access_token: token, page: 1, per_page: 10, actions: 'cloudron.activate, user.add' }) + .end(function (error, result) { + expect(result.statusCode).to.equal(200); + expect(result.body.eventlogs.length).to.equal(3); + + done(); + }); + }); + it('succeeds with search', function (done) { superagent.get(SERVER_URL + '/api/v1/cloudron/eventlog') .query({ access_token: token, page: 1, per_page: 10, search: EMAIL }) @@ -135,7 +148,7 @@ describe('Eventlog API', function () { it('succeeds with search', function (done) { superagent.get(SERVER_URL + '/api/v1/cloudron/eventlog') - .query({ access_token: token, page: 1, per_page: 10, search: EMAIL, action: 'cloudron.activate' }) + .query({ access_token: token, page: 1, per_page: 10, search: EMAIL, actions: 'cloudron.activate' }) .end(function (error, result) { expect(result.statusCode).to.equal(200); expect(result.body.eventlogs.length).to.equal(0); diff --git a/src/test/eventlog-test.js b/src/test/eventlog-test.js index aaae967a6..22906dd08 100644 --- a/src/test/eventlog-test.js +++ b/src/test/eventlog-test.js @@ -69,7 +69,7 @@ describe('Eventlog', function () { }); it('getAllPaged succeeds', function (done) { - eventlog.getAllPaged(null, null, 1, 1, function (error, results) { + eventlog.getAllPaged([], null, 1, 1, function (error, results) { expect(error).to.be(null); expect(results).to.be.an(Array); expect(results.length).to.be(1);