diff --git a/src/database.js b/src/database.js index 4069605f1..d4aa3eeb8 100644 --- a/src/database.js +++ b/src/database.js @@ -120,7 +120,8 @@ function clear(callback) { require('./groupdb.js')._clear, require('./userdb.js')._clear, require('./settingsdb.js')._clear, - require('./eventlogdb.js')._clear + require('./eventlogdb.js')._clear, + require('./mailboxdb.js')._clear ], callback); } diff --git a/src/mailboxdb.js b/src/mailboxdb.js new file mode 100644 index 000000000..6ee5a780e --- /dev/null +++ b/src/mailboxdb.js @@ -0,0 +1,72 @@ +'use strict'; + +exports = module.exports = { + add: add, + del: del, + get: get, + getAll: getAll, + + _clear: clear +}; + +var assert = require('assert'), + database = require('./database.js'), + DatabaseError = require('./databaseerror.js'); + +var MAILBOX_FIELDS = [ 'id', 'name', 'aliasTarget', 'creationTime' ].join(','); + +function add(id, name, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof name, 'string'); + assert.strictEqual(typeof callback, 'function'); + + database.query('INSERT INTO mailboxes (id, name) VALUES (?, ?)', [ id, name ], function (error) { + if (error && error.code === 'ER_DUP_ENTRY') return callback(new DatabaseError(DatabaseError.ALREADY_EXISTS)); + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(null); + }); +} + +function clear(callback) { + assert.strictEqual(typeof callback, 'function'); + + database.query('TRUNCATE TABLE mailboxes', [], function (error) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + callback(null); + }); +} + +function del(id, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof callback, 'function'); + + database.query('DELETE FROM mailboxes WHERE id=?', [ id ], function (error) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(null); + }); +} + +function get(id, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof callback, 'function'); + + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE id=?', [ id ], function (error, results) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + if (results.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); + + callback(null, results[0]); + }); +} + + +function getAll(callback) { + assert.strictEqual(typeof callback, 'function'); + + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes', function (error, results) { + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(null, results); + }); +} diff --git a/src/mailboxes.js b/src/mailboxes.js new file mode 100644 index 000000000..9be831c5c --- /dev/null +++ b/src/mailboxes.js @@ -0,0 +1,92 @@ +'use strict'; + +exports = module.exports = { + add: add, + del: del, + get: get, + getAll: getAll +}; + +var assert = require('assert'), + DatabaseError = require('./databaseerror.js'), + mailboxdb = require('./mailboxdb.js'), + util = require('util'); + +function MailboxError(reason, errorOrMessage) { + assert.strictEqual(typeof reason, 'string'); + assert(errorOrMessage instanceof Error || typeof errorOrMessage === 'string' || typeof errorOrMessage === 'undefined'); + + Error.call(this); + Error.captureStackTrace(this, this.constructor); + + this.name = this.constructor.name; + this.reason = reason; + if (typeof errorOrMessage === 'undefined') { + this.message = reason; + } else if (typeof errorOrMessage === 'string') { + this.message = errorOrMessage; + } else { + this.message = 'Internal error'; + this.nestedError = errorOrMessage; + } +} +util.inherits(MailboxError, Error); +MailboxError.ALREADY_EXISTS = 'already exists'; +MailboxError.BAD_NAME = 'bad name'; +MailboxError.INTERNAL_ERROR = 'internal error'; + +function validateName(name) { + return null; +} + +function add(name, callback) { + assert.strictEqual(typeof name, 'string'); + assert.strictEqual(typeof callback, 'function'); + + var error = validateName(name); + if (error) return callback(error); + + mailboxdb.add(name /* id */, name, function (error) { + if (error && error.reason === MailboxError.ALREADY_EXISTS) return callback(new MailboxError(MailboxError.ALREADY_EXISTS)); + if (error) return callback(new MailboxError(MailboxError.INTERNAL_ERROR, error)); + + var mailbox = { + id: name, + name: name + }; + + callback(null, mailbox); + }); +} + +function del(id, callback) { + assert.strictEqual(typeof name, 'string'); + assert.strictEqual(typeof callback, 'function'); + + mailboxdb.del(name, function (error) { + if (error) return callback(new MailboxError(MailboxError.INTERNAL_ERROR, error)); + + callback(); + }); +} + +function get(id, callback) { + assert.strictEqual(typeof id, 'string'); + assert.strictEqual(typeof callback, 'function'); + + mailboxdb.get(id, function (error, mailbox) { + if (error) return callback(new MailboxError(MailboxError.INTERNAL_ERROR, error)); + + callback(null, mailbox); + }); +} + +function getAll(callback) { + assert.strictEqual(typeof callback, 'function'); + + mailboxdb.getAll(function (error, results) { + if (error) return callback(new MailboxError(MailboxError.INTERNAL_ERROR, error)); + + callback(null, results); + }); +} diff --git a/src/test/database-test.js b/src/test/database-test.js index bcb671f81..1508160d3 100644 --- a/src/test/database-test.js +++ b/src/test/database-test.js @@ -16,6 +16,7 @@ var appdb = require('../appdb.js'), eventlogdb = require('../eventlogdb.js'), expect = require('expect.js'), hat = require('hat'), + mailboxdb = require('../mailboxdb.js'), settingsdb = require('../settingsdb.js'), tokendb = require('../tokendb.js'), userdb = require('../userdb.js'), @@ -1123,5 +1124,50 @@ describe('database', function () { }); }); }); + + describe('mailboxes', function () { + it('add succeeds', function (done) { + mailboxdb.add('supportid', 'support', function (error, mailbox) { + expect(error).to.be(null); + done(); + }); + }); + + it('cannot add dup entry', function (done) { + mailboxdb.add('supportid2', 'support', function (error, mailbox) { + expect(error.reason).to.be(DatabaseError.ALREADY_EXISTS); + done(); + }); + }); + + it('get succeeds', function (done) { + mailboxdb.get('supportid', function (error, mailbox) { + expect(error).to.be(null); + expect(mailbox.id).to.be('supportid'); + expect(mailbox.name).to.be('support'); + expect(mailbox.creationTime).to.be.a(Date); + + done(); + }); + }); + + it('getAll succeeds', function (done) { + mailboxdb.getAll(function (error, results) { + expect(error).to.be(null); + expect(results).to.be.an(Array); + expect(results.length).to.be(1); + expect(results[0].id).to.be('supportid'); + + done(); + }); + }); + + it('del succeeds', function (done) { + mailboxdb.del('supportid', function (error) { + expect(error).to.be(null); + done(); + }); + }); + }); });