2016-02-07 20:25:08 -08:00
'use strict' ;
exports = module . exports = {
get : get ,
2016-02-09 15:26:34 -08:00
getWithMembers : getWithMembers ,
2016-02-09 13:33:30 -08:00
getAll : getAll ,
2016-06-02 21:07:33 -07:00
getAllWithMembers : getAllWithMembers ,
2016-02-07 20:25:08 -08:00
add : add ,
del : del ,
count : count ,
2016-02-08 09:41:21 -08:00
getMembers : getMembers ,
addMember : addMember ,
removeMember : removeMember ,
2016-02-08 10:53:01 -08:00
isMember : isMember ,
2016-02-08 09:41:21 -08:00
2016-02-08 20:38:50 -08:00
getGroups : getGroups ,
2016-02-09 15:47:02 -08:00
setGroups : setGroups ,
2016-02-08 20:38:50 -08:00
2016-09-20 14:07:39 -07:00
_clear : clear ,
_addDefaultGroups : addDefaultGroups
2016-02-07 20:25:08 -08:00
} ;
var assert = require ( 'assert' ) ,
2016-09-20 15:07:11 -07:00
constants = require ( './constants.js' ) ,
2016-02-07 20:25:08 -08:00
database = require ( './database.js' ) ,
DatabaseError = require ( './databaseerror' ) ;
var GROUPS _FIELDS = [ 'id' , 'name' ] . join ( ',' ) ;
function get ( groupId , callback ) {
assert . strictEqual ( typeof groupId , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT ' + GROUPS _FIELDS + ' FROM groups WHERE id = ?' , [ groupId ] , function ( error , result ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
if ( result . length === 0 ) return callback ( new DatabaseError ( DatabaseError . NOT _FOUND ) ) ;
callback ( null , result [ 0 ] ) ;
} ) ;
}
2016-02-09 15:26:34 -08:00
function getWithMembers ( groupId , callback ) {
assert . strictEqual ( typeof groupId , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT ' + GROUPS _FIELDS + ',GROUP_CONCAT(groupMembers.userId) AS userIds ' +
' FROM groups LEFT OUTER JOIN groupMembers ON groups.id = groupMembers.groupId ' +
' WHERE groups.id = ? ' +
' GROUP BY groups.id' , [ groupId ] , function ( error , results ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
if ( results . length === 0 ) return callback ( new DatabaseError ( DatabaseError . NOT _FOUND ) ) ;
var result = results [ 0 ] ;
result . userIds = result . userIds ? result . userIds . split ( ',' ) : [ ] ;
callback ( null , result ) ;
} ) ;
}
2016-02-09 13:33:30 -08:00
function getAll ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT ' + GROUPS _FIELDS + ' FROM groups' , function ( error , result ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
callback ( null , result ) ;
} ) ;
}
2016-06-02 21:07:33 -07:00
function getAllWithMembers ( callback ) {
database . query ( 'SELECT ' + GROUPS _FIELDS + ',GROUP_CONCAT(groupMembers.userId) AS userIds ' +
' FROM groups LEFT OUTER JOIN groupMembers ON groups.id = groupMembers.groupId ' +
' GROUP BY groups.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 ) ) ;
results . forEach ( function ( result ) { result . userIds = result . userIds ? result . userIds . split ( ',' ) : [ ] ; } ) ;
callback ( null , results ) ;
} ) ;
}
2016-02-07 20:25:08 -08:00
function add ( id , name , callback ) {
assert . strictEqual ( typeof id , 'string' ) ;
assert . strictEqual ( typeof name , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
var data = [ id , name ] ;
2016-02-07 20:34:05 -08:00
database . query ( 'INSERT INTO groups (id, name) VALUES (?, ?)' ,
2016-02-07 20:25:08 -08:00
data , function ( error , result ) {
if ( error && error . code === 'ER_DUP_ENTRY' ) return callback ( new DatabaseError ( DatabaseError . ALREADY _EXISTS , error ) ) ;
if ( error || result . affectedRows !== 1 ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
callback ( null ) ;
} ) ;
}
function del ( id , callback ) {
assert . strictEqual ( typeof id , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2016-02-13 11:55:30 +01:00
// also cleanup the groupMembers table
var queries = [ ] ;
queries . push ( { query : 'DELETE FROM groupMembers WHERE groupId = ?' , args : [ id ] } ) ;
queries . push ( { query : 'DELETE FROM groups WHERE id = ?' , args : [ id ] } ) ;
database . transaction ( queries , function ( error , result ) {
2016-02-07 20:25:08 -08:00
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
2016-02-13 11:55:30 +01:00
if ( result [ 1 ] . affectedRows !== 1 ) return callback ( new DatabaseError ( DatabaseError . NOT _FOUND ) ) ;
2016-02-07 20:25:08 -08:00
callback ( error ) ;
} ) ;
}
function count ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT COUNT(*) AS total FROM groups' , function ( error , result ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
return callback ( null , result [ 0 ] . total ) ;
} ) ;
}
function clear ( callback ) {
2016-02-08 09:41:21 -08:00
database . query ( 'DELETE FROM groupMembers' , function ( error ) {
2016-02-07 20:25:08 -08:00
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
2016-02-09 12:23:48 -08:00
database . query ( 'DELETE FROM groups WHERE id != ?' , [ 'admin' ] , function ( error ) {
2016-02-08 09:41:21 -08:00
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
callback ( error ) ;
} ) ;
} ) ;
}
function getMembers ( groupId , callback ) {
2016-02-09 15:47:02 -08:00
assert . strictEqual ( typeof groupId , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2016-02-08 09:41:21 -08:00
database . query ( 'SELECT userId FROM groupMembers WHERE groupId=?' , [ groupId ] , function ( error , result ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
// if (result.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); // need to differentiate group with no members and invalid groupId
callback ( error , result . map ( function ( r ) { return r . userId ; } ) ) ;
2016-02-07 20:25:08 -08:00
} ) ;
}
2016-02-08 20:38:50 -08:00
function getGroups ( userId , callback ) {
2016-02-09 15:47:02 -08:00
assert . strictEqual ( typeof userId , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT groupId FROM groupMembers WHERE userId=? ORDER BY groupId' , [ userId ] , function ( error , result ) {
2016-02-08 20:38:50 -08:00
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
// if (result.length === 0) return callback(new DatabaseError(DatabaseError.NOT_FOUND)); // need to differentiate group with no members and invalid groupId
callback ( error , result . map ( function ( r ) { return r . groupId ; } ) ) ;
} ) ;
}
2016-02-09 15:47:02 -08:00
function setGroups ( userId , groupIds , callback ) {
assert . strictEqual ( typeof userId , 'string' ) ;
assert ( Array . isArray ( groupIds ) ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
var queries = [ ] ;
queries . push ( { query : 'DELETE from groupMembers WHERE userId = ?' , args : [ userId ] } ) ;
groupIds . forEach ( function ( gid ) {
queries . push ( { query : 'INSERT INTO groupMembers (groupId, userId) VALUES (? , ?)' , args : [ gid , userId ] } ) ;
} ) ;
database . transaction ( queries , function ( error ) {
if ( error && error . code === 'ER_NO_REFERENCED_ROW_2' ) return callback ( new DatabaseError ( DatabaseError . NOT _FOUND , error . message ) ) ;
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
callback ( null ) ;
} ) ;
}
2016-02-08 09:41:21 -08:00
function addMember ( groupId , userId , callback ) {
assert . strictEqual ( typeof groupId , 'string' ) ;
assert . strictEqual ( typeof userId , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'INSERT INTO groupMembers (groupId, userId) VALUES (?, ?)' , [ groupId , userId ] , function ( error , result ) {
if ( error && error . code === 'ER_DUP_ENTRY' ) return callback ( new DatabaseError ( DatabaseError . ALREADY _EXISTS , error ) ) ;
if ( error && error . code === 'ER_NO_REFERENCED_ROW_2' ) return callback ( new DatabaseError ( DatabaseError . NOT _FOUND ) ) ;
if ( error || result . affectedRows !== 1 ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
callback ( null ) ;
} ) ;
}
function removeMember ( groupId , userId , callback ) {
assert . strictEqual ( typeof groupId , 'string' ) ;
assert . strictEqual ( typeof userId , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'DELETE FROM groupMembers WHERE groupId = ? AND userId = ?' , [ groupId , userId ] , function ( error , result ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
if ( result . affectedRows !== 1 ) return callback ( new DatabaseError ( DatabaseError . NOT _FOUND ) ) ;
callback ( null ) ;
} ) ;
}
2016-02-08 10:53:01 -08:00
function isMember ( groupId , userId , callback ) {
assert . strictEqual ( typeof groupId , 'string' ) ;
assert . strictEqual ( typeof userId , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT 1 FROM groupMembers WHERE groupId=? AND userId=?' , [ groupId , userId ] , function ( error , result ) {
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
callback ( null , result . length !== 0 ) ;
} ) ;
}
2016-09-20 14:07:39 -07:00
function addDefaultGroups ( callback ) {
2016-09-20 15:07:11 -07:00
add ( constants . ADMIN _GROUP _ID , 'admin' , callback ) ;
2016-09-20 14:07:39 -07:00
}