diff --git a/src/eventlogdb.js b/src/eventlogdb.js index 8a025c8dd..49d12134f 100644 --- a/src/eventlogdb.js +++ b/src/eventlogdb.js @@ -12,6 +12,7 @@ exports = module.exports = { }; var assert = require('assert'), + async = require('async'), database = require('./database.js'), DatabaseError = require('./databaseerror'), mysql = require('mysql'), @@ -125,11 +126,19 @@ function delByCreationTime(creationTime, callback) { assert(util.isDate(creationTime)); assert.strictEqual(typeof callback, 'function'); - var query = 'DELETE FROM eventlog WHERE creationTime < ?'; - - database.query(query, [ creationTime ], function (error) { + // since notifications reference eventlog items, we have to clean them up as well + database.query('SELECT * FROM eventlog WHERE creationTime < ?', [ creationTime ], function (error, result) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); - callback(error); + async.eachSeries(result, function (item, callback) { + database.query('DELETE FROM notifications WHERE eventId=?', [ item.id ], function (error) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + database.query('DELETE FROM eventlog WHERE id=?', [ item.id ], function (error) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + callback(); + }); + }); + }, callback); }); } diff --git a/src/test/database-test.js b/src/test/database-test.js index f087360e8..d2f9fa507 100644 --- a/src/test/database-test.js +++ b/src/test/database-test.js @@ -118,8 +118,30 @@ describe('database', function () { }); describe('notifications', function () { + var EVENT_0 = { + id: 'event_0', + action: 'action', + source: {}, + data: {} + }; + + var EVENT_1 = { + id: 'event_1', + action: 'action', + source: {}, + data: {} + }; + + var EVENT_2 = { + id: 'event_2', + action: 'action', + source: {}, + data: {} + }; + var NOTIFICATION_0 = { userId: USER_0.id, + eventId: EVENT_0.id, title: 'first one', message: 'some message there', action: 'usually a url' @@ -127,6 +149,7 @@ describe('database', function () { var NOTIFICATION_1 = { userId: USER_0.id, + eventId: EVENT_1.id, title: 'second one', message: 'some message there', action: 'usually a url' @@ -134,6 +157,7 @@ describe('database', function () { var NOTIFICATION_2 = { userId: USER_1.id, + eventId: EVENT_2.id, title: 'third one', message: 'some message there', action: 'usually a url' @@ -143,6 +167,9 @@ describe('database', function () { async.series([ userdb.add.bind(null, USER_0.id, USER_0), userdb.add.bind(null, USER_1.id, USER_1), + eventlogdb.add.bind(null, EVENT_0.id, EVENT_0.action, EVENT_0.source, EVENT_0.data), + eventlogdb.add.bind(null, EVENT_1.id, EVENT_1.action, EVENT_1.source, EVENT_1.data), + eventlogdb.add.bind(null, EVENT_2.id, EVENT_2.action, EVENT_2.source, EVENT_2.data), ], done); }); @@ -1740,6 +1767,39 @@ describe('database', function () { }); }); }); + + it('delByCreationTime succeeds with notifications referencing it', function (done) { + async.each([ 'persistent.event', 'transient.event', 'anothertransient.event', 'anotherpersistent.event' ], function (e, callback) { + var eventId = 'someid' + Math.random(); + + eventlogdb.add(eventId, e, { ip: '1.2.3.4' }, { appId: 'thatapp' }, function (error) { + expect(error).to.be(null); + + var notification = { + userId: USER_0.id, + eventId: eventId, + title: 'first one', + message: 'some message there', + action: 'usually a url' + }; + + notificationdb.add(notification, callback); + }); + }, function (error) { + expect(error).to.be(null); + + eventlogdb.delByCreationTime(new Date(), function (error) { + expect(error).to.be(null); + + eventlogdb.getAllPaged([], null, 1, 100, function (error, results) { + expect(error).to.be(null); + expect(results.length).to.be(0); + + done(); + }); + }); + }); + }); }); describe('groups', function () {