diff --git a/src/mailboxdb.js b/src/mailboxdb.js index 397c413d9..359642092 100644 --- a/src/mailboxdb.js +++ b/src/mailboxdb.js @@ -3,16 +3,18 @@ exports = module.exports = { add: add, del: del, - upsertByOwner: upsertByOwner, - get: get, - getMailboxes: getMailboxes, + + listAliases: listAliases, + listMailboxes: listMailboxes, + listGroups: listGroups, + getMailbox: getMailbox, getGroup: getGroup, - getGroups: getGroups, - getAliases: getAliases, getAlias: getAlias, - getAliasesOf: getAliasesOf, - setAliasesOf: setAliasesOf, + + getAliasesByName: getAliasesByName, + setAliasesByName: setAliasesByName, + getByOwnerId: getByOwnerId, delByOwnerId: delByOwnerId, @@ -44,20 +46,6 @@ function add(name, ownerId, ownerType, callback) { }); } -function upsertByOwner(ownerId, ownerType, name, callback) { - assert.strictEqual(typeof ownerId, 'string'); - assert.strictEqual(typeof ownerType, 'string'); - assert.strictEqual(typeof name, 'string'); - assert.strictEqual(typeof callback, 'function'); - - database.query('INSERT INTO mailboxes (name, ownerId, ownerType) VALUES (?, ?, ?) ON DUPLICATE KEY UPDATE name=?', [ name, ownerId, ownerType, 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'); @@ -85,26 +73,13 @@ function delByOwnerId(id, callback) { assert.strictEqual(typeof callback, 'function'); // deletes aliases as well - database.query('DELETE FROM mailboxes WHERE ownerId=?', [ id ], function (error, result) { + database.query('DELETE FROM mailboxes WHERE ownerId=?', [ id ], function (error) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); - if (result.affectedRows === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); callback(null); }); } -function get(name, callback) { - assert.strictEqual(typeof name, 'string'); - assert.strictEqual(typeof callback, 'function'); - - database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE name = ? ', [ name ], 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 getMailbox(name, callback) { assert.strictEqual(typeof name, 'string'); assert.strictEqual(typeof callback, 'function'); @@ -117,10 +92,10 @@ function getMailbox(name, callback) { }); } -function getMailboxes(callback) { +function listMailboxes(callback) { assert.strictEqual(typeof callback, 'function'); - database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE ownerType = ? OR ownerType = ?', [ exports.TYPE_APP, exports.TYPE_USER ], function (error, results) { + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE ownerType = ? OR ownerType = ? ORDER BY name', [ exports.TYPE_APP, exports.TYPE_USER ], function (error, results) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); callback(null, results); @@ -140,7 +115,7 @@ function getGroup(name, callback) { }); } -function getGroups(callback) { +function listGroups(callback) { assert.strictEqual(typeof callback, 'function'); // FIXME: fix the query to return members @@ -156,37 +131,40 @@ function getByOwnerId(ownerId, callback) { assert.strictEqual(typeof ownerId, 'string'); assert.strictEqual(typeof callback, 'function'); - database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE ownerId = ? ', [ ownerId ], function (error, results) { + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE ownerId = ? ORDER BY name', [ ownerId ], 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]); + callback(null, results); }); } -function setAliasesOf(name, aliases, ownerId, ownerType, callback) { +function setAliasesByName(name, aliases, callback) { assert.strictEqual(typeof name, 'string'); assert(util.isArray(aliases)); - assert.strictEqual(typeof ownerId, 'string'); - assert.strictEqual(typeof ownerType, 'string'); assert.strictEqual(typeof callback, 'function'); - // also cleanup the groupMembers table - var queries = []; - queries.push({ query: 'DELETE FROM mailboxes WHERE aliasTarget = ?', args: [ name ] }); - aliases.forEach(function (alias) { - queries.push({ query: 'INSERT INTO mailboxes (name, aliasTarget, ownerId, ownerType) VALUES (?, ?, ?, ?)', args: [ alias, name, ownerId, ownerType ] }); - }); - - database.transaction(queries, function (error) { - if (error && error.code === 'ER_DUP_ENTRY') return callback(new DatabaseError(DatabaseError.ALREADY_EXISTS, error.message)); + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE name = ? ', [ name ], 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); + var queries = []; + queries.push({ query: 'DELETE FROM mailboxes WHERE aliasTarget = ?', args: [ name ] }); + aliases.forEach(function (alias) { + queries.push({ query: 'INSERT INTO mailboxes (name, aliasTarget, ownerId, ownerType) VALUES (?, ?, ?, ?)', + args: [ alias, name, results[0].ownerId, results[0].ownerType ] }); + }); + + database.transaction(queries, function (error) { + if (error && error.code === 'ER_DUP_ENTRY') return callback(new DatabaseError(DatabaseError.ALREADY_EXISTS, error.message)); + if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); + + callback(null); + }); }); } -function getAliasesOf(name, callback) { +function getAliasesByName(name, callback) { assert.strictEqual(typeof name, 'string'); assert.strictEqual(typeof callback, 'function'); @@ -198,10 +176,10 @@ function getAliasesOf(name, callback) { }); } -function getAliases(callback) { +function listAliases(callback) { assert.strictEqual(typeof callback, 'function'); - database.query('SELECT name FROM mailboxes WHERE aliasTarget != null ORDER BY name', function (error, results) { + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE aliasTarget IS NOT NULL ORDER BY name', function (error, results) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); callback(null, results); @@ -212,7 +190,7 @@ function getAlias(name, callback) { assert.strictEqual(typeof name, 'string'); assert.strictEqual(typeof callback, 'function'); - database.query('SELECT name FROM mailboxes WHERE name = ? AND aliasTarget != null', [ name ], function (error, results) { + database.query('SELECT ' + MAILBOX_FIELDS + ' FROM mailboxes WHERE name = ? AND aliasTarget IS NOT null', [ name ], function (error, results) { if (error) return callback(new DatabaseError(DatabaseError.INTERNAL_ERROR, error)); if (results.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); diff --git a/src/test/database-test.js b/src/test/database-test.js index 1cdb72f73..4559a0add 100644 --- a/src/test/database-test.js +++ b/src/test/database-test.js @@ -1180,39 +1180,59 @@ describe('database', function () { }); describe('mailboxes', function () { - it('add succeeds', function (done) { - mailboxdb.add('support', 'osticket', mailboxdb.TYPE_APP, function (error, mailbox) { + it('add user mailbox succeeds', function (done) { + mailboxdb.add('girish', 'uid-0', mailboxdb.TYPE_USER, function (error, mailbox) { expect(error).to.be(null); done(); }); }); it('cannot add dup entry', function (done) { - mailboxdb.add('support', 'support', mailboxdb.TYPE_USER, function (error, mailbox) { + mailboxdb.add('girish', 'uid-1', mailboxdb.TYPE_APP, function (error, mailbox) { expect(error.reason).to.be(DatabaseError.ALREADY_EXISTS); done(); }); }); + it('add app mailbox succeeds', function (done) { + mailboxdb.add('support', 'osticket', mailboxdb.TYPE_APP, function (error, mailbox) { + expect(error).to.be(null); + done(); + }); + }); + it('get succeeds', function (done) { - mailboxdb.get('support', function (error, mailbox) { + mailboxdb.getMailbox('support', function (error, mailbox) { expect(error).to.be(null); expect(mailbox.name).to.be('support'); + expect(mailbox.ownerId).to.be('osticket'); expect(mailbox.creationTime).to.be.a(Date); done(); }); }); - it('can set alias', function (done) { - mailboxdb.setAliasesOf('support', [ 'support2', 'help' ], 'support', 'user', function (error) { + it('list mailboxes succeeds', function (done) { + mailboxdb.listMailboxes(function (error, mailboxes) { + expect(error).to.be(null); + expect(mailboxes.length).to.be(2); + expect(mailboxes[0].name).to.be('girish'); + expect(mailboxes[0].ownerType).to.be(mailboxdb.TYPE_USER); + expect(mailboxes[1].name).to.be('support'); + + done(); + }); + }); + + it('can set alias', function (done) { + mailboxdb.setAliasesByName('support', [ 'support2', 'help' ], function (error) { expect(error).to.be(null); done(); }); }); - it('can get alias', function (done) { - mailboxdb.getAliasesOf('support', function (error, results) { + it('can get aliases of name', function (done) { + mailboxdb.getAliasesByName('support', function (error, results) { expect(error).to.be(null); expect(results.length).to.be(2); expect(results[0]).to.be('help'); @@ -1221,11 +1241,42 @@ describe('database', function () { }); }); + it('can get alias', function (done) { + mailboxdb.getAlias('support2', function (error, result) { + expect(error).to.be(null); + expect(result.name).to.be('support2'); + expect(result.aliasTarget).to.be('support'); + done(); + }); + }); + + it('can list aliases', function (done) { + mailboxdb.listAliases(function (error, results) { + expect(error).to.be(null); + expect(results.length).to.be(2); + expect(results[0].name).to.be('help'); + expect(results[0].aliasTarget).to.be('support'); + expect(results[1].name).to.be('support2'); + done(); + }); + }); + + it('can get by owner id', function (done) { + mailboxdb.getByOwnerId('osticket', function (error, results) { + expect(error).to.be(null); + expect(results.length).to.be(3); + expect(results[0].name).to.be('help'); + expect(results[1].name).to.be('support'); + expect(results[2].name).to.be('support2'); + done(); + }); + }); + it('unset aliases', function (done) { - mailboxdb.setAliasesOf('support', [ ], 'support', 'user', function (error) { + mailboxdb.setAliasesByName('support', [ ], function (error) { expect(error).to.be(null); - mailboxdb.getAliases('support', function (error, results) { + mailboxdb.getAliasesByName('support', function (error, results) { expect(error).to.be(null); expect(results.length).to.be(0); done(); @@ -1234,10 +1285,22 @@ describe('database', function () { }); it('del succeeds', function (done) { - mailboxdb.del('support', function (error) { + mailboxdb.del('girish', function (error) { expect(error).to.be(null); done(); }); }); + + it('del by ownerId succeeds', function (done) { + mailboxdb.delByOwnerId('osticket', function (error) { + expect(error).to.be(null); + + mailboxdb.getByOwnerId('osticket', function (error, results) { + expect(error).to.be.ok(); + expect(error.reason).to.be(DatabaseError.NOT_FOUND); + done(); + }); + }); + }); }); }); diff --git a/src/user.js b/src/user.js index fe5862dde..fe6e472ef 100644 --- a/src/user.js +++ b/src/user.js @@ -372,7 +372,8 @@ function updateUser(userId, data, auditSource, callback) { if (error) return callback(error); } - asyncIf(!!data.username, mailboxdb.upsertByOwner.bind(null, userId /* owner */, mailboxdb.TYPE_USER, data.username), function (error) { + // TODO: maybe delete the old username mailbox + asyncIf(!!data.username, mailboxdb.add.bind(null, data.username, userId /* owner */, mailboxdb.TYPE_USER), function (error) { if (error && error.reason === DatabaseError.ALREADY_EXISTS) return callback(new UserError(UserError.ALREADY_EXISTS, error.message)); if (error) return callback(new UserError(UserError.INTERNAL_ERROR, error));