(function(window) { var Gitana = window.Gitana; Gitana.Application = Gitana.AbstractPlatformDataStore.extend( /** @lends Gitana.Application.prototype */ { /** * @constructs * @augments Gitana.AbstractPlatformObject * * @class Application * * @param {Gitana.Platform} platform * @param [Object] object json object (if no callback required for populating) */ constructor: function(platform, object) { this.objectType = function() { return "Gitana.Application"; }; this.base(platform, object); }, /** * @OVERRIDE */ getUri: function() { return "/applications/" + this.getId(); }, /** * @OVERRIDE */ getType: function() { return Gitana.TypedIDConstants.TYPE_APPLICATION; }, /** * @override */ clone: function() { return this.getFactory().application(this.getPlatform(), this); }, /** * Lists the auto-client mappings maintained for this application. * * @param callback the callback function * @param pagination * * @chained this */ listAutoClientMappingObjects: function(callback, pagination) { var self = this; var uriFunction = function() { return self.getUri() + "/autoclientmappings"; }; // parameters var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } return this.chainGetResponse(this, uriFunction, params).then(function(response) { callback.call(this, response["rows"]); }); }, /** * Lists the trusted domain mappings maintained for this application. * * @param callback the callback function * @param pagination * * @chained this */ listTrustedDomainMappingObjects: function(callback, pagination) { var self = this; var uriFunction = function() { return self.getUri() + "/trusteddomainmappings"; }; // parameters var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } return this.chainGetResponse(this, uriFunction, params).then(function(response) { callback.call(this, response["rows"]); }); }, ////////////////////////////////////////////////////////////////////////////////////////// // // SETTINGS // ////////////////////////////////////////////////////////////////////////////////////////// /** * Create settings * * @chained settings * * @param [Object] object JSON object */ createSettings: function(object) { var self = this; // Makes sure we have an empty settings key if (object["settings"] == null) { object["settings"] = {}; } var uriFunction = function() { return self.getUri() + "/settings"; }; var chainable = this.getFactory().settings(this); return this.chainCreate(chainable, object, uriFunction); }, /** * Lists the settings. * * @param pagination * * @chained settings map */ listSettings: function(pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/settings"; }; var chainable = this.getFactory().settingsMap(this); return this.chainGet(chainable, uriFunction, params); }, /** * Reads an setting. * * @param settingId * * @chained settings */ readSettings: function(settingId) { var self = this; var uriFunction = function() { return self.getUri() + "/settings/" + settingId; }; var chainable = this.getFactory().settings(this); return this.chainGet(chainable, uriFunction); }, /** * Queries for settings. * * @chained settings map * * @param {Object} query * @param [Object] pagination pagination (optional) */ querySettings: function(query, pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/settings/query"; }; var chainable = this.getFactory().settingsMap(this); return this.chainPost(chainable, uriFunction, params, query); }, /** * Reads the application settings for the given scope and key. * If the settings doesn't exist, creates an empty one. * * @param {String} scope (optional) * @param {String} key (optional) */ readApplicationSettings: function(scope, key) { var self = this; if (scope == null) { scope = "application"; } if (key == null) { key = "application"; } var object = { "scope" : scope, "key" : key }; var result = this.subchain(new Gitana.Settings(this, object)); return result.then(function() { var chain = this; var driver = self.getDriver(); var createUri = self.getUri() + "/settings"; var queryUri = self.getUri() + "/settings/query"; driver.gitanaPost(queryUri, {}, object, function(response) { var settings = new Gitana.SettingsMap(self); settings.handleResponse(response); if (settings.__keys().length > 0) { var obj = settings[settings.__keys()[0]]; chain.loadFrom(obj); chain.next(); } else { object["settings"] = {}; driver.gitanaPost(createUri, null, object, function(status) { driver.gitanaGet(createUri + "/" + status.getId(), null, {}, function(response) { chain.handleResponse(response); chain.next(); }, function(http) { self.httpError(http); }); }, function(http) { self.httpError(http); }); } }, function(http) { self.httpError(http); }); return false; }); }, /** * Reads the principal settings. It takes either a single Gitana.DomainPrincipal parameter * or a domain Id parameter and a principal Id parameter. */ readApplicationPrincipalSettings: function() { var args = Gitana.makeArray(arguments); if (args.length == 1) { var principal = args.shift(); return this.readApplicationSettings("principal", principal.getDomainQualifiedId()); } else if (args.length == 2) { var domainId = args.shift(); var principalId = args.shift(); return this.readApplicationSettings("principal", domainId + "/" + principalId); } }, /** * Performs a bulk check of permissions against permissioned objects of type settings. * * Example of checks array: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>" * }] * * The callback receives an array of results, example: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>", * "result": true * }] * * The order of elements in the array will be the same for checks and results. * * @param checks * @param callback */ checkSettingPermissions: function(checks, callback) { var self = this; var uriFunction = function() { return self.getUri() + "/settings/permissions/check"; }; var object = { "checks": checks }; return this.chainPostResponse(this, uriFunction, {}, object).then(function(response) { callback.call(this, response["results"]); }); }, ////////////////////////////////////////////////////////////////////////////////////////// // // REGISTRATIONS // ////////////////////////////////////////////////////////////////////////////////////////// /** * Create registration * * @chained registration * * @param [Object] object JSON object */ createRegistration: function(object) { var self = this; var chainable = this.getFactory().registration(this); var uriFunction = function() { return self.getUri() + "/registrations"; }; return this.chainCreate(chainable, object, uriFunction); }, /** * Lists the registrations. * * @param pagination * * @chained registration map */ listRegistrations: function(pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/registrations"; }; var chainable = this.getFactory().registrationMap(this); return this.chainGet(chainable, uriFunction, params); }, /** * Reads a registration. * * @param registrationId * * @chained registration */ readRegistration: function(registrationId) { var self = this; var chainable = this.getFactory().registration(this); var uriFunction = function() { return self.getUri() + "/registrations/" + registrationId; }; return this.chainGet(chainable, uriFunction); }, /** * Queries for registrations. * * @chained registration map * * @param {Object} query * @param [Object] pagination pagination (optional) */ queryRegistrations: function(query, pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/registrations/query"; }; var chainable = this.getFactory().registrationMap(this); return this.chainPost(chainable, uriFunction, params, query); }, /** * Performs a bulk check of permissions against permissioned objects of type registration. * * Example of checks array: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>" * }] * * The callback receives an array of results, example: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>", * "result": true * }] * * The order of elements in the array will be the same for checks and results. * * @param checks * @param callback */ checkRegistrationPermissions: function(checks, callback) { var self = this; var uriFunction = function() { return self.getUri() + "/registrations/permissions/check"; }; var object = { "checks": checks }; return this.chainPostResponse(this, uriFunction, {}, object).then(function(response) { callback.call(this, response["results"]); }); }, ////////////////////////////////////////////////////////////////////////////////////////// // // PAGE RENDITIONS // ////////////////////////////////////////////////////////////////////////////////////////// /** * Create page rendition * * @chained page rendition * * @param {String} string deployment key * @param [Object] object JSON object */ createPageRendition: function(deploymentKey, object) { var self = this; var chainable = this.getFactory().pageRendition(this, deploymentKey); var uriFunction = function() { return self.getUri() + "/deployments/" + deploymentKey + "/pagerenditions"; }; return this.chainCreate(chainable, object, uriFunction); }, /** * Lists the page renditions. * * @param {String} string deployment key * @param pagination * * @chained page rendition map */ listPageRenditions: function(deploymentKey, pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/deployments/" + deploymentKey + "/pagerenditions"; }; var chainable = this.getFactory().pageRenditionMap(this, deploymentKey); return this.chainGet(chainable, uriFunction, params); }, /** * Reads a page rendition. * * @param {String} string deployment key * @param pageRenditionIdOrKey * * @chained registration */ readPageRendition: function(deploymentKey, pageRenditionIdOrKey) { var self = this; var chainable = this.getFactory().pageRendition(this, deploymentKey); var uriFunction = function() { return self.getUri() + "/deployments/" + deploymentKey + "/pagerenditions/" + pageRenditionIdOrKey; }; return this.chainGet(chainable, uriFunction); }, /** * Queries for page renditions. * * @chained page rendition map * * @param {String} string deployment key * @param {Object} query * @param [Object] pagination pagination (optional) */ queryPageRenditions: function(deploymentKey, query, pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/deployments/" + deploymentKey + "/pagerenditions/query"; }; var chainable = this.getFactory().pageRenditionMap(this, deploymentKey); return this.chainPost(chainable, uriFunction, params, query); }, /** * Performs a bulk check of permissions against permissioned objects of type page rendition. * * Example of checks array: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>" * }] * * The callback receives an array of results, example: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>", * "result": true * }] * * The order of elements in the array will be the same for checks and results. * * @param {String} string deployment key * @param checks * @param callback */ checkPageRenditionPermissions: function(deploymentKey, checks, callback) { var self = this; var uriFunction = function() { return self.getUri() + "/deployments/" + deploymentKey + "/pagerenditions/permissions/check"; }; var object = { "checks": checks }; return this.chainPostResponse(this, uriFunction, {}, object).then(function(response) { callback.call(this, response["results"]); }); }, ////////////////////////////////////////////////////////////////////////////////////////// // // EMAIL PROVIDERS // ////////////////////////////////////////////////////////////////////////////////////////// /** * Create email provider * * @chained email provider * * @param [Object] object JSON object */ createEmailProvider: function(object) { var self = this; var chainable = this.getFactory().emailProvider(this); var uriFunction = function() { return self.getUri() + "/emailproviders"; }; return this.chainCreate(chainable, object, uriFunction); }, /** * Lists the email providers. * * @param pagination * * @chained email provider map */ listEmailProviders: function(pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/emailproviders"; }; var chainable = this.getFactory().emailProviderMap(this); return this.chainGet(chainable, uriFunction, params); }, /** * Reads an email provider. * * @param emailProviderId * * @chained emailProvider */ readEmailProvider: function(emailProviderId) { var self = this; var chainable = this.getFactory().emailProvider(this); var uriFunction = function() { return self.getUri() + "/emailproviders/" + emailProviderId; }; return this.chainGet(chainable, uriFunction); }, /** * Queries for email providers. * * @chained email provider map * * @param {Object} query * @param [Object] pagination pagination (optional) */ queryEmailProviders: function(query, pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/emailproviders/query"; }; var chainable = this.getFactory().emailProviderMap(this); return this.chainPost(chainable, uriFunction, params, query); }, /** * Performs a bulk check of permissions against permissioned objects of type emailprovider. * * Example of checks array: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>" * }] * * The callback receives an array of results, example: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>", * "result": true * }] * * The order of elements in the array will be the same for checks and results. * * @param checks * @param callback */ checkEmailProviderPermissions: function(checks, callback) { var self = this; var uriFunction = function() { return self.getUri() + "/emailproviders/permissions/check"; }; var object = { "checks": checks }; return this.chainPostResponse(this, uriFunction, {}, object).then(function(response) { callback.call(this, response["results"]); }); }, ////////////////////////////////////////////////////////////////////////////////////////// // // EMAILS // ////////////////////////////////////////////////////////////////////////////////////////// /** * Create email * * @chained email * * @param [Object] object JSON object */ createEmail: function(object) { var self = this; var chainable = this.getFactory().email(this); var uriFunction = function() { return self.getUri() + "/emails"; }; return this.chainCreate(chainable, object, uriFunction); }, /** * Lists the emails. * * @param pagination * * @chained email map */ listEmails: function(pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/emails"; }; var chainable = this.getFactory().emailMap(this); return this.chainGet(chainable, uriFunction, params); }, /** * Reads an email. * * @param emailId * * @chained email */ readEmail: function(emailId) { var self = this; var chainable = this.getFactory().email(this); var uriFunction = function() { return self.getUri() + "/emails/" + emailId; }; return this.chainGet(chainable, uriFunction); }, /** * Queries for emails. * * @chained email map * * @param {Object} query * @param [Object] pagination pagination (optional) */ queryEmails: function(query, pagination) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } var uriFunction = function() { return self.getUri() + "/emails/query"; }; var chainable = this.getFactory().emailMap(this); return this.chainPost(chainable, uriFunction, params, query); }, /** * Performs a bulk check of permissions against permissioned objects of type email. * * Example of checks array: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>" * }] * * The callback receives an array of results, example: * * [{ * "permissionedId": "<permissionedId>", * "principalId": "<principalId>", * "permissionId": "<permissionId>", * "result": true * }] * * The order of elements in the array will be the same for checks and results. * * @param checks * @param callback */ checkEmailPermissions: function(checks, callback) { var self = this; var uriFunction = function() { return self.getUri() + "/emails/permissions/check"; }; var object = { "checks": checks }; return this.chainPostResponse(this, uriFunction, {}, object).then(function(response) { callback.call(this, response["results"]); }); }, ////////////////////////////////////////////////////////////////////////////////////////// // // DEPLOYMENT // ////////////////////////////////////////////////////////////////////////////////////////// /** * Deploys the application to the environment described by the deployment key. * * @chained deployed application * * @param deploymentKey */ deploy: function(deploymentKey) { var self = this; var uriFunction = function() { return self.getUri() + "/deploy/" + deploymentKey; }; // temp web host var webhost = new Gitana.WebHost(this.getPlatform()); // we hand back a deployed application and preload some work var chainable = this.getFactory().deployedApplication(webhost); return this.chainPost(chainable, uriFunction).then(function() { // load the real web host var webhostId = self["deployments"][deploymentKey]["webhost"]; this.subchain(this.getPlatform()).readWebHost(webhostId).then(function() { webhost.loadFrom(this); }); }); }, /** * Undeploys the application from the environment described by the deployment key. * * @chained application * * @param deploymentKey */ undeploy: function(deploymentKey) { var self = this; var uriFunction = function() { return self.getUri() + "/undeploy/" + deploymentKey; }; return this.chainPost(this, uriFunction); }, /** * Finds the deployed application instance for a given target deployment key. * * @chained deployed application * * @param deploymentKey */ findDeployedApplication: function(deploymentKey) { var self = this; var uriFunction = function() { return self.getUri() + "/deployed/" + deploymentKey; }; // temp web host var webhost = new Gitana.WebHost(this.getPlatform()); // we hand back a deployed application and preload some work var chainable = this.getFactory().deployedApplication(webhost); return this.chainGet(chainable, uriFunction).then(function() { // load the real web host var webhostId = self["deployments"][deploymentKey]["webhost"]; this.subchain(this.getPlatform()).readWebHost(webhostId).then(function() { webhost.loadFrom(this); }); }); }, /** * Retrieves information about a deployed application. * * @param deploymentKey */ loadDeploymentInfo: function(deploymentKey, callback) { var self = this; var uriFunction = function() { return self.getUri() + "/deployed/" + deploymentKey + "/info"; }; return this.chainGetResponse(this, uriFunction, {}).then(function(response) { callback(response.info); }); }, refreshDeploymentKeys: function(deploymentKey) { var self = this; return this.then(function() { var chain = this; // call var uri = self.getUri() + "/deployments/" + deploymentKey + "/refreshkeys"; self.getDriver().gitanaPost(uri, null, {}, function(response) { chain.next(); }); // NOTE: we return false to tell the chain that we'll manually call next() return false; }); } }); })(window);