blob: 122abd079c47fa4f05682d66f1d57eb336ad9f75 [file] [log] [blame]
/**
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
'use strict';
AppServices.Services.factory('ug', function (configuration, $rootScope,utility, $q, $http, $resource, $log, $analytics,$location) {
var requestTimes = [],
running = false,
currentRequests = {};
function reportError(data,config){
try {
$analytics.eventTrack('error', {
category: 'App Services', label: data + ':' + config.url + ':' + (sessionStorage['apigee_uuid'] || 'na')
});
} catch (e) {
console.log(e)
}
};
var getAccessToken = function(){
return sessionStorage.getItem('accessToken');
};
return {
get:function(prop,isObject){
return isObject ? this.client().getObject(prop) : this.client().get(prop);
},
set:function(prop,value){
this.client().set(prop,value);
},
getUrls: function(qs){
var host = $location.host();
var BASE_URL = '';
var DATA_URL = '';
var use_sso = false;
switch (true) {
case host === 'appservices.apigee.com' && location.pathname.indexOf('/dit') >= 0 :
//DIT
BASE_URL = 'https://accounts.jupiter.apigee.net';
DATA_URL = 'https://apigee-internal-prod.jupiter.apigee.net';
use_sso = true;
break;
case host === 'appservices.apigee.com' && location.pathname.indexOf('/mars') >= 0 :
//staging
BASE_URL = 'https://accounts.mars.apigee.net';
DATA_URL = 'https://apigee-internal-prod.mars.apigee.net';
use_sso = true;
break;
case host === 'appservices.apigee.com' :
//enterprise portals
DATA_URL = Usergrid.overrideUrl;
break;
case host === 'apigee.com' :
//prod
BASE_URL = 'https://accounts.apigee.com';
DATA_URL = 'https://api.usergrid.com';
use_sso = true;
break;
case host === 'usergrid.dev':
//development
DATA_URL = 'https://api.usergrid.com';
break;
default :
DATA_URL = Usergrid.overrideUrl;
break;
}
//override with querystring
DATA_URL = qs.api_url || DATA_URL;
DATA_URL = DATA_URL.lastIndexOf('/') === DATA_URL.length - 1 ? DATA_URL.substring(0,DATA_URL.length-1) : DATA_URL;
return {
DATA_URL: DATA_URL,
LOGIN_URL: BASE_URL + '/accounts/sign_in',
PROFILE_URL: BASE_URL + '/accounts/my_account',
LOGOUT_URL: BASE_URL + '/accounts/sign_out',
apiUrl: DATA_URL,
use_sso:use_sso
};
},
orgLogin:function(username,password){
var self = this;
this.client().set('email', username);
this.client().set('token', null);
this.client().orgLogin(username,password,function(err, data, user, organizations, applications){
if(err){
$rootScope.$broadcast('loginFailed', err,data);
}else{
self.initializeCurrentUser(function () {
$rootScope.$broadcast('loginSuccesful', user, organizations, applications);
});
}
});
},
checkAuthentication:function(force){
var ug = this;
var client = ug.client();
var initialize = function () {
ug.initializeCurrentUser(function () {
$rootScope.userEmail = client.get('email');
$rootScope.organizations = client.getObject('organizations');
$rootScope.applications = client.getObject('applications');
$rootScope.currentOrg = client.get('orgName');
$rootScope.currentApp = client.get('appName');
var size = 0, key;
for (key in $rootScope.applications) {
if ($rootScope.applications.hasOwnProperty(key)) size++;
}
$rootScope.$broadcast('checkAuthentication-success', client.getObject('organizations'), client.getObject('applications'), client.get('orgName'), client.get('appName'), client.get('email'));
});
},
isAuthenticated = function () {
var authenticated = client.get('token') !== null && client.get('organizations') !== null;
if (authenticated) {
initialize();
}
return authenticated;
};
if(!isAuthenticated() || force){
if(!client.get('token')){
return $rootScope.$broadcast('checkAuthentication-error','no token',{},client.get('email'));
}
this.client().reAuthenticateLite(function(err){
var missingData = err || ( !client.get('orgName') || !client.get('appName') || !client.getObject('organizations') || !client.getObject('applications'));
var email = client.get('email');
if(err || missingData){
$rootScope.$broadcast('checkAuthentication-error',err,missingData,email);
}else{
initialize();
}
});
}
},
reAuthenticate:function(email,eventOveride){
var ug = this;
this.client().reAuthenticate(email,function(err, data, user, organizations, applications){
if(!err){
$rootScope.currentUser = user;
}
if(!err){
$rootScope.userEmail = user.get('email');
$rootScope.organizations = organizations;
$rootScope.applications = applications;
$rootScope.currentOrg = ug.get('orgName');
$rootScope.currentApp = ug.get('appName');
$rootScope.currentUser = user._data;
$rootScope.currentUser.profileImg = utility.get_gravatar($rootScope.currentUser.email);
}
$rootScope.$broadcast((eventOveride || 'reAuthenticate')+'-' + (err ? 'error' : 'success'),err, data, user, organizations, applications);
});
},
logoutCallback: function() {
$rootScope.$broadcast('userNotAuthenticated');
},
logout:function(){
$rootScope.activeUI = false;
$rootScope.userEmail = 'user@apigee.com';
$rootScope.organizations = {"noOrg":{name:"No Orgs Found"}};
$rootScope.applications = {"noApp":{name:"No Apps Found"}};
$rootScope.currentOrg = 'No Org Found';
$rootScope.currentApp = 'No App Found';
sessionStorage.setItem('accessToken', null);
sessionStorage.setItem('userUUID', null);
sessionStorage.setItem('userEmail', null);
this.client().logout();
this._client = null;
},
client: function(){
var options = {
buildCurl:true,
logging:true
};
if(Usergrid.options && Usergrid.options.client){
options.keys = Usergrid.options.client;
}
this._client = this._client || new Usergrid.Client(options,
$rootScope.urls().DATA_URL
);
return this._client;
},
setClientProperty:function(key,value){
this.client().set(key, value);
},
getTopCollections: function () {
var options = {
method:'GET',
endpoint: ''
}
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error getting collections');
} else {
var collections = data.entities[0].metadata.collections;
$rootScope.$broadcast('top-collections-received', collections);
}
});
},
createCollection: function (collectionName) {
var collections = {};
collections[collectionName] = {};
var metadata = {
metadata: {
collections: collections
}
}
var options = {
method:'PUT',
body: metadata,
endpoint: ''
}
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error creating collection');
} else {
$rootScope.$broadcast('collection-created', collections);
}
});
},
getApplications: function () {
this.client().getApplications(function (err, applications) {
if (err) {
applications && console.error(applications);
}else{
$rootScope.$broadcast('applications-received', applications);
}
});
},
getAdministrators: function () {
this.client().getAdministrators(function (err, administrators) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error getting administrators');
}
$rootScope.$broadcast('administrators-received', administrators);
});
},
createApplication: function (appName) {
this.client().createApplication(appName, function (err, applications) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error creating application');
}else{
$rootScope.$broadcast('applications-created', applications,appName);
$rootScope.$broadcast('applications-received', applications);
}
});
},
createAdministrator: function (adminName) {
this.client().createAdministrator(adminName, function (err, administrators) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error creating administrator');
}
$rootScope.$broadcast('administrators-received', administrators);
});
},
getFeed: function () {
var options = {
method:'GET',
endpoint:'management/organizations/'+this.client().get('orgName')+'/feed',
mQuery:true
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error getting feed');
} else {
var feedData = data.entities;
var feed = [];
var i=0;
for (i=0; i < feedData.length; i++) {
var date = (new Date(feedData[i].created)).toUTCString();
var title = feedData[i].title;
var n=title.indexOf(">");
title = title.substring(n+1,title.length);
n=title.indexOf(">");
title = title.substring(n+1,title.length);
if (feedData[i].actor) {
title = feedData[i].actor.displayName + ' ' + title;
}
feed.push({date:date, title:title});
}
if (i === 0) {
feed.push({date:"", title:"No Activities found."});
}
$rootScope.$broadcast('feed-received', feed);
}
});
},
createGroup: function (path, title) {
var options = {
path:path,
title:title
}
var self = this;
this.groupsCollection.addEntity(options, function(err){
if (err) {
$rootScope.$broadcast('groups-create-error', err);
} else {
$rootScope.$broadcast('groups-create-success', self.groupsCollection);
$rootScope.$broadcast('groups-received', self.groupsCollection);
}
});
},
createRole: function (name, title) {
var options = {
name:name,
title:title
},
self = this;
this.rolesCollection.addEntity(options, function(err){
if (err) {
$rootScope.$broadcast('alert', 'error', 'error creating role');
} else {
$rootScope.$broadcast('roles-received', self.rolesCollection);
}
});
},
createUser: function (username, name, email, password){
var options = {
username:username,
name:name,
email:email,
password:password
}
var self = this;
this.usersCollection.addEntity(options, function(err, data){
if (err) {
if (typeof data === 'string') {
$rootScope.$broadcast("alert", "error", "error: " + data);
} else {
$rootScope.$broadcast("alert", "error", "error creating user. the email address might already exist.");
}
} else {
$rootScope.$broadcast('users-create-success', self.usersCollection);
$rootScope.$broadcast('users-received', self.usersCollection);
}
});
},
getCollection: function (type, path, orderBy, query, limit) {
var options = {
type:path,
qs:{}
}
if (query) {
options.qs['ql'] = query;
}
//force order by 'created desc' if none exists
if (options.qs.ql) {
options.qs['ql'] = options.qs.ql + ' order by ' + (orderBy || 'created desc');
} else {
options.qs['ql'] = ' order by ' + (orderBy || 'created desc');
}
if (limit) {
options.qs['limit'] = limit;
}
this.client().createCollection(options, function (err, collection, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error getting ' + collection._type + ': ' + data.error_description);
$rootScope.$broadcast(type + '-error', collection);
} else {
$rootScope.$broadcast(type + '-received', collection);
}
//temporarily adding scope.apply to get working in prod, otherwise the events won't get broadcast
//todo - we need an apply strategy for 3rd party ug calls!
if(!$rootScope.$$phase) {
$rootScope.$apply();
}
});
},
runDataQuery: function (queryPath, searchString, queryLimit) {
this.getCollection('query', queryPath, null, searchString, queryLimit);
},
runDataPOSTQuery: function(queryPath, body) {
var self = this;
var options = {
method:'POST',
endpoint:queryPath,
body:body
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error: ' + data.error_description);
$rootScope.$broadcast('error-running-query', data);
} else {
var queryPath = data.path;
self.getCollection('query', queryPath, null, 'order by modified DESC', null);
}
});
},
runDataPutQuery: function(queryPath, searchString, queryLimit, body) {
var self = this;
var options = {
method:'PUT',
endpoint:queryPath,
body:body
};
if (searchString) {
options.qs['ql'] = searchString;
}
if (queryLimit) {
options.qs['queryLimit'] = queryLimit;
}
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error: ' + data.error_description);
} else {
var queryPath = data.path;
self.getCollection('query', queryPath, null, 'order by modified DESC', null);
}
});
},
runDataDeleteQuery: function(queryPath, searchString, queryLimit) {
var self = this;
var options = {
method:'DELETE',
endpoint:queryPath
};
if (searchString) {
options.qs['ql'] = searchString;
}
if (queryLimit) {
options.qs['queryLimit'] = queryLimit;
}
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error: ' + data.error_description);
} else {
var queryPath = data.path;
self.getCollection('query', queryPath, null, 'order by modified DESC', null);
}
});
},
getUsers: function () {
this.getCollection('users','users','username');
var self = this;
$rootScope.$on("users-received",function(evt, users){
self.usersCollection = users;
})
},
getGroups: function () {
this.getCollection('groups','groups','title');
var self = this;
$rootScope.$on('groups-received', function(event, roles) {
self.groupsCollection = roles;
});
},
getRoles: function () {
this.getCollection('roles','roles','name');
var self = this;
$rootScope.$on('roles-received', function(event, roles) {
self.rolesCollection = roles
});
},
getNotifiers: function () {
var query = '',
limit = '100',
self = this;
this.getCollection('notifiers','notifiers','created', query, limit);
$rootScope.$on('notifiers-received', function(event, notifiers) {
self.notifiersCollection = notifiers;
});
},
getNotificationHistory: function (type) {
var query = null;
if (type) {
query = "select * where state = '" + type + "'";
}
this.getCollection('notifications','notifications', 'created desc', query);
var self = this;
$rootScope.$on('notifications-received', function(event, notifications) {
self.notificationCollection = notifications;
});
},
getNotificationReceipts: function (uuid) {
this.getCollection('receipts', 'notifications/'+uuid+'/receipts');
var self = this;
$rootScope.$on('receipts-received', function(event, receipts) {
self.receiptsCollection = receipts;
});
},
getIndexes: function (path) {
var options = {
method:'GET',
endpoint: path.split('/').concat('indexes').filter(function(bit){return bit && bit.length}).join('/')
}
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'Problem getting indexes: ' + data.error);
} else {
$rootScope.$broadcast('indexes-received', data.data);
}
});
},
sendNotification: function(path, body) {
var options = {
method:'POST',
endpoint: path,
body:body
}
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'Problem creating notification: ' + data.error);
} else {
$rootScope.$broadcast('send-notification-complete');
}
});
},
getRolesUsers: function (username) {
var self = this;
var options = {
type:'roles/users/'+username,
qs:{ql:'order by username'}
}
this.client().createCollection(options, function (err, users) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error getting users');
} else {
$rootScope.$broadcast('users-received', users);
}
});
},
getTypeAheadData: function (type, searchString, searchBy, orderBy) {
var self = this;
var search = '';
var qs = {limit: 100};
if (searchString) {
search = "select * where "+searchBy+" = '"+searchString+"'";
}
if (orderBy) {
search = search + " order by "+orderBy;
}
if (search) {
qs.ql = search;
}
var options = {
method:'GET',
endpoint: type,
qs:qs
}
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error getting '+type);
} else {
var entities = data.entities;
$rootScope.$broadcast(type +'-typeahead-received', entities);
}
});
},
getUsersTypeAhead: function (searchString) {
this.getTypeAheadData('users', searchString, 'username', 'username');
},
getGroupsTypeAhead: function (searchString) {
this.getTypeAheadData('groups', searchString, 'path', 'path');
},
getRolesTypeAhead: function (searchString) {
this.getTypeAheadData('roles', searchString, 'name', 'name');
},
getGroupsForUser: function (user) {
var self = this;
var options = {
type:'users/'+user+'/groups'
}
this.client().createCollection(options, function (err, groups) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error getting groups');
} else {
$rootScope.$broadcast('user-groups-received', groups);
}
});
},
addUserToGroup: function (user, group) {
var self = this;
var options = {
type:'users/'+user+'/groups/'+group
}
this.client().createEntity(options, function (err, entity) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error adding user to group');
} else {
$rootScope.$broadcast('user-added-to-group-received');
}
});
},
addUserToRole: function (user, role) {
var options = {
method:'POST',
endpoint:'roles/'+role+'/users/'+user
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error adding user to role');
} else {
$rootScope.$broadcast('role-update-received');
}
});
},
addGroupToRole: function (group, role) {
var options = {
method:'POST',
endpoint:'roles/'+role+'/groups/'+group
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error adding group to role');
} else {
$rootScope.$broadcast('role-update-received');
}
});
},
followUser: function (user) {
var self = this;
var username = $rootScope.selectedUser.get('uuid');
var options = {
method:'POST',
endpoint:'users/'+username+'/following/users/'+user
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error following user');
} else {
$rootScope.$broadcast('follow-user-received');
}
});
},
newPermission: function (permission, type, entity) { //"get,post,put:/mypermission"
var options = {
method:'POST',
endpoint:type+'/'+entity+'/permissions',
body:{"permission":permission}
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error adding permission');
} else {
$rootScope.$broadcast('permission-update-received');
}
});
},
newUserPermission: function (permission, username) {
this.newPermission(permission,'users',username)
},
newGroupPermission: function (permission, path) {
this.newPermission(permission,'groups',path)
},
newRolePermission: function (permission, name) {
this.newPermission(permission,'roles',name)
},
deletePermission: function (permission, type, entity) { //"get,post,put:/mypermission"
var options = {
method:'DELETE',
endpoint:type+'/'+entity+'/permissions',
qs:{permission:permission}
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error deleting permission');
} else {
$rootScope.$broadcast('permission-update-received');
}
});
},
deleteUserPermission: function (permission, user) {
this.deletePermission(permission,'users',user);
},
deleteGroupPermission: function (permission, group) {
this.deletePermission(permission,'groups',group);
},
deleteRolePermission: function (permission, rolename) {
this.deletePermission(permission,'roles',rolename);
},
removeUserFromRole: function (user, role) { //"get,post,put:/mypermission"
var options = {
method:'DELETE',
endpoint:'roles/'+role+'/users/'+user
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error removing user from role');
} else {
$rootScope.$broadcast('role-update-received');
}
});
},
removeUserFromGroup: function (group, role) { //"get,post,put:/mypermission"
var options = {
method:'DELETE',
endpoint:'roles/'+role+'/groups/'+group
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error removing role from the group');
} else {
$rootScope.$broadcast('role-update-received');
}
});
},
createAndroidNotifier: function (name, APIkey) {
var options = {
method:'POST',
endpoint:'notifiers',
body:{"apiKey":APIkey,"name":name,"provider":"google"}
};
this.client().request(options, function (err, data) {
if (err) {
console.error(data);
$rootScope.$broadcast('alert', 'error', 'error creating notifier ');
} else {
$rootScope.$broadcast('alert', 'success', 'New notifier created successfully.');
$rootScope.$broadcast('notifier-update');
}
});
},
createAppleNotifier: function (file, name, environment, certificatePassword ) {
var provider = 'apple';
var formData = new FormData();
formData.append("p12Certificate", file);
formData.append('name', name);
formData.append('provider', provider);
formData.append('environment', environment);
formData.append('certificatePassword', certificatePassword || "");
//var body = {'p12Certificate':file, "name":name,'environment':environment,"provider":provider};
//if(certificatePassword){
// body.certificatePassword = certificatePassword;
//}
var options = {
method:'POST',
endpoint:'notifiers',
formData:formData
};
this.client().request(options, function (err, data) {
if (err) {
console.error(data);
$rootScope.$broadcast('alert', 'error', data.error_description || 'error creating notifier');
} else {
$rootScope.$broadcast('alert', 'success', 'New notifier created successfully.');
$rootScope.$broadcast('notifier-update');
}
});
},
deleteNotifier: function (name) {
var options = {
method:'DELETE',
endpoint: 'notifiers/'+name
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'error deleting notifier');
} else {
$rootScope.$broadcast('notifier-update');
}
});
},
initializeCurrentUser: function (callback) {
callback = callback || function(){};
if($rootScope.currentUser && !$rootScope.currentUser.reset){
callback($rootScope.currentUser);
return $rootScope.$broadcast('current-user-initialized', '');
}
var options = {
method:'GET',
endpoint:'management/users/'+ this.client().get('email'),
mQuery:true
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('alert', 'error', 'Error getting user info');
} else {
$rootScope.currentUser = data.data;
$rootScope.currentUser.profileImg = utility.get_gravatar($rootScope.currentUser.email);
$rootScope.userEmail =$rootScope.currentUser.email;
callback($rootScope.currentUser);
$rootScope.$broadcast('current-user-initialized', $rootScope.currentUser);
}
});
},
updateUser: function (user) {
var body = $rootScope.currentUser;
body.username = user.username;
body.name = user.name;
body.email = user.email;
var options = {
method:'PUT',
endpoint:'management/users/' + user.uuid + '/',
mQuery:true,
body:body
};
var self = this;
this.client().request(options, function (err, data) {
self.client().set('email',user.email);
self.client().set('username',user.username);
if (err) {
return $rootScope.$broadcast('user-update-error',data);
}
$rootScope.currentUser.reset = true;
self.initializeCurrentUser(function(){
$rootScope.$broadcast('user-update-success', $rootScope.currentUser);
});
});
},
resetUserPassword: function (user) {
var pwdata = {};
pwdata.oldpassword = user.oldPassword;
pwdata.newpassword = user.newPassword;
pwdata.username = user.username;
var options = {
method:'PUT',
endpoint:'users/' + pwdata.uuid + '/',
body:pwdata
}
this.client().request(options, function (err, data) {
if (err) {
return $rootScope.$broadcast('alert', 'error', 'Error resetting password');
}
//remove old and new password fields so they don't end up as part of the entity object
$rootScope.currentUser.oldPassword = '';
$rootScope.currentUser.newPassword = '';
$rootScope.$broadcast('user-reset-password-success', $rootScope.currentUser);
});
},
getOrgCredentials: function () {
var options = {
method:'GET',
endpoint:'management/organizations/'+this.client().get('orgName')+'/credentials',
mQuery:true
};
this.client().request(options, function (err, data) {
if (err && data.credentials) {
$rootScope.$broadcast('alert', 'error', 'Error getting credentials');
} else {
$rootScope.$broadcast('org-creds-updated', data.credentials);
}
});
},
regenerateOrgCredentials: function () {
var self = this;
var options = {
method:'POST',
endpoint:'management/organizations/'+ this.client().get('orgName') + '/credentials',
mQuery:true
};
this.client().request(options, function(err, data) {
if (err && data.credentials) {
$rootScope.$broadcast('alert', 'error', 'Error regenerating credentials');
} else {
$rootScope.$broadcast('alert', 'success', 'Regeneration of credentials complete.');
$rootScope.$broadcast('org-creds-updated', data.credentials);
}
});
},
getAppCredentials: function () {
var options = {
method:'GET',
endpoint:'credentials'
};
this.client().request(options, function (err, data) {
if (err && data.credentials) {
$rootScope.$broadcast('alert', 'error', 'Error getting credentials');
} else {
$rootScope.$broadcast('app-creds-updated', data.credentials);
}
});
},
regenerateAppCredentials: function () {
var self = this;
var options = {
method:'POST',
endpoint:'credentials'
};
this.client().request(options, function(err, data) {
if (err && data.credentials) {
$rootScope.$broadcast('alert', 'error', 'Error regenerating credentials');
} else {
$rootScope.$broadcast('alert', 'success', 'Regeneration of credentials complete.');
$rootScope.$broadcast('app-creds-updated', data.credentials);
}
});
},
signUpUser: function(orgName,userName,name,email,password){
var formData = {
"organization": orgName,
"username": userName,
"name": name,
"email": email,
"password": password
};
var options = {
method:'POST',
endpoint:'management/organizations',
body:formData,
mQuery:true
};
var client = this.client();
client.request(options, function(err, data) {
if (err) {
$rootScope.$broadcast('register-error', data);
} else {
$rootScope.$broadcast('register-success',data);
}
});
},
resendActivationLink: function(id){
var options = {
method: 'GET',
endpoint: 'management/users/'+id+'/reactivate',
mQuery:true
};
this.client().request(options, function (err, data) {
if (err) {
$rootScope.$broadcast('resend-activate-error', data);
} else {
$rootScope.$broadcast('resend-activate-success',data);
}
});
},
getAppSettings: function(){
$rootScope.$broadcast('app-settings-received',{});
},
getActivities: function(){
this.client().request({method:'GET',endpoint:'activities', qs:{limit:200}},function(err,data){
if(err) return $rootScope.$broadcast('app-activities-error',data);
var entities = data.entities;
//set picture if there is none and change gravatar to secure
entities.forEach(function(entity) {
if (!entity.actor.picture) {
entity.actor.picture = window.location.protocol+ "//" + window.location.host + window.location.pathname + "img/user_profile.png"
} else {
entity.actor.picture = entity.actor.picture.replace(/^http:\/\/www.gravatar/i, 'https://secure.gravatar');
//note: changing this to use the image on apigee.com - since the gravatar default won't work on any non-public domains such as localhost
//this_data.picture = this_data.picture + encodeURI("?d="+window.location.protocol+"//" + window.location.host + window.location.pathname + "images/user_profile.png");
if (~entity.actor.picture.indexOf('http')) {
entity.actor.picture = entity.actor.picture;
} else {
entity.actor.picture = 'https://apigee.com/usergrid/img/user_profile.png';
}
}
});
$rootScope.$broadcast('app-activities-received',data.entities);
});
},
getEntityActivities: function(entity, isFeed){
var route = isFeed ? 'feed' : 'activities'
var endpoint = entity.get('type') + '/' + entity.get('uuid') + '/'+route ;
var options = {
method:'GET',
endpoint:endpoint,
qs:{limit:200}
};
this.client().request(options, function (err, data) {
if(err){
$rootScope.$broadcast(entity.get('type')+'-'+route+'-error',data);
}
data.entities.forEach(function(entityInstance) {
entityInstance.createdDate = (new Date( entityInstance.created)).toUTCString();
});
$rootScope.$broadcast(entity.get('type')+'-'+route+'-received',data.entities);
});
},
addUserActivity:function(user,content){
var options = {
"actor": {
"displayName": user.get('username'),
"uuid": user.get('uuid'),
"username":user.get('username')
},
"verb": "post",
"content": content
};
this.client().createUserActivity(user.get('username'), options, function(err, activity) { //first argument can be 'me', a uuid, or a username
if (err) {
$rootScope.$broadcast('user-activity-add-error', err);
} else {
$rootScope.$broadcast('user-activity-add-success', activity);
}
});
},
runShellQuery:function(method,path,payload){
var path = path.replace(/^\//, ''); //remove leading slash if it does
var options = {
"method": method,
"endpoint":path
};
if(payload){
options["body"]=payload;
}
this.client().request(options,function(err,data){
if(err) {
$rootScope.$broadcast('shell-error', data);
}else{
$rootScope.$broadcast('shell-success', data);
}
});
},
addOrganization:function(user,orgName){
var options = {
method: 'POST',
endpoint: 'management/users/'+user.uuid+'/organizations',
body:{organization:orgName},
mQuery:true
}, client = this.client(),self=this;
client.request(options,function(err,data){
if(err){
$rootScope.$broadcast('user-add-org-error', data);
}else{
$rootScope.$broadcast('user-add-org-success', $rootScope.organizations);
}
});
},
leaveOrganization:function(user,org){
var options = {
method: 'DELETE',
endpoint: 'management/users/'+user.uuid+'/organizations/'+org.uuid,
mQuery:true
}
this.client().request(options,function(err,data){
if(err){
$rootScope.$broadcast('user-leave-org-error', data);
}else{
delete $rootScope.organizations[org.name];
$rootScope.$broadcast('user-leave-org-success', $rootScope.organizations);
}
});
},
/**
* Retrieves page data
* @param {string} id the name of the single page item to get (a key in the JSON) can be null.
* @param {string} url location of the file/endpoint.
* @return {Promise} Resolves to JSON.
*/
httpGet: function (id, url) {
var items, deferred;
deferred = $q.defer();
$http.get((url || configuration.ITEMS_URL)).
success(function (data, status, headers, config) {
var result;
if (id) {
angular.forEach(data, function (obj, index) {
if (obj.id === id) {
result = obj;
}
});
} else {
result = data;
}
deferred.resolve(result);
}).
error(function (data, status, headers, config) {
$log.error(data, status, headers, config);
reportError(data,config);
deferred.reject(data);
});
return deferred.promise;
},
/**
* Retrieves page data via jsonp
* @param {string} url the location of the JSON/RESTful endpoint.
* @param {string} successCallback function called on success.
*/
jsonp: function (objectType,criteriaId,params,successCallback) {
if(!params){
params = {};
}
params.demoApp = $rootScope.demoData;
params.access_token = getAccessToken();
params.callback = 'JSON_CALLBACK';
var uri = $rootScope.urls().DATA_URL + '/' + $rootScope.currentOrg + '/' + $rootScope.currentApp + '/apm/' + objectType + '/' + criteriaId;
return this.jsonpRaw(objectType,criteriaId,params,uri,successCallback);
},
jsonpSimple: function (objectType,appId,params) {
var uri = $rootScope.urls().DATA_URL + '/' + $rootScope.currentOrg + '/' + $rootScope.currentApp + '/apm/' + objectType + "/" + appId;
return this.jsonpRaw(objectType,appId,params,uri);
},
calculateAverageRequestTimes: function(){
if(!running){
var self = this;
running = true;
setTimeout(function(){
running=false;
var length = requestTimes.length < 10 ? requestTimes.length : 10;
var sum = requestTimes.slice(0, length).reduce(function(a, b) { return a + b });
var avg = sum / length;
self.averageRequestTimes = avg/1000;
if(self.averageRequestTimes > 5){
$rootScope.$broadcast('request-times-slow',self.averageRequestTimes);
}
},3000);
}
},
jsonpRaw: function (objectType,appId,params,uri,successCallback) {
if(typeof successCallback !== 'function'){
successCallback = null;
}
uri = uri || ($rootScope.urls().DATA_URL + '/' + $rootScope.currentOrg + '/' + $rootScope.currentApp + '/' + objectType);
if(!params){
params = {};
}
var start = new Date().getTime(),
self = this;
params.access_token = getAccessToken();
params.callback = 'JSON_CALLBACK';
var deferred = $q.defer();
var diff = function(){
currentRequests[uri]--;
requestTimes.splice(0,0 ,new Date().getTime() - start);
self.calculateAverageRequestTimes();
};
successCallback && $rootScope.$broadcast("ajax_loading", objectType);
var reqCount = currentRequests[uri] || 0;
if(self.averageRequestTimes > 5 && reqCount>1){
setTimeout(function(){
deferred.reject(new Error('query in progress'));
},50);
return deferred;
}
currentRequests[uri] = (currentRequests[uri] || 0) + 1;
$http.jsonp(uri,{params:params}).
success(function(data, status, headers, config) {
diff();
if(successCallback){
successCallback(data, status, headers, config);
$rootScope.$broadcast("ajax_finished", objectType);
}
deferred.resolve(data);
}).
error(function(data, status, headers, config) {
diff();
$log.error("ERROR: Could not get jsonp data. " +uri);
reportError(data,config);
deferred.reject(data);
});
return deferred.promise;
},
resource: function(params,isArray) {
//temporary url for REST endpoints
return $resource($rootScope.urls().DATA_URL + '/:orgname/:appname/:username/:endpoint',
{
},
{
get: {
method:'JSONP',
isArray: isArray,
params: params
},
login: {
method:'GET',
url: $rootScope.urls().DATA_URL + '/management/token',
isArray: false,
params: params
},
save: {
url: $rootScope.urls().DATA_URL + '/' + params.orgname + '/' + params.appname,
method:'PUT',
isArray: false,
params: params
}
});
},
httpPost: function(url,callback,payload,headers){
var accessToken = getAccessToken();
if(payload){
payload.access_token = accessToken;
}else{
payload = {access_token:accessToken}
}
if(!headers){
headers = {Bearer:accessToken};
}
$http({method: 'POST', url: url, data: payload, headers: headers}).
success(function(data, status, headers, config) {
callback(data)
}).
error(function(data, status, headers, config) {
reportError(data,config);
callback(data)
});
}
}
});