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 ,
2018-06-14 21:12:52 -07:00
update : update ,
2016-02-07 20:25:08 -08:00
del : del ,
count : count ,
2016-02-08 09:41:21 -08:00
getMembers : getMembers ,
addMember : addMember ,
removeMember : removeMember ,
2016-09-29 14:44:12 -07:00
setMembers : setMembers ,
2016-02-08 10:53:01 -08:00
isMember : isMember ,
2016-02-08 09:41:21 -08:00
2018-06-18 13:57:17 -07:00
getMembership : getMembership ,
setMembership : setMembership ,
2016-02-08 20:38:50 -08:00
2018-06-18 14:10:29 -07:00
getGroups : getGroups ,
2018-06-16 00:29:56 -07:00
2018-06-14 21:56:18 -07:00
_clear : clear
2016-02-07 20:25:08 -08:00
} ;
var assert = require ( 'assert' ) ,
2019-10-24 11:13:48 -07:00
BoxError = require ( './boxerror.js' ) ,
database = require ( './database.js' ) ;
2016-02-07 20:25:08 -08:00
2018-07-26 10:20:19 -07:00
var GROUPS _FIELDS = [ 'id' , 'name' ] . join ( ',' ) ;
2016-02-07 20:25:08 -08:00
function get ( groupId , callback ) {
assert . strictEqual ( typeof groupId , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2018-12-01 00:38:00 +01:00
database . query ( 'SELECT ' + GROUPS _FIELDS + ' FROM userGroups WHERE id = ? ORDER BY name' , [ groupId ] , function ( error , result ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2019-10-24 20:48:38 -07:00
if ( result . length === 0 ) return callback ( new BoxError ( BoxError . NOT _FOUND , 'Group not found' ) ) ;
2016-02-07 20:25:08 -08:00
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 ' +
2018-12-01 00:38:00 +01:00
' FROM userGroups LEFT OUTER JOIN groupMembers ON userGroups.id = groupMembers.groupId ' +
' WHERE userGroups.id = ? ' +
' GROUP BY userGroups.id' , [ groupId ] , function ( error , results ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2019-10-24 20:48:38 -07:00
if ( results . length === 0 ) return callback ( new BoxError ( BoxError . NOT _FOUND , 'Group not found' ) ) ;
2016-02-09 15:26:34 -08:00
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' ) ;
2018-12-01 00:38:00 +01:00
database . query ( 'SELECT ' + GROUPS _FIELDS + ' FROM userGroups' , function ( error , results ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2016-02-09 13:33:30 -08:00
2018-06-14 21:12:52 -07:00
callback ( null , results ) ;
2016-02-09 13:33:30 -08:00
} ) ;
}
2016-06-02 21:07:33 -07:00
function getAllWithMembers ( callback ) {
database . query ( 'SELECT ' + GROUPS _FIELDS + ',GROUP_CONCAT(groupMembers.userId) AS userIds ' +
2018-12-01 00:38:00 +01:00
' FROM userGroups LEFT OUTER JOIN groupMembers ON userGroups.id = groupMembers.groupId ' +
' GROUP BY userGroups.id' , function ( error , results ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2019-10-24 20:48:38 -07:00
if ( results . length === 0 ) return callback ( new BoxError ( BoxError . NOT _FOUND , 'Group not found' ) ) ;
2016-06-02 21:07:33 -07:00
results . forEach ( function ( result ) { result . userIds = result . userIds ? result . userIds . split ( ',' ) : [ ] ; } ) ;
callback ( null , results ) ;
} ) ;
}
2018-07-26 10:20:19 -07:00
function add ( id , name , callback ) {
2016-02-07 20:25:08 -08:00
assert . strictEqual ( typeof id , 'string' ) ;
assert . strictEqual ( typeof name , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
2018-12-01 00:38:00 +01:00
database . query ( 'INSERT INTO userGroups (id, name) VALUES (?, ?)' , [ id , name ] , function ( error , result ) {
2019-10-24 11:13:48 -07:00
if ( error && error . code === 'ER_DUP_ENTRY' ) return callback ( new BoxError ( BoxError . ALREADY _EXISTS , error ) ) ;
if ( error || result . affectedRows !== 1 ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2016-02-07 20:25:08 -08:00
callback ( null ) ;
} ) ;
}
2018-06-14 21:12:52 -07:00
function update ( id , data , callback ) {
assert . strictEqual ( typeof id , 'string' ) ;
assert ( data && typeof data === 'object' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
var args = [ ] ;
var fields = [ ] ;
for ( var k in data ) {
2018-07-26 10:20:19 -07:00
if ( k === 'name' ) {
2018-06-14 21:12:52 -07:00
assert . strictEqual ( typeof data . name , 'string' ) ;
2018-06-14 22:42:40 -07:00
fields . push ( k + ' = ?' ) ;
2018-06-14 21:12:52 -07:00
args . push ( data . name ) ;
}
}
args . push ( id ) ;
2018-12-01 00:38:00 +01:00
database . query ( 'UPDATE userGroups SET ' + fields . join ( ', ' ) + ' WHERE id = ?' , args , function ( error , result ) {
2019-10-24 11:13:48 -07:00
if ( error && error . code === 'ER_DUP_ENTRY' && error . sqlMessage . indexOf ( 'userGroups_name' ) !== - 1 ) return callback ( new BoxError ( BoxError . ALREADY _EXISTS , 'name already exists' ) ) ;
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2019-10-24 20:48:38 -07:00
if ( result . affectedRows !== 1 ) return callback ( new BoxError ( BoxError . NOT _FOUND , 'Group not found' ) ) ;
2018-06-14 21:12:52 -07:00
return callback ( null ) ;
} ) ;
}
2016-02-07 20:25:08 -08:00
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 ] } ) ;
2018-12-01 00:38:00 +01:00
queries . push ( { query : 'DELETE FROM userGroups WHERE id = ?' , args : [ id ] } ) ;
2016-02-13 11:55:30 +01:00
database . transaction ( queries , function ( error , result ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2019-10-24 20:48:38 -07:00
if ( result [ 1 ] . affectedRows !== 1 ) return callback ( new BoxError ( BoxError . NOT _FOUND , 'Group not found' ) ) ;
2016-02-07 20:25:08 -08:00
callback ( error ) ;
} ) ;
}
function count ( callback ) {
assert . strictEqual ( typeof callback , 'function' ) ;
2018-12-01 00:38:00 +01:00
database . query ( 'SELECT COUNT(*) AS total FROM userGroups' , function ( error , result ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2016-02-07 20:25:08 -08:00
return callback ( null , result [ 0 ] . total ) ;
} ) ;
}
function clear ( callback ) {
2016-02-08 09:41:21 -08:00
database . query ( 'DELETE FROM groupMembers' , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2016-02-07 20:25:08 -08:00
2018-12-01 00:38:00 +01:00
database . query ( 'DELETE FROM userGroups' , function ( error ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2016-02-08 09:41:21 -08:00
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 ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2019-10-24 20:48:38 -07:00
// if (result.length === 0) return callback(new BoxError(BoxError.NOT_FOUND, 'Group not found')); // need to differentiate group with no members and invalid groupId
2016-02-08 09:41:21 -08:00
callback ( error , result . map ( function ( r ) { return r . userId ; } ) ) ;
2016-02-07 20:25:08 -08:00
} ) ;
}
2016-09-29 14:44:12 -07:00
function setMembers ( groupId , userIds , callback ) {
assert . strictEqual ( typeof groupId , 'string' ) ;
assert ( Array . isArray ( userIds ) ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
var queries = [ ] ;
queries . push ( { query : 'DELETE FROM groupMembers WHERE groupId = ?' , args : [ groupId ] } ) ;
for ( var i = 0 ; i < userIds . length ; i ++ ) {
queries . push ( { query : 'INSERT INTO groupMembers (groupId, userId) VALUES (?, ?)' , args : [ groupId , userIds [ i ] ] } ) ;
}
database . transaction ( queries , function ( error ) {
2019-10-24 20:48:38 -07:00
if ( error && error . code === 'ER_NO_REFERENCED_ROW_2' ) return callback ( new BoxError ( BoxError . NOT _FOUND , 'Group not found' ) ) ;
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2016-09-29 14:44:12 -07:00
callback ( error ) ;
} ) ;
}
2018-06-18 13:57:17 -07:00
function getMembership ( 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 ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2019-10-24 20:48:38 -07:00
// if (result.length === 0) return callback(new BoxError(BoxError.NOT_FOUND, 'Group not found')); // need to differentiate group with no members and invalid groupId
2016-02-08 20:38:50 -08:00
callback ( error , result . map ( function ( r ) { return r . groupId ; } ) ) ;
} ) ;
}
2018-06-18 13:57:17 -07:00
function setMembership ( userId , groupIds , callback ) {
2016-02-09 15:47:02 -08:00
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 ) {
2019-10-24 11:13:48 -07:00
if ( error && error . code === 'ER_NO_REFERENCED_ROW_2' ) return callback ( new BoxError ( BoxError . NOT _FOUND , error . message ) ) ;
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2016-02-09 15:47:02 -08:00
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 ) {
2019-10-24 11:13:48 -07:00
if ( error && error . code === 'ER_DUP_ENTRY' ) return callback ( new BoxError ( BoxError . ALREADY _EXISTS , error ) ) ;
2019-10-24 20:48:38 -07:00
if ( error && error . code === 'ER_NO_REFERENCED_ROW_2' ) return callback ( new BoxError ( BoxError . NOT _FOUND , 'Group not found' ) ) ;
2019-10-24 11:13:48 -07:00
if ( error || result . affectedRows !== 1 ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2016-02-08 09:41:21 -08:00
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 ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2019-10-24 20:48:38 -07:00
if ( result . affectedRows !== 1 ) return callback ( new BoxError ( BoxError . NOT _FOUND , 'Group not found' ) ) ;
2016-02-08 09:41:21 -08:00
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 ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2016-02-08 10:53:01 -08:00
callback ( null , result . length !== 0 ) ;
} ) ;
}
2018-06-16 00:29:56 -07:00
2018-06-18 14:10:29 -07:00
function getGroups ( userId , callback ) {
2018-06-16 00:29:56 -07:00
assert . strictEqual ( typeof userId , 'string' ) ;
assert . strictEqual ( typeof callback , 'function' ) ;
database . query ( 'SELECT ' + GROUPS _FIELDS + ' ' +
2018-12-01 00:38:00 +01:00
' FROM userGroups INNER JOIN groupMembers ON userGroups.id = groupMembers.groupId AND groupMembers.userId = ?' , [ userId ] , function ( error , results ) {
2019-10-24 11:13:48 -07:00
if ( error ) return callback ( new BoxError ( BoxError . DATABASE _ERROR , error ) ) ;
2018-06-16 00:29:56 -07:00
2018-06-18 14:10:29 -07:00
callback ( null , results ) ;
2018-06-16 00:29:56 -07:00
} ) ;
}