# Source: directory/Identity.js

    (function(window)
    {
        var Gitana = window.Gitana;

        Gitana.Identity = Gitana.AbstractDirectoryObject.extend(
        /** @lends Gitana.Identity.prototype */
        {
            /**
             * @constructs
             * @augments Gitana.AbstractDirectoryObject
             *
             * @class Identity
             *
             * @param {Gitana.Directory} directory
             * @param [Object] object json object (if no callback required for populating)
             */
            constructor: function(directory, object)
            {
                this.base(directory, object);

                this.objectType = function() { return "Gitana.Identity"; };
            },

            /**
             * @OVERRIDE
             */
            getType: function()
            {
                return Gitana.TypedIDConstants.TYPE_IDENTITY;
            },

            /**
             * @OVERRIDE
             */
            getUri: function()
            {
                return "/directories/" + this.getDirectoryId() + "/identities/" + this.getId();
            },

            /**
             * @override
             */
            clone: function()
            {
                return this.getFactory().identity(this.getDirectory(), this);
            },

            /**
             * Changes the password for this identity.
             *
             * @param password
             * @param verifyPassword
             *
             * @chained this
             * @public
             */
            changePassword: function(password, verifyPassword)
            {
                var object = {
                    "password": password,
                    "verifyPassword": verifyPassword
                };

                return this.chainPostEmpty(null, this.getUri() + "/changepassword", {}, object);
            },

            /**
             * Retrieves a list of all of the users on any domain that have this identity applied to them.
             *
             * @param tenantId
             */
            findPolicyUsers: function(tenantId)
            {
                var self = this;

                var uriFunction = function()
                {
                    return self.getUri() + "/policy/users";
                };

                var domain = new Gitana.Domain(this.getPlatform());

                var chainable = this.getFactory().domainPrincipalMap(domain);

                // prepare params
                var params = {};
                if (tenantId)
                {
                    params.tenantId = tenantId;
                }

                return this.chainGet(chainable, uriFunction, params);
            },

            /**
             * Finds the user on a tenant platform that has this identity.
             * If multiple users have this identity, the first one is chosen.
             *
             * @param pagination
             */
            findPolicyUserForTenant: function(tenantId)
            {
                var self = this;

                var uriFunction = function()
                {
                    return self.getUri() + "/policy/user";
                };

                var chainable = this.getFactory().domainPrincipal(this);

                // prepare params (with pagination)
                var params = {};
                params["tenantId"] = tenantId;

                return this.chainGet(chainable, uriFunction, params);
            },

            /**
             * Finds the user on a tenant platform that has this identity.
             * If multiple users have this identity, the first one is chosen.
             *
             * @param pagination
             */
            findPolicyUsersForTenant: function(tenantId)
            {
                var self = this;

                var uriFunction = function()
                {
                    return self.getUri() + "/policy/users";
                };

                var chainable = this.getFactory().domainPrincipalMap(this);

                // prepare params (with pagination)
                var params = {};
                params["tenantId"] = tenantId;

                return this.chainGet(chainable, uriFunction, params);
            },

            /**
             * Retrieves the tenants that this identity participates in.
             * Optionally allows you to filter down to a particular registrar.
             *
             * @chained principal map
             *
             * @param [String] registrarId
             */
            findPolicyTenants: function(registrarId)
            {
                var self = this;

                var uriFunction = function()
                {
                    return self.getUri() + "/policy/tenants";
                };

                var chainable = this.getFactory().tenantMap(this);

                // prepare params
                var params = {};
                if (registrarId)
                {
                    params["registrarId"] = registrarId;
                }

                return this.chainGet(chainable, uriFunction, params);
            }

        });

    })(window);