(function(window)
{
var Gitana = window.Gitana;
Gitana.DomainPrincipal = Gitana.AbstractDomainObject.extend(
/** @lends Gitana.DomainPrincipal.prototype */
{
/**
* @constructs
* @augments Gitana.AbstractDomainObject
*
* @class DomainPrincipal
*
* @param {Gitana.Domain} domain
* @param [Object] object json object (if no callback required for populating)
*/
constructor: function(domain, object)
{
this.base(domain, object);
this.objectType = function() { return "Gitana.DomainPrincipal"; };
},
/**
* @override
*/
getUri: function()
{
return "/domains/" + this.getDomainId() + "/principals/" + this.getId();
},
/**
* @override
*/
clone: function()
{
return this.getFactory().domainPrincipal(this.getDomain(), this);
},
/**
* @override
*/
beforeChainRun: function()
{
// extend the principal with any type specific methods/properties
this.getFactory().extendPrincipal(this);
},
/**
* @returns {String} the principal name
*/
getName: function()
{
return this.get("name");
},
/**
* @returns {String} the principal type ("user" or "group")
*/
getType: function()
{
return this.get("type");
},
/**
* @returns {String} the domain qualified principal name
*/
getDomainQualifiedName: function()
{
return this.getDomainId() + "/" + this.getName();
},
/**
* @returns {String} the domain qualified principal id
*/
getDomainQualifiedId: function()
{
return this.getDomainId() + "/" + this.getId();
},
//////////////////////////////////////////////////////////////////////////////////////////
//
// MEMBERSHIPS
//
//////////////////////////////////////////////////////////////////////////////////////////
/**
* Acquires the groups that contain this principal
*
* @chained principal map
*
* @public
*
* @param {Boolean} indirect whether to consider indirect groups
* @param {Pagination} pagination
*/
listMemberships: function(indirect, pagination)
{
var params = {};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
var uriFunction = function()
{
var uri = this.getUri() + "/memberships";
if (indirect)
{
uri = uri + "?indirect=true";
}
return uri;
};
var chainable = this.getFactory().domainPrincipalMap(this.getDomain());
return this.chainGet(chainable, uriFunction, params);
},
//////////////////////////////////////////////////////////////////////////////////////////
//
// ATTACHMENTS
//
//////////////////////////////////////////////////////////////////////////////////////////
/**
* Hands back an attachments map.
*
* @chained attachment map
*
* @param local
*
* @public
*/
listAttachments: Gitana.Methods.listAttachments(),
/**
* Picks off a single attachment
*
* @chained attachment
*
* @param attachmentId
*/
attachment: function(attachmentId)
{
return this.listAttachments().select(attachmentId);
},
/**
* Creates an attachment.
*
* When using this method from within the JS driver, it really only works for text-based content such
* as JSON or text.
*
* @chained attachment
*
* @param attachmentId (use null or false for default attachment)
* @param contentType
* @param data
*/
attach: Gitana.Methods.attach(),
/**
* Deletes an attachment.
*
* @param attachmentId
*/
unattach: Gitana.Methods.unattach(),
/**
* Generates a URI to a preview resource.
*/
getPreviewUri: Gitana.Methods.getPreviewUri(),
/**
* Lists the authentication grants for this principal
*
* @param pagination
*
* @chained authentication grant map
*/
listAuthenticationGrants: function(pagination)
{
var params = {};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
params.domainId = this.getDomainId();
params.principalId = this.getId();
var chainable = this.getFactory().authenticationGrantMap(this.getPlatform());
return this.chainGet(chainable, "/auth/grants", params);
},
/**
* Lists the teams that this principal belongs to against the given teamable
*
* @param teamable
* @param pagination (optional)
*/
listTeamMemberships: function(teamable, pagination)
{
var params = {
"teamableType": teamable.getType(),
"teamableId": teamable.getId()
};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
var uriFunction = function()
{
return this.getUri() + "/teams";
};
var chainable = this.getFactory().teamMap(this.getCluster(), this);
return this.chainGet(chainable, uriFunction, params);
}
});
})(window);