2016-02-07 20:25:08 -08:00
'use strict' ;
exports = module . exports = {
get : get ,
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-07 20:25:08 -08:00
_clear : clear
} ;
var assert = require ( 'assert' ) ,
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 ] ) ;
} ) ;
}
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' ) ;
database . query ( 'DELETE FROM groups WHERE id = ?' , [ id ] , function ( error , result ) {
2016-02-08 09:41:21 -08:00
if ( error && error . code === 'ER_ROW_IS_REFERENCED_2' ) return callback ( new DatabaseError ( DatabaseError . IN _USE ) ) ;
2016-02-07 20:25:08 -08:00
if ( error ) return callback ( new DatabaseError ( DatabaseError . INTERNAL _ERROR , error ) ) ;
if ( result . affectedRows !== 1 ) return callback ( new DatabaseError ( DatabaseError . NOT _FOUND ) ) ;
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 ) {
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 ) {
database . query ( 'SELECT userId FROM groupMembers WHERE userId=?' , [ userId ] , 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 . groupId ; } ) ) ;
} ) ;
}
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 ) ;
} ) ;
}