(function(window)
{
var Gitana = window.Gitana;
Gitana.DataStore = Gitana.AbstractObject.extend(
/** @lends Gitana.DataStore.prototype */
{
/**
* @constructs
* @augments Gitana.AbstractObject
*
* @class DataStore
*
* @param {Gitana} driver
* @param [Object] object json object (if no callback required for populating)
*/
constructor: function(driver, object)
{
this.base(driver, object);
},
/**
* @abstract
*/
getUri: function()
{
return null;
},
/**
* @abstract
*/
getType: function()
{
return null;
},
/**
* @abstract
*
* @returns {String} a string denoting a reference to this datastore
*/
ref: function()
{
return this.getType() + "://" + this.getId();
},
//////////////////////////////////////////////////////////////////////////////////////////
//
// ACL METHODS
//
//////////////////////////////////////////////////////////////////////////////////////////
/**
* Retrieve full ACL and pass into chaining method.
*
* @chained this
*
* @param callback
*/
loadACL: function(callback)
{
var uriFunction = function()
{
return this.getUri() + "/acl/list";
};
return this.chainGetResponse(this, uriFunction).then(function(response) {
callback.call(this, response);
});
},
/**
* Retrieve list of authorities and pass into chaining method.
*
* @chained this
*
* @param {Gitana.Principal|String} principal the principal or the principal id
* @param callback
*/
listAuthorities: function(principal, callback)
{
var principalDomainQualifiedId = this.extractPrincipalDomainQualifiedId(principal);
var uriFunction = function()
{
return this.getUri() + "/acl?id=" + principalDomainQualifiedId;
};
return this.chainGetResponseRows(this, uriFunction).then(function(response) {
callback.call(this, response);
});
},
/**
* Checks whether the given principal has a granted authority for this object.
* This passes the result (true/false) to the chaining function.
*
* @chained this
*
* @param {Gitana.Principal|String} principal the principal or the principal id
* @param {String} authorityId the id of the authority
* @param callback
*/
checkAuthority: function(principal, authorityId, callback)
{
var principalDomainQualifiedId = this.extractPrincipalDomainQualifiedId(principal);
var uriFunction = function()
{
return this.getUri() + "/authorities/" + authorityId + "/check?id=" + principalDomainQualifiedId;
};
return this.chainPostResponse(this, uriFunction).then(function(response) {
callback.call(this, response["check"]);
});
},
/**
* Grants an authority to a principal against this object.
*
* @chained this
*
* @param {Gitana.Principal|String} principal the principal or the principal id
* @param {String} authorityId the id of the authority
*/
grantAuthority: function(principal, authorityId)
{
var principalDomainQualifiedId = this.extractPrincipalDomainQualifiedId(principal);
var uriFunction = function()
{
return this.getUri() + "/authorities/" + authorityId + "/grant?id=" + principalDomainQualifiedId;
};
return this.chainPostEmpty(null, uriFunction);
},
/**
* Revokes an authority from a principal against this object.
*
* @chained this
*
* @param {Gitana.Principal|String} principal the principal or the principal id
* @param {String} authorityId the id of the authority
*/
revokeAuthority: function(principal, authorityId)
{
var principalDomainQualifiedId = this.extractPrincipalDomainQualifiedId(principal);
var uriFunction = function()
{
return this.getUri() + "/authorities/" + authorityId + "/revoke?id=" + principalDomainQualifiedId;
};
return this.chainPostEmpty(null, uriFunction);
},
/**
* Revokes all authorities for a principal against the server.
*
* @chained server
*
* @param {Gitana.Principal|String} principal the principal or the principal id
*/
revokeAllAuthorities: function(principal)
{
return this.revokeAuthority(principal, "all");
},
/**
* Loads the authority grants for a given set of principals.
*
* @chained repository
*
* @param callback
*/
loadAuthorityGrants: function(principalIds, callback)
{
if (!principalIds)
{
principalIds = [];
}
var json = {
"principals": principalIds
};
return this.chainPostResponse(this, this.getUri() + "/authorities", {}, json).then(function(response) {
callback.call(this, response);
});
},
/**
* Checks whether the given principal has a permission against this object.
* This passes the result (true/false) to the chaining function.
*
* @chained this
*
* @param {Gitana.Principal|String} principal the principal or the principal id
* @param {String} permissionId the id of the permission
* @param callback
*/
checkPermission: function(principal, permissionId, callback)
{
var principalDomainQualifiedId = this.extractPrincipalDomainQualifiedId(principal);
var uriFunction = function()
{
return this.getUri() + "/permissions/" + permissionId + "/check?id=" + principalDomainQualifiedId;
};
return this.chainPostResponse(this, uriFunction).then(function(response) {
callback.call(this, response["check"]);
});
},
//////////////////////////////////////////////////////////////////////////////////////////
//
// END OF ACL METHODS
//
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
//
// TEAMABLE
//
//////////////////////////////////////////////////////////////////////////////////////////
/**
* Reads a team.
*
* @param teamKey
*
* @chainable team
*/
readTeam: function(teamKey)
{
var uriFunction = function()
{
return this.getUri() + "/teams/" + teamKey;
};
var chainable = this.getFactory().team(this.getPlatform(), this);
return this.chainGet(chainable, uriFunction);
},
/**
* Lists teams.
*
* @chainable map of teams
*/
listTeams: function()
{
var uriFunction = function()
{
return this.getUri() + "/teams";
};
var chainable = this.getFactory().teamMap(this.getCluster(), this);
return this.chainGet(chainable, uriFunction);
},
/**
* Creates a team.
*
* @param teamKey
* @param object
*
* @chainable team
*/
createTeam: function(teamKey, object)
{
if (!object)
{
object = {};
}
var uriFunction = function()
{
return this.getUri() + "/teams?key=" + teamKey;
};
var self = this;
var chainable = this.getFactory().team(this.getPlatform(), this);
return this.chainPostResponse(chainable, uriFunction, {}, object).then(function() {
var chain = this;
Chain(self).readTeam(teamKey).then(function() {
chain.handleResponse(this);
chain.next();
});
// we manually advance the chain
return false;
});
},
/**
* Gets the owners team
*
* @chained team
*/
readOwnersTeam: function()
{
return this.readTeam("owners");
},
//////////////////////////////////////////////////////////////////////////////////////////
//
// END OF TEAMABLE
//
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
//
// ACTIVITIES
//
//////////////////////////////////////////////////////////////////////////////////////////
/**
* Lists activities.
*
* @chained activity map
*
* @param [Object] pagination pagination (optional)
*/
listActivities: function(pagination)
{
// prepare params (with pagination)
var params = {};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
var chainable = this.getFactory().activityMap(this);
return this.chainGet(chainable, "/activities", params);
},
/**
* Read an activity.
*
* @chained activity
*
* @param {String} activityId the activity id
*/
readActivity: function(activityId)
{
var chainable = this.getFactory().activity(this);
return this.chainGet(chainable, "/activities/" + activityId);
},
/**
* Queries for activities.
*
* @chained activity map
*
* @param {Object} query query.
* @param [Object] pagination pagination (optional)
*/
queryActivities: function(query, pagination)
{
var chainable = this.getFactory().activityMap(this);
// prepare params (with pagination)
var params = {};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
return this.chainPost(chainable, "/activities/query", params, query);
},
//////////////////////////////////////////////////////////////////////////////////////////
//
// ROLE CONTAINER
//
//////////////////////////////////////////////////////////////////////////////////////////
/**
* Reads a role.
*
* @param roleKeyOrId
* @param inherited whether to check inherited role containers
*
* @chainable role
*/
readRole: function(roleKeyOrId, inherited)
{
var params = {};
if (inherited)
{
params.inherited = true;
}
var uriFunction = function()
{
return this.getUri() + "/roles/" + roleKeyOrId;
};
var chainable = this.getFactory().role(this.getCluster(), this);
return this.chainGet(chainable, uriFunction, params);
},
/**
* Lists roles.
*
* @param inherited whether to draw from inherited role containers
*
* @chainable map of teams
*/
listRoles: function(inherited)
{
var params = {};
if (inherited)
{
params.inherited = true;
}
var uriFunction = function()
{
return this.getUri() + "/roles";
};
var chainable = this.getFactory().roleMap(this.getCluster(), this);
return this.chainGet(chainable, uriFunction, params);
},
/**
* Creates a role.
*
* @param roleKey
* @param object
*
* @chainable team
*/
createRole: function(roleKey, object)
{
if (!object)
{
object = {};
}
object.roleKey = roleKey;
var uriFunction = function()
{
return this.getUri() + "/roles";
};
var self = this;
var chainable = this.getFactory().role(this.getPlatform(), this, roleKey);
return this.chainPostResponse(chainable, uriFunction, {}, object).then(function() {
this.subchain(self).readRole(roleKey).then(function() {
Gitana.copyInto(chainable, this);
});
});
},
//////////////////////////////////////////////////////////////////////////////////////////
//
// END OF ROLE CONTAINER
//
//////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////////////////////////////////////////////////////////////
//
// COMMON DATA STORE THINGS
//
//////////////////////////////////////////////////////////////////////////////////////////
getMaxSize: function()
{
return this.get("maxSize");
},
getSize: function()
{
return this.get("size");
},
getObjectCount: function()
{
return this.get("objectcount");
}
});
})(window);