/**
* @file
* @copyright 2013 Michael Aufreiter (Development Seed) and 2016 Yahoo Inc.
* @license Licensed under {@link https://spdx.org/licenses/BSD-3-Clause-Clear.html BSD-3-Clause-Clear}.
* Github.js is freely distributable.
*/
import Requestable from './Requestable';
/**
* A Gist can retrieve and modify gists.
*/
class Gist extends Requestable {
/**
* Create a Gist.
* @param {string} id - the id of the gist (not required when creating a gist)
* @param {Requestable.auth} [auth] - information required to authenticate to Github
* @param {string} [apiBase=https://api.github.com] - the base Github API URL
*/
constructor(id, auth, apiBase) {
super(auth, apiBase);
this.__id = id;
}
/**
* Fetch a gist.
* @see https://developer.github.com/v3/gists/#get-a-single-gist
* @param {Requestable.callback} [cb] - will receive the gist
* @return {Promise} - the Promise for the http request
*/
read(cb) {
return this._request('GET', `/gists/${this.__id}`, null, cb);
}
/**
* Create a new gist.
* @see https://developer.github.com/v3/gists/#create-a-gist
* @param {Object} gist - the data for the new gist
* @param {Requestable.callback} [cb] - will receive the new gist upon creation
* @return {Promise} - the Promise for the http request
*/
create(gist, cb) {
return this._request('POST', '/gists', gist, cb)
.then((response) => {
this.__id = response.data.id;
return response;
});
}
/**
* Delete a gist.
* @see https://developer.github.com/v3/gists/#delete-a-gist
* @param {Requestable.callback} [cb] - will receive true if the request succeeds
* @return {Promise} - the Promise for the http request
*/
delete(cb) {
return this._request('DELETE', `/gists/${this.__id}`, null, cb);
}
/**
* Fork a gist.
* @see https://developer.github.com/v3/gists/#fork-a-gist
* @param {Requestable.callback} [cb] - the function that will receive the gist
* @return {Promise} - the Promise for the http request
*/
fork(cb) {
return this._request('POST', `/gists/${this.__id}/forks`, null, cb);
}
/**
* Update a gist.
* @see https://developer.github.com/v3/gists/#edit-a-gist
* @param {Object} gist - the new data for the gist
* @param {Requestable.callback} [cb] - the function that receives the API result
* @return {Promise} - the Promise for the http request
*/
update(gist, cb) {
return this._request('PATCH', `/gists/${this.__id}`, gist, cb);
}
/**
* Star a gist.
* @see https://developer.github.com/v3/gists/#star-a-gist
* @param {Requestable.callback} [cb] - will receive true if the request is successful
* @return {Promise} - the Promise for the http request
*/
star(cb) {
return this._request('PUT', `/gists/${this.__id}/star`, null, cb);
}
/**
* Unstar a gist.
* @see https://developer.github.com/v3/gists/#unstar-a-gist
* @param {Requestable.callback} [cb] - will receive true if the request is successful
* @return {Promise} - the Promise for the http request
*/
unstar(cb) {
return this._request('DELETE', `/gists/${this.__id}/star`, null, cb);
}
/**
* Check if a gist is starred by the user.
* @see https://developer.github.com/v3/gists/#check-if-a-gist-is-starred
* @param {Requestable.callback} [cb] - will receive true if the gist is starred and false if the gist is not starred
* @return {Promise} - the Promise for the http request
*/
isStarred(cb) {
return this._request204or404(`/gists/${this.__id}/star`, null, cb);
}
/**
* List the gist's commits
* @see https://developer.github.com/v3/gists/#list-gist-commits
* @param {Requestable.callback} [cb] - will receive the array of commits
* @return {Promise} - the Promise for the http request
*/
listCommits(cb) {
return this._requestAllPages(`/gists/${this.__id}/commits`, null, cb);
}
/**
* Fetch one of the gist's revision.
* @see https://developer.github.com/v3/gists/#get-a-specific-revision-of-a-gist
* @param {string} revision - the id of the revision
* @param {Requestable.callback} [cb] - will receive the revision
* @return {Promise} - the Promise for the http request
*/
getRevision(revision, cb) {
return this._request('GET', `/gists/${this.__id}/${revision}`, null, cb);
}
/**
* List the gist's comments
* @see https://developer.github.com/v3/gists/comments/#list-comments-on-a-gist
* @param {Requestable.callback} [cb] - will receive the array of comments
* @return {Promise} - the promise for the http request
*/
listComments(cb) {
return this._requestAllPages(`/gists/${this.__id}/comments`, null, cb);
}
/**
* Fetch one of the gist's comments
* @see https://developer.github.com/v3/gists/comments/#get-a-single-comment
* @param {number} comment - the id of the comment
* @param {Requestable.callback} [cb] - will receive the comment
* @return {Promise} - the Promise for the http request
*/
getComment(comment, cb) {
return this._request('GET', `/gists/${this.__id}/comments/${comment}`, null, cb);
}
/**
* Comment on a gist
* @see https://developer.github.com/v3/gists/comments/#create-a-comment
* @param {string} comment - the comment to add
* @param {Requestable.callback} [cb] - the function that receives the API result
* @return {Promise} - the Promise for the http request
*/
createComment(comment, cb) {
return this._request('POST', `/gists/${this.__id}/comments`, {body: comment}, cb);
}
/**
* Edit a comment on the gist
* @see https://developer.github.com/v3/gists/comments/#edit-a-comment
* @param {number} comment - the id of the comment
* @param {string} body - the new comment
* @param {Requestable.callback} [cb] - will receive the modified comment
* @return {Promise} - the promise for the http request
*/
editComment(comment, body, cb) {
return this._request('PATCH', `/gists/${this.__id}/comments/${comment}`, {body: body}, cb);
}
/**
* Delete a comment on the gist.
* @see https://developer.github.com/v3/gists/comments/#delete-a-comment
* @param {number} comment - the id of the comment
* @param {Requestable.callback} [cb] - will receive true if the request succeeds
* @return {Promise} - the Promise for the http request
*/
deleteComment(comment, cb) {
return this._request('DELETE', `/gists/${this.__id}/comments/${comment}`, null, cb);
}
}
module.exports = Gist;