2016-05-26 22:34:04 -07:00
'use strict' ;
exports = module . exports = {
add : add ,
del : del ,
2016-09-21 15:34:58 -07:00
upsertByOwner : upsertByOwner ,
2016-05-26 22:34:04 -07:00
get : get ,
2016-09-25 18:59:11 -07:00
getMailboxes : getMailboxes ,
getMailbox : getMailbox ,
getGroup : getGroup ,
getGroups : getGroups ,
2016-05-27 19:20:42 -07:00
getAliases : getAliases ,
2016-09-25 18:59:11 -07:00
getAlias : getAlias ,
getAliasesOf : getAliasesOf ,
setAliasesOf : setAliasesOf ,
2016-09-23 17:35:48 -07:00
getByOwnerId : getByOwnerId ,
2016-09-22 15:55:18 -07:00
delByOwnerId : delByOwnerId ,
2016-05-26 22:34:04 -07:00
2016-09-22 15:55:18 -07:00
_clear : clear ,
TYPE _USER : 'user' ,
TYPE _APP : 'app' ,
TYPE _GROUP : 'group'
2016-05-26 22:34:04 -07:00
} ;
var assert = require ( 'assert' ) ,
database = require ( './database.js' ) ,
2016-05-27 19:20:42 -07:00
DatabaseError = require ( './databaseerror.js' ) ,
util = require ( 'util' ) ;
2016-05-26 22:34:04 -07:00
2016-09-21 14:51:13 -07:00
var MAILBOX _FIELDS = [ 'name' , 'ownerId' , 'ownerType' , 'aliasTarget' , 'creationTime' ] . join ( ',' ) ;
2016-05-26 22:34:04 -07:00
2016-09-22 15:55:18 -07:00
function add ( name , ownerId , ownerType , callback ) {
2016-05-26 22:34:04 -07:00
assert . strictEqual ( typeof name , 'string' ) ;
2016-09-22 15:55:18 -07:00
assert . strictEqual ( typeof ownerId , 'string' ) ;
assert . strictEqual ( typeof ownerType , 'string' ) ;
2016-05-26 22:34:04 -07:00
assert . strictEqual ( typeof callback , 'function' ) ;
2016-09-21 15:34:58 -07:00
database . query ( 'INSERT INTO mailboxes (name, ownerId, ownerType) VALUES (?, ?, ?)' , [ 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 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 ) {
2016-05-26 22:34:04 -07:00
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 ) ;
} ) ;
}
2016-05-27 19:20:42 -07:00
function del ( name , callback ) {
assert . strictEqual ( typeof name , 'string' ) ;
2016-05-26 22:34:04 -07:00
assert . strictEqual ( typeof callback , 'function' ) ;
2016-05-27 19:20:42 -07:00
// deletes aliases as well
database . query ( 'DELETE FROM mailboxes WHERE name=? OR aliasTarget = ?' , [ name , name ] , function ( error , result ) {
2016-05-26 22:34:04 -07:00
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
2016-05-27 17:43:25 -07:00
if ( result . affectedRows === 0 ) return callback ( new DatabaseError ( DatabaseError . NOT _FOUND ) ) ;
2016-05-26 22:34:04 -07:00
callback ( null ) ;
} ) ;
}
2016-09-22 15:55:18 -07:00
function delByOwnerId ( id , callback ) {
assert . strictEqual ( typeof id , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
// deletes aliases as well
database . query ( 'DELETE FROM mailboxes WHERE ownerId=?' , [ id ] , function ( error , result ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
if ( result . affectedRows === 0 ) return callback ( new DatabaseError ( DatabaseError . NOT _FOUND ) ) ;
callback ( null ) ;
} ) ;
}
2016-05-27 19:20:42 -07:00
function get ( name , callback ) {
assert . strictEqual ( typeof name , 'string' ) ;
2016-05-26 22:34:04 -07:00
assert . strictEqual ( typeof callback , 'function' ) ;
2016-09-25 16:45:51 -07:00
database . query ( 'SELECT ' + MAILBOX _FIELDS + ' FROM mailboxes WHERE name = ? ' , [ name ] , function ( error , results ) {
2016-05-26 22:34:04 -07:00
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 ] ) ;
} ) ;
}
2016-09-25 18:59:11 -07:00
function getMailbox ( name , callback ) {
assert . strictEqual ( typeof name , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT ' + MAILBOX _FIELDS + ' FROM mailboxes WHERE name = ? AND (ownerType = ? OR ownerType = ?)' , [ name , exports . TYPE _APP , exports . TYPE _USER ] , 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 getMailboxes ( 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 ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
callback ( null , results ) ;
} ) ;
}
function getGroup ( name , callback ) {
assert . strictEqual ( typeof name , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
// FIXME: fix the query to return members
database . query ( 'SELECT ' + MAILBOX _FIELDS + ' FROM mailboxes WHERE name = ? AND ownerType = ?' , [ name , exports . TYPE _GROUP ] , 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 getGroups ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
// FIXME: fix the query to return members
database . query ( 'SELECT ' + MAILBOX _FIELDS + ' FROM mailboxes WHERE ownerType = ?' ,
[ exports . TYPE _GROUP ] , function ( error , results ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
callback ( null , results ) ;
} ) ;
}
2016-09-23 17:35:48 -07:00
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 ) {
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 ] ) ;
} ) ;
}
2016-09-25 18:59:11 -07:00
function setAliasesOf ( name , aliases , ownerId , ownerType , callback ) {
2016-05-27 19:20:42 -07:00
assert . strictEqual ( typeof name , 'string' ) ;
assert ( util . isArray ( aliases ) ) ;
2016-09-22 15:55:18 -07:00
assert . strictEqual ( typeof ownerId , 'string' ) ;
assert . strictEqual ( typeof ownerType , 'string' ) ;
2016-05-27 19:20:42 -07:00
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 ) {
2016-09-22 15:55:18 -07:00
queries . push ( { query : 'INSERT INTO mailboxes (name, aliasTarget, ownerId, ownerType) VALUES (?, ?, ?, ?)' , args : [ alias , name , ownerId , ownerType ] } ) ;
2016-05-27 19:20:42 -07:00
} ) ;
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 ) ;
} ) ;
}
2016-09-25 18:59:11 -07:00
function getAliasesOf ( name , callback ) {
2016-05-27 19:20:42 -07:00
assert . strictEqual ( typeof name , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT name FROM mailboxes WHERE aliasTarget=? ORDER BY name' , [ name ] , function ( error , results ) {
2016-05-26 22:34:04 -07:00
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
2016-05-27 19:20:42 -07:00
results = results . map ( function ( r ) { return r . name ; } ) ;
2016-05-26 22:34:04 -07:00
callback ( null , results ) ;
} ) ;
}
2016-09-25 18:59:11 -07:00
function getAliases ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT name FROM mailboxes WHERE aliasTarget != null ORDER BY name' , function ( error , results ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
callback ( null , results ) ;
} ) ;
}
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 ) {
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 ] ) ;
} ) ;
}