2014-10-20 19:52:35 +02:00
( function ( ) {
'use strict' ;
2014-11-03 18:19:35 +01:00
/ * *
* @ name User
* @ constructor
* @ param { object } [ userData ] - some default values for the user
* /
function User ( userData ) {
2015-04-20 23:28:43 +02:00
if ( userData ) {
2015-05-06 23:45:28 +02:00
this . init ( userData ) ;
2015-04-20 23:28:43 +02:00
}
2014-11-03 18:19:35 +01:00
}
2014-10-20 19:52:35 +02:00
2014-11-03 18:19:35 +01:00
/ * *
* @ memberof User
* @ desc The factory we ' ll use to register with Angular .
* @ return the User constructor
* /
2015-05-19 20:50:26 +02:00
User . factory = [ '$q' , '$log' , 'sgSettings' , 'Resource' , 'Gravatar' , function ( $q , $log , Settings , Resource , Gravatar ) {
2014-10-20 19:52:35 +02:00
angular . extend ( User , {
2014-11-03 18:19:35 +01:00
$q : $q ,
2015-05-19 20:50:26 +02:00
$log : $log ,
2015-05-06 23:45:28 +02:00
$$resource : new Resource ( Settings . activeUser . folderURL , Settings . activeUser ) ,
$gravatar : Gravatar
2014-10-20 19:52:35 +02:00
} ) ;
2014-11-03 18:19:35 +01:00
return User ;
2014-10-20 19:52:35 +02:00
} ] ;
2014-11-03 18:19:35 +01:00
/ * *
* @ module SOGo . Common
* @ desc Factory registration of User in Angular module .
* /
2015-05-06 04:06:13 +02:00
angular . module ( 'SOGo.Common' ) . factory ( 'User' , User . factory ) ;
2014-10-20 19:52:35 +02:00
2014-11-03 18:19:35 +01:00
/ * *
* @ memberof User
* @ desc Search for users that match a string .
2014-12-12 19:39:02 +01:00
* @ param { string } search - a string used to performed the search
2014-11-03 18:19:35 +01:00
* @ return a promise of an array of matching User objects
2014-10-20 19:52:35 +02:00
* /
2015-05-27 20:59:49 +02:00
User . $filter = function ( search , excludedUsers ) {
2015-05-07 21:15:20 +02:00
var deferred = User . $q . defer ( ) ,
param = { search : search } ;
if ( ! search ) {
2015-05-19 20:50:26 +02:00
// No query specified
2015-05-07 21:15:20 +02:00
User . $users = [ ] ;
deferred . resolve ( User . $users ) ;
return deferred . promise ;
}
if ( angular . isUndefined ( User . $users ) ) {
2015-05-19 20:50:26 +02:00
// First session query
2015-05-07 21:15:20 +02:00
User . $users = [ ] ;
}
2015-05-19 20:50:26 +02:00
else if ( User . $query == search ) {
// Query hasn't changed
deferred . resolve ( User . $users ) ;
return deferred . promise ;
}
User . $query = search ;
2015-05-07 21:15:20 +02:00
User . $$resource . fetch ( null , 'usersSearch' , param ) . then ( function ( response ) {
2015-05-27 20:59:49 +02:00
var results , index , user ;
if ( excludedUsers ) {
// Remove excluded users from response
results = _ . filter ( response . users , function ( data ) {
return ! _ . find ( excludedUsers , function ( user ) {
return user . uid == data . uid ;
} ) ;
} ) ;
}
else {
results = response . users ;
}
2015-05-19 20:50:26 +02:00
// Add new users matching the search query
2015-05-27 20:59:49 +02:00
angular . forEach ( results , function ( data ) {
2015-05-19 20:50:26 +02:00
if ( ! _ . find ( User . $users , function ( user ) {
return user . uid == data . uid ;
} ) ) {
var user = new User ( data ) ,
index = _ . sortedIndex ( User . $users , user , '$$shortFormat' ) ;
User . $users . splice ( index , 0 , user ) ;
}
2014-11-03 18:19:35 +01:00
} ) ;
2015-05-19 20:50:26 +02:00
// Remove users that no longer match the search query
for ( index = User . $users . length - 1 ; index >= 0 ; index -- ) {
user = User . $users [ index ] ;
2015-05-27 20:59:49 +02:00
if ( ! _ . find ( results , function ( data ) {
2015-05-19 20:50:26 +02:00
return user . uid == data . uid ;
} ) ) {
User . $users . splice ( index , 1 ) ;
}
}
deferred . resolve ( User . $users ) ;
2015-05-07 21:15:20 +02:00
} , deferred . reject ) ;
return deferred . promise ;
2014-11-03 18:19:35 +01:00
} ;
2015-05-06 23:45:28 +02:00
/ * *
* @ function init
* @ memberof User . prototype
* @ desc Extend instance with required attributes and new data .
* @ param { object } data - attributes of user
* /
User . prototype . init = function ( data ) {
angular . extend ( this , data ) ;
2015-05-07 16:04:50 +02:00
if ( ! this . $$shortFormat )
this . $$shortFormat = this . $shortFormat ( ) ;
if ( ! this . $$image )
this . $$image = this . image || User . $gravatar ( this . c _email ) ;
2015-05-06 23:45:28 +02:00
} ;
2014-11-03 18:19:35 +01:00
/ * *
* @ function $shortFormat
* @ memberof User . prototype
* @ return the fullname along with the email address
* /
2014-11-25 22:09:55 +01:00
User . prototype . $shortFormat = function ( options ) {
2014-11-03 18:19:35 +01:00
var fullname = this . cn || this . c _email ;
2014-12-12 19:39:02 +01:00
var email = this . c _email ;
2014-11-25 22:09:55 +01:00
var no _email = options && options . email === false ;
2014-12-12 19:39:02 +01:00
if ( ! no _email && email && fullname != email ) {
2015-04-20 23:28:43 +02:00
fullname += ' <' + email + '>' ;
2014-11-03 18:19:35 +01:00
}
return fullname ;
} ;
/ * *
* @ function $acl
* @ memberof User . prototype
* @ desc Fetch the user rights associated to a specific folder and populate the 'rights' attribute .
2014-12-12 19:39:02 +01:00
* @ param { string } the folder ID
2014-11-03 18:19:35 +01:00
* @ return a promise
* /
User . prototype . $acl = function ( folderId ) {
var _this = this ,
deferred = User . $q . defer ( ) ,
param = { uid : this . uid } ;
if ( this . $shadowRights ) {
deferred . resolve ( this . rights ) ;
}
else {
User . $$resource . fetch ( folderId , 'userRights' , param ) . then ( function ( data ) {
_this . rights = data ;
// Convert numbers (0|1) to boolean values
2015-04-24 22:07:48 +02:00
//angular.forEach(_.keys(_this.rights), function(key) {
// _this.rights[key] = _this.rights[key] ? true : false;
//});
2014-11-03 18:19:35 +01:00
// console.debug('rights ' + _this.uid + ' => ' + JSON.stringify(data, undefined, 2));
// Keep a copy of the server's version
_this . $shadowRights = angular . copy ( data ) ;
deferred . resolve ( data ) ;
return data ;
} ) ;
}
2014-11-11 17:14:55 +01:00
return deferred . promise ;
2014-11-03 18:19:35 +01:00
} ;
/ * *
* @ function $isAnonymous
* @ memberof User . prototype
* @ return true if it ' s the special anonymous user
* /
User . prototype . $isAnonymous = function ( ) {
return this . uid == 'anonymous' ;
} ;
/ * *
* @ function $isSpecial
* @ memberof User . prototype
* @ return true if the user is not a regular system user
* /
User . prototype . $isSpecial = function ( ) {
return this . userClass && this . userClass == 'public-user' ;
} ;
/ * *
* @ function $confirmRights
* @ memberof User . prototype
* @ desc Check if a confirmation is required before giving some rights .
* @ return the confirmation message or false if no confirmation is required
* /
User . prototype . $confirmRights = function ( ) {
var confirmation = false ;
if ( this . $confirmation ) {
// Don't bother the user more than once
return false ;
}
if ( _ . some ( _ . values ( this . rights ) ) ) {
if ( this . uid == 'anonymous' ) {
confirmation = l ( 'Potentially anyone on the Internet will be able to access your folder, even if they do not have an account on this system. Is this information suitable for the public Internet?' ) ;
}
else if ( this . uid == '<default>' ) {
confirmation = l ( 'Any user with an account on this system will be able to access your folder. Are you certain you trust them all?' ) ;
}
}
this . $confirmation = confirmation ;
return confirmation ;
} ;
/ * *
* @ function $rightsAreDirty
* @ memberof User . prototype
* @ return whether or not the rights have changed from their initial values
* /
User . prototype . $rightsAreDirty = function ( ) {
return this . rights && ! _ . isEqual ( this . rights , this . $shadowRights ) ;
2014-10-20 19:52:35 +02:00
} ;
2014-11-03 18:19:35 +01:00
/ * *
* @ function $resetRights
* @ memberof User . prototype
* @ desc Restore initial rights or disable all rights
2014-12-12 19:39:02 +01:00
* @ param { boolean } [ zero ] - reset all rights to zero when true
2014-11-03 18:19:35 +01:00
* /
User . prototype . $resetRights = function ( zero ) {
var _this = this ;
if ( zero ) {
// Disable all rights
_ . map ( _ . keys ( this . rights ) , function ( key ) {
2015-06-02 17:14:03 +02:00
if ( angular . isString ( _this . rights [ key ] ) )
_this . rights [ key ] = 'None' ;
else
_this . rights [ key ] = 0 ;
2014-11-03 18:19:35 +01:00
} ) ;
}
else {
// Restore initial rights
this . rights = angular . copy ( this . $shadowRights ) ;
}
} ;
2014-11-11 17:14:55 +01:00
/ * *
* @ function $folders
* @ memberof User . prototype
2014-12-12 19:39:02 +01:00
* @ desc Retrieve the list of folders of a specific type
* @ param { string } type - either 'contact' or 'calendar'
2014-11-11 17:14:55 +01:00
* @ return a promise of the HTTP query result or the cached result
* /
User . prototype . $folders = function ( type ) {
var _this = this ,
deferred = User . $q . defer ( ) ,
param = { type : type } ;
if ( this . $$folders ) {
deferred . resolve ( this . $$folders ) ;
}
else {
2015-01-13 17:30:23 +01:00
User . $$resource . userResource ( this . uid ) . fetch ( null , 'foldersSearch' , param ) . then ( function ( response ) {
_this . $$folders = response . folders ;
deferred . resolve ( response . folders ) ;
2014-11-11 17:14:55 +01:00
} ) ;
}
return deferred . promise ;
} ;
2014-11-03 18:19:35 +01:00
/ * *
* @ function $omit
* @ memberof User . prototype
* @ desc Return a sanitized object used to send to the server .
* @ return an object literal copy of the User instance
* /
User . prototype . $omit = function ( ) {
var user = { } ;
angular . forEach ( this , function ( value , key ) {
if ( key != 'constructor' && key [ 0 ] != '$' ) {
user [ key ] = value ;
}
} ) ;
return user ;
} ;
2014-10-08 20:08:54 +02:00
} ) ( ) ;