(function(window)
{
var Gitana = window.Gitana;
Gitana.Repository = Gitana.AbstractPlatformDataStore.extend(
/** @lends Gitana.Repository.prototype */
{
/**
* @constructs
* @augments Gitana.AbstractPlatformDataStore
*
* @class Repository
*
* @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.Repository"; };
},
/**
* @OVERRIDE
*/
getType: function()
{
return Gitana.TypedIDConstants.TYPE_REPOSITORY;
},
/**
* @OVERRIDE
*/
getUri: function()
{
return "/repositories/" + this.getId();
},
/**
* @override
*/
clone: function()
{
return this.getFactory().repository(this.getPlatform(), this);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// BRANCHES
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* List the branches.
*
* @chained branch map
*
* @public
*
* @param [Object] pagination
*/
listBranches: function(pagination)
{
var params = {};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/branches";
};
var chainable = this.getFactory().branchMap(this);
return this.chainGet(chainable, uriFunction, params);
},
/**
* Reads a branch.
*
* @chained branch
*
* @public
*
* @param {String} branchId the branch id
*/
readBranch: function(branchId)
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/branches/" + branchId;
};
var chainable = this.getFactory().branch(this);
return this.chainGet(chainable, uriFunction);
},
/**
* Creates a branch.
*
* @chained branch
*
* @public
*
* @param {String} branchId identifies the branch from which the new branch will be forked.
* @param {String} changesetId identifies the changeset on the branch which serves as the root changeset that
* the new branch will be founded upon.
* @param [Object] object JSON object for the branch
*/
createBranch: function(branchId, changesetId, object)
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/branches";
};
var createParams = {
"branch": branchId,
"changeset": changesetId
};
var chainable = this.getFactory().branch(this);
return this.chainCreate(chainable, object, uriFunction, createParams);
},
/**
* Queries for branches.
*
* Config should be:
*
* {
* Gitana query configs
* }
*
* @public
*
* @param {Object} query
* @param [Object] pagination
*/
queryBranches: function(query, pagination)
{
var params = {};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/branches/query";
};
var chainable = this.getFactory().branchMap(this);
return this.chainPost(chainable, uriFunction, params, query);
},
/**
* Performs a bulk check of permissions against permissioned objects of type branch.
*
* 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
*/
checkBranchPermissions: function(checks, callback)
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/branches/permissions/check";
};
var object = {
"checks": checks
};
return this.chainPostResponse(this, uriFunction, {}, object).then(function(response) {
callback.call(this, response["results"]);
});
},
/**
* List the changesets in this repository.
*
* @chained
*
* @public
*/
listChangesets: function()
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/changesets";
};
var chainable = this.getFactory().changesetMap(this);
return this.chainGet(chainable, uriFunction);
},
/**
* Read a changeset.
*
* @chained
*
* @public
*
* @param {String} changesetId the id of the changeset
*/
readChangeset: function(changesetId)
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/changesets/" + changesetId;
};
var chainable = this.getFactory().changeset(this);
return this.chainGet(chainable, uriFunction);
},
/**
* Acquires a list of the parent changesets for a given changeset.
*
* @chained
*
* @public
*
* @param {String} changesetId the id of the changeset
*/
listChangesetParents: function(changesetId)
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/changesets/" + changesetId + "/parents";
};
var chainable = this.getFactory().changesetMap(this);
return this.chainGet(chainable, uriFunction);
},
/**
* Acquires a list of the child changesets for a given changeset.
*
* @chained
*
* @public
*
* @param {String} changesetId the id of the changeset
*/
listChangesetChildren: function(changesetId)
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/changesets/" + changesetId + "/children";
};
var chainable = this.getFactory().changesetMap(this);
return this.chainGet(chainable, uriFunction);
},
/**
* Queries for changesets.
*
* Config should be:
*
* {
* Gitana query configs
* }
*
* @public
*
* @param {Object} query
* @param [Object] pagination
*/
queryChangesets: function(query, pagination)
{
var params = {};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/changesets/query";
};
var chainable = this.getFactory().changesetMap(this);
return this.chainPost(chainable, uriFunction, params, query);
},
//////////////////////////////////////////////////////////////////////////////////////////////////////////
//
// RELEASES
//
//////////////////////////////////////////////////////////////////////////////////////////////////////////
/**
* List the releases.
*
* @chained release map
*
* @public
*
* @param [Object] pagination
*/
listReleases: function(pagination)
{
var params = {};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/releases";
};
var chainable = this.getFactory().releaseMap(this);
return this.chainGet(chainable, uriFunction, params);
},
/**
* Reads a release.
*
* @chained release
*
* @public
*
* @param {String} releaseId the release id
*/
readRelease: function(releaseId)
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/releases/" + releaseId;
};
var chainable = this.getFactory().release(this);
return this.chainGet(chainable, uriFunction);
},
/**
* Creates a release.
*
* @chained release
*
* @public
*
* @param {String} data release data
* @param [Object] object JSON object for the branch
*/
createRelease: function(object)
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/releases";
};
var chainable = this.getFactory().release(this);
return this.chainCreate(chainable, object, uriFunction);
},
/**
* Queries for releases.
*
* Config should be:
*
* {
* Gitana query configs
* }
*
* @public
*
* @param {Object} query
* @param [Object] pagination
*/
queryReleases: function(query, pagination)
{
var params = {};
if (pagination)
{
Gitana.copyInto(params, pagination);
}
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/releases/query";
};
var chainable = this.getFactory().releaseMap(this);
return this.chainPost(chainable, uriFunction, params, query);
},
/**
* Performs a bulk check of permissions against permissioned objects of type release.
*
* 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
*/
checkReleasePermissions: function(checks, callback)
{
var uriFunction = function()
{
return "/repositories/" + this.getId() + "/releases/permissions/check";
};
var object = {
"checks": checks
};
return this.chainPostResponse(this, uriFunction, {}, object).then(function(response) {
callback.call(this, response["results"]);
});
},
//////////////////////////////////////////////////////////////////////////////////////////
//
// MERGE CONFLICTS
//
//////////////////////////////////////////////////////////////////////////////////////////
/**
* Retrieves any matching merge conflicts
*
* @param query
* @param callback
* @returns {*}
*/
loadMergeConflicts: function(query, callback)
{
var self = this;
var uriFunction = function()
{
return self.getUri() + "/mergeconflicts/query";
};
return this.chainPostResponse(this, uriFunction, {}, query).then(function(response) {
callback(response);
});
},
resolveMergeConflict: function(mergeConflictId, resolution, callback)
{
var self = this;
var uriFunction = function()
{
return self.getUri() + "/mergeconflicts/" + mergeConflictId + "/resolve";
};
var params = {
"resolution": resolution
};
return this.chainPostResponse(this, uriFunction, params).then(function(response) {
callback(response);
});
},
//////////////////////////////////////////////////////////////////////////////////////////
//
// ACCESSORS
//
//////////////////////////////////////////////////////////////////////////////////////////
getMaxSize: function()
{
return this.get("maxSize");
},
getSize: function()
{
return this.get("size");
},
getObjectCount: function()
{
return this.get("objectcount");
}
});
})(window);