(function(window) { var Gitana = window.Gitana; Gitana.Domain = Gitana.AbstractPlatformDataStore.extend( /** @lends Gitana.Domain.prototype */ { /** * @constructs * @augments Gitana.AbstractPlatformDataStore * * @class Domain * * @param {Gitana.Platform} platform * @param [Object] object json object (if no callback required for populating) */ constructor: function(platform, object) { this.base(platform, object); this.objectType = function() { return "Gitana.Domain"; }; }, /** * @OVERRIDE */ getUri: function() { return "/domains/" + this.getId(); }, /** * @OVERRIDE */ getType: function() { return Gitana.TypedIDConstants.TYPE_DOMAIN; }, /** * @override */ clone: function() { return this.getFactory().domain(this.getPlatform(), this); }, ////////////////////////////////////////////////////////////////////////////////////////// // // PRINCIPALS // ////////////////////////////////////////////////////////////////////////////////////////// /** * Acquires a list of all principals. * * @chained principal map * * @param [Pagination] pagination pagination (optional) */ listPrincipals: function(pagination, options) { var self = this; // prepare params (with pagination) var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } // options: see readPrincipal() if (options) { Gitana.copyInto(params, options); } var uriFunction = function() { return self.getUri() + "/principals"; }; // get to work var chainable = this.getFactory().domainPrincipalMap(this); // all groups return this.chainGet(chainable, uriFunction, params); }, /** * Reads a principal. * * The options object is optional and can specify additional arguments for the retrieval. * This can look like: * * { * "groups": undefined | "direct" | "indirect" * } * * @chained principal * * @param {String} principalId the principal id * @param [Object] options */ readPrincipal: function(principalId, options) { var self = this; var params = {}; if (options) { Gitana.copyInto(params, options); } var uriFunction = function() { return self.getUri() + "/principals/" + principalId; }; var chainable = this.getFactory().domainPrincipal(this); return this.chainGet(chainable, uriFunction, params); }, /** * Create a principal. * * @chained principal * * @param [Object] object JSON object */ createPrincipal: function(object) { var self = this; if (!object) { object = {}; } if (!object.name) { // TODO: error - requires name console.log("missing name"); return; } if (!object.type) { // TODO: error - requires type console.log("missing type"); return; } var uriFunction = function() { return self.getUri() + "/principals"; }; var chainable = this.getFactory().domainPrincipal(this, object); return this.chainCreate(chainable, object, uriFunction); }, /** * Queries for principals. * * @chained principal map * * @param {Object} query * @param [Object] pagination pagination (optional) * @param [Object] options */ queryPrincipals: function(query, pagination, options) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } // options: see readPrincipal() if (options) { Gitana.copyInto(params, options); } var uriFunction = function() { return self.getUri() + "/principals/query"; }; var chainable = this.getFactory().domainPrincipalMap(this); return this.chainPost(chainable, uriFunction, params, query); }, ////////////////////////////////////////////////////////////////////////////////////////// // // GROUPS // ////////////////////////////////////////////////////////////////////////////////////////// /** * Acquires a list of all groups in the domain. * * @chained group map * * @param [Object] pagination pagination (optional) */ listGroups: function(pagination) { var query = { "type": "GROUP" }; return this.queryPrincipals(query, pagination); }, /** * Create a group. * * @chained group * * @param {String} groupId the group id * @param [Object] object JSON object */ createGroup: function(object) { if (!object) { object = {}; } object["type"] = "GROUP"; return this.createPrincipal(object); }, /** * Queries for groups. * * @chained principal map * * @param {Object} query * @param [Object] pagination pagination (optional) */ queryGroups: function(query, pagination) { if (!query) { query = {}; } query["type"] = "GROUP"; return this.queryPrincipals(query, pagination); }, ////////////////////////////////////////////////////////////////////////////////////////// // // USERS // ////////////////////////////////////////////////////////////////////////////////////////// /** * Acquires a list of all users. * * @chained user map * * @param [Object] pagination pagination (optional) */ listUsers: function(pagination) { var query = { "type": "USER" }; return this.queryPrincipals(query, pagination); }, /** * Create a user. * * @chained user * * @param {String} userId the user id * @param [Object] object JSON object */ createUser: function(object) { if (!object) { object = {}; } object["type"] = "USER"; return this.createPrincipal(object); }, /** * Queries for users. * * @chained principal map * * @param {Object} query * @param [Object] pagination pagination (optional) */ queryUsers: function(query, pagination) { if (!query) { query = {}; } query["type"] = "USER"; return this.queryPrincipals(query, pagination); }, ////////////////////////////////////////////////////////////////////////////////////////// // // MEMBERSHIPS // ////////////////////////////////////////////////////////////////////////////////////////// /** * Adds a principal as a member of a group * * @chained domain * * @public * * @param {Gitana.DomainGroup|String} group the group or the group id * @param {Gitana.DomainPrincipal|String} principal the principal or the principal id */ addMember: function(group, principal) { var self = this; var groupId = this.extractPrincipalIdentifiers(group, this.getId())["principal"]; var principalDomainQualifiedId = this.extractPrincipalDomainQualifiedId(principal); var uriFunction = function() { return self.getUri() + "/principals/" + groupId + "/members/add?id=" + principalDomainQualifiedId; }; return this.chainPostEmpty(null, uriFunction); }, /** * Removes a principal as a member of a group. * * @chained domain * * @public * * @param {Gitana.DomainGroup|String} group the group or the group id * @param {Gitana.DomainPrincipal|String} principal the principal or the principal id */ removeMember: function(group, principal) { var self = this; var groupId = this.extractPrincipalIdentifiers(group, this.getId())["principal"]; var principalDomainQualifiedId = this.extractPrincipalDomainQualifiedId(principal); var uriFunction = function() { return self.getUri() + "/principals/" + groupId + "/members/remove?id=" + principalDomainQualifiedId; }; return this.chainPostEmpty(null, uriFunction); }, /** * Acquires a list of all of the members who are in this group. * * @chained principal map * * @public * * @param {Object} group * @param {String} filter type of principal to hand back ("user" or "group") * @param [Object] pagination * @param {Boolean} indirect whether to include members that inherit through child groups */ listMembers: function(group, filter, pagination, indirect) { var self = this; var params = {}; if (pagination) { Gitana.copyInto(params, pagination); } if (filter) { params["filter"] = filter; } if (indirect) { params["indirect"] = true; } var groupId = this.extractPrincipalIdentifiers(group, this.getId())["principal"]; var uriFunction = function() { return self.getUri() + "/principals/" + groupId + "/members"; }; var chainable = this.getFactory().domainPrincipalMap(this); return this.chainGet(chainable, uriFunction, params); }, ////////////////////////////////////////////////////////////////////////////////////////// // // BULK PERMISSIONS CHECK // ////////////////////////////////////////////////////////////////////////////////////////// /** * Performs a bulk check of permissions against permissioned objects of type principal. * * 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 */ checkPrincipalPermissions: function(checks, callback) { var self = this; var object = { "checks": checks }; var uriFunction = function() { return self.getUri() + "/principals/permissions/check"; }; return this.chainPostResponse(this, uriFunction, {}, object).then(function(response) { callback.call(this, response["results"]); }); } }); })(window);