(function () { 'use strict'; var app = angular.module('OrganisationAdmin'); function datacontext($q, myUsersDataContext, config, $http) { var currentOrgIndex = 0; var availableOrgs; var allOrgs; var inProgress; var topLevelOrg; var canvasSystemUrl; var service = { reset: reset, getOrgs: getOrgs, getCurrentOrg: getCurrentOrg, getTopLevelOrg: getTopLevelOrg, setCurrentOrgIndex: setCurrentOrgIndex, getAdministrationOrgs: getAdministrationOrgs, getCurrentUserCount: getCurrentUserCount, getAdministrationGroups: getAdministrationGroups, getCanvasSystemUrl: getCanvasSystemUrl, getOrganisationBySubDomain: getOrganisationBySubDomain, doesSubDomainExist: doesSubDomainExist, getOrganisationDetails: getOrganisationDetails, updateOrganisation: updateOrganisation }; return service; //Request locking - if there is already a promise, return that. //this feels like it should be handled elsewhere, otherwise you'll have a bunch of request locking variables, but works atm. function reset() { availableOrgs = null; allOrgs = null; } function getOrgs() { if (!allOrgs) { return myUsersDataContext.getOrganisationsFull(0) .then(function (data) { allOrgs = data; console.log(data); return allOrgs; }); } return $q.resolve(allOrgs); } function getCurrentUserCount() { return getCurrentOrg().then(function (data) { return $http({ method: "get", url: config.myusersUrl + 'api/organisationadministration/' + data.id + '/groupsandusers' }).then(function (response) { return response.data.totalAccumulativeOverallUsers; }); }); } function getTopLevelOrg(refresh) { if (!topLevelOrg || refresh) { return $http({ method: "get", url: config.myusersUrl + 'api/organisationadministration/toplevelorg' }).then(function (response) { topLevelOrg = response.data; return response.data; }).catch(function (reason) { topLevelOrg = null; return null; }); } else { return $q.resolve(topLevelOrg); } } function getCurrentOrg() { if (!availableOrgs || availableOrgs < 1) { if (!inProgress) { inProgress = getAdministrationOrgs(); } return inProgress .then(function (data) { availableOrgs = data; inProgress = false; return availableOrgs[currentOrgIndex]; }); } return $q.resolve(availableOrgs[currentOrgIndex]); } function setCurrentOrgIndex(orgIndex) { currentOrgIndex = orgIndex; return getCurrentOrg(); } function getAdministrationOrgs() { if (!availableOrgs || availableOrgs.length < 1) { return myUsersDataContext.getOrganisationsFull(0) .then(function (data) { if (data.length === 0) { return getAdministrationGroups(); } else if (data[0].id == 'c255c828-8de5-e311-8cfe-78e3b597545b') { data.splice(0, 1); availableOrgs = data; return availableOrgs; } else { availableOrgs = data; return availableOrgs; } }); } return $q.resolve(availableOrgs); } function getAdministrationGroups() { if (!availableOrgs) { return myUsersDataContext.getOrganisationsFull(2) .then(function (data) { if (data.length === 0) { return getEmployerGroups(); } else if (data.length === 0) { return getMentorGroups(); } else { availableOrgs = data; return availableOrgs; } }); } return $q.resolve(availableOrgs); } function getEmployerGroups() { if (!availableOrgs) { return myUsersDataContext.getOrganisationsFull(8) .then(function (data) { if (data.length === 0) { return getEmployerOrganisations(); } else { availableOrgs = data; return availableOrgs; } }); } return $q.resolve(availableOrgs); } function getEmployerOrganisations() { if (!availableOrgs) { return myUsersDataContext.getOrganisationsFull(7) .then(function (data) { if (data.length === 0) { return getMentorGroups(); } else { availableOrgs = data; return availableOrgs; } }); } return $q.resolve(availableOrgs); } function getMentorGroups() { if (!availableOrgs) { return myUsersDataContext.getOrganisationsFull(9) .then(function (data) { availableOrgs = data; return availableOrgs; }); } return $q.resolve(availableOrgs); } function getCanvasSystemUrl() { if (!canvasSystemUrl) { return $http({ method: "get", url: myShowcaseSiteUrl + 'api/organisationconnections/organisation/' + topLevelOrg.id + '/canvassystemUrl' }).then(function (response) { canvasSystemUrl = response.data; return response.data; }); } else { return $q.resolve(canvasSystemUrl); } } function doesSubDomainExist(subdomain) { return $http({ method: "get", url: config.myusersUrl + 'api/organisations/subdomain/' + subdomain + '/exist' }).then(function (response) { return response.data; }).catch(function (reason) { return null; }); } // Get badge issuers accessible by the current user function getOrganisationBySubDomain(subdomain) { if (subdomain == 'app') { return $q.resolve(null); } var request = $http({ method: "get", url: config.myusersUrl + 'api/organisations/subdomain/' + subdomain }); return (request.then(handleSuccess, handleError)); } function updateOrganisation(org) { var request = $http({ method: "put", url: config.myusersUrl + 'api/organisationadministration/' + org.id, data: org }); return (request.then(handleSuccess, handleError)); } function getOrganisationDetails(org) { return myUsersDataContext.getOrganisationDetails(org) .then(function (data) { return data; }); } function getOrganisationDetailsSimple(org) { return myUsersDataContext.getOrganisationDetailsSimple(org) .then(function (data) { return data; }); } function handleError(response) { // The API response from the server should be returned in a // nomralized format. However, if the request was not handled by the // server (or what not handles properly - ex. server error), then we // may have to normalize it on our end, as best we can. if ( !angular.isObject(response.data) || !response.data.message ) { return ($q.reject("An unknown error occurred.")); } // Otherwise, use expected error message. return ($q.reject(response.data.message)); } // I transform the successful response, unwrapping the application data // from the API response payload. function handleSuccess(response) { return (response.data); } } app.factory('OrganisationAdminService', ['$q', 'myUsersDataContext', 'OrganisationAdminConfig', '$http', datacontext]); })();