/** * @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';/** * Project encapsulates the functionality to create, query, and modify cards and columns. */class Project extends Requestable { /** * Create a Project. * @param {string} id - the id of the project * @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, 'inertia-preview'); this.__id = id; } /** * Get information about a project * @see https://developer.github.com/v3/projects/#get-a-project * @param {Requestable.callback} cb - will receive the project information * @return {Promise} - the promise for the http request */ getProject(cb) { return this._request('GET', `/projects/${this.__id}`, null, cb); } /** * Edit a project * @see https://developer.github.com/v3/projects/#update-a-project * @param {Object} options - the description of the project * @param {Requestable.callback} cb - will receive the modified project * @return {Promise} - the promise for the http request */ updateProject(options, cb) { return this._request('PATCH', `/projects/${this.__id}`, options, cb); } /** * Delete a project * @see https://developer.github.com/v3/projects/#delete-a-project * @param {Requestable.callback} cb - will receive true if the operation is successful * @return {Promise} - the promise for the http request */ deleteProject(cb) { return this._request('DELETE', `/projects/${this.__id}`, null, cb); } /** * Get information about all columns of a project * @see https://developer.github.com/v3/projects/columns/#list-project-columns * @param {Requestable.callback} [cb] - will receive the list of columns * @return {Promise} - the promise for the http request */ listProjectColumns(cb) { return this._requestAllPages(`/projects/${this.__id}/columns`, null, cb); } /** * Get information about a column * @see https://developer.github.com/v3/projects/columns/#get-a-project-column * @param {string} colId - the id of the column * @param {Requestable.callback} cb - will receive the column information * @return {Promise} - the promise for the http request */ getProjectColumn(colId, cb) { return this._request('GET', `/projects/columns/${colId}`, null, cb); } /** * Create a new column * @see https://developer.github.com/v3/projects/columns/#create-a-project-column * @param {Object} options - the description of the column * @param {Requestable.callback} cb - will receive the newly created column * @return {Promise} - the promise for the http request */ createProjectColumn(options, cb) { return this._request('POST', `/projects/${this.__id}/columns`, options, cb); } /** * Edit a column * @see https://developer.github.com/v3/projects/columns/#update-a-project-column * @param {string} colId - the column id * @param {Object} options - the description of the column * @param {Requestable.callback} cb - will receive the modified column * @return {Promise} - the promise for the http request */ updateProjectColumn(colId, options, cb) { return this._request('PATCH', `/projects/columns/${colId}`, options, cb); } /** * Delete a column * @see https://developer.github.com/v3/projects/columns/#delete-a-project-column * @param {string} colId - the column to be deleted * @param {Requestable.callback} cb - will receive true if the operation is successful * @return {Promise} - the promise for the http request */ deleteProjectColumn(colId, cb) { return this._request('DELETE', `/projects/columns/${colId}`, null, cb); } /** * Move a column * @see https://developer.github.com/v3/projects/columns/#move-a-project-column * @param {string} colId - the column to be moved * @param {string} position - can be one of first, last, or after:<column-id>, * where <column-id> is the id value of a column in the same project. * @param {Requestable.callback} cb - will receive true if the operation is successful * @return {Promise} - the promise for the http request */ moveProjectColumn(colId, position, cb) { return this._request( 'POST', `/projects/columns/${colId}/moves`, {position: position}, cb ); } /** * Get information about all cards of a project * @see https://developer.github.com/v3/projects/cards/#list-project-cards * @param {Requestable.callback} [cb] - will receive the list of cards * @return {Promise} - the promise for the http request */ listProjectCards(cb) { return this.listProjectColumns() .then(({data}) => { return Promise.all(data.map((column) => { return this._requestAllPages(`/projects/columns/${column.id}/cards`, null); })); }).then((cardsInColumns) => { const cards = cardsInColumns.reduce((prev, {data}) => { prev.push(...data); return prev; }, []); if (cb) { cb(null, cards); } return cards; }).catch((err) => { if (cb) { cb(err); return; } throw err; }); } /** * Get information about all cards of a column * @see https://developer.github.com/v3/projects/cards/#list-project-cards * @param {string} colId - the id of the column * @param {Requestable.callback} [cb] - will receive the list of cards * @return {Promise} - the promise for the http request */ listColumnCards(colId, cb) { return this._requestAllPages(`/projects/columns/${colId}/cards`, null, cb); } /** * Get information about a card * @see https://developer.github.com/v3/projects/cards/#get-a-project-card * @param {string} cardId - the id of the card * @param {Requestable.callback} cb - will receive the card information * @return {Promise} - the promise for the http request */ getProjectCard(cardId, cb) { return this._request('GET', `/projects/columns/cards/${cardId}`, null, cb); } /** * Create a new card * @see https://developer.github.com/v3/projects/cards/#create-a-project-card * @param {string} colId - the column id * @param {Object} options - the description of the card * @param {Requestable.callback} cb - will receive the newly created card * @return {Promise} - the promise for the http request */ createProjectCard(colId, options, cb) { return this._request('POST', `/projects/columns/${colId}/cards`, options, cb); } /** * Edit a card * @see https://developer.github.com/v3/projects/cards/#update-a-project-card * @param {string} cardId - the card id * @param {Object} options - the description of the card * @param {Requestable.callback} cb - will receive the modified card * @return {Promise} - the promise for the http request */ updateProjectCard(cardId, options, cb) { return this._request('PATCH', `/projects/columns/cards/${cardId}`, options, cb); } /** * Delete a card * @see https://developer.github.com/v3/projects/cards/#delete-a-project-card * @param {string} cardId - the card to be deleted * @param {Requestable.callback} cb - will receive true if the operation is successful * @return {Promise} - the promise for the http request */ deleteProjectCard(cardId, cb) { return this._request('DELETE', `/projects/columns/cards/${cardId}`, null, cb); } /** * Move a card * @see https://developer.github.com/v3/projects/cards/#move-a-project-card * @param {string} cardId - the card to be moved * @param {string} position - can be one of top, bottom, or after:<card-id>, * where <card-id> is the id value of a card in the same project. * @param {string} colId - the id value of a column in the same project. * @param {Requestable.callback} cb - will receive true if the operation is successful * @return {Promise} - the promise for the http request */ moveProjectCard(cardId, position, colId, cb) { return this._request( 'POST', `/projects/columns/cards/${cardId}/moves`, {position: position, column_id: colId}, // eslint-disable-line camelcase cb ); }}module.exports = Project;