buddyworks-cli
Version:
Command line tool for managing pipelines in Buddy Works
232 lines (228 loc) • 6.64 kB
JavaScript
const config = require('./config');
const request = require('request');
function Client() {
/**
* @param {string} method
* @param {string} url
* @param {object} query
* @param {object} args
* @param {object} params
* @param {function} done
*/
const req = (method, url, query, args, params, done) => {
config.mergeOptions(args);
const token = config.get(config.KEY_TOKEN);
const baseUrl = config.get(config.KEY_URL);
const workspace = config.get(config.KEY_WORKSPACE);
const project = config.get(config.KEY_PROJECT);
const pipeline = config.get(config.KEY_PIPELINE);
let path = url;
if (!token) {
done(new Error('No valid token provided'));
return;
}
if (/:workspace/.test(url)) {
if (!workspace) {
done(new Error('No workspace provided'));
return;
}
path = path.replace(/:workspace/g, workspace);
}
if (/:project/.test(url)) {
if (!project) {
done(new Error('No project provided'));
return;
}
path = path.replace(/:project/g, project);
}
if (/:pipeline/.test(url)) {
if (!pipeline) {
done(new Error('No pipeline provided'));
return;
}
path = path.replace(/:pipeline/g, pipeline);
}
const queryKeys = Object.keys(query);
if (queryKeys.length > 0) {
path += '?';
queryKeys.forEach((name) => {
if (!/\?$/.test(path)) path += '&';
path += `${name}=${query[name]}`;
});
}
request({
url: `https://${baseUrl}${path}`,
method,
headers: {
Authorization: `Bearer ${token}`,
},
body: params,
json: true,
strictSSL: false,
}, (err, resp, body) => {
if (err) {
done(err);
} else if (body !== Object(body)) {
done(new Error('Wrong response. Do you use valid api endpoint?'));
} else if (body && body.errors && body.errors.length > 0) {
done(new Error(body.errors[0].message));
} else {
done(null, body);
}
});
};
/**
* @param {string} url
* @param {object} query
* @param {object} args
* @param {function} done
*/
this.get = (url, query, args, done) => {
req('GET', url, query, args, null, done);
};
/**
* @param {string} url
* @param {object} query
* @param {object} args
* @param {object} params
* @param {function} done
*/
this.patch = (url, query, args, params, done) => {
req('PATCH', url, query, args, params, done);
};
/**
* @param {string} url
* @param {object} query
* @param {object} args
* @param {object} params
* @param {function} done
*/
this.post = (url, query, args, params, done) => {
req('POST', url, query, args, params, done);
};
}
function Api() {
const client = new Client();
/**
* @type {number}
*/
this.perPage = 20;
/**
* @param {Object} args
* @param {Function} done
*/
this.getWorkspaces = (args, done) => client.get('/workspaces', {}, args, done);
/**
* @param {function} done
*/
this.getWorkspace = (args, done) => client.get('/workspaces/:workspace', {}, args, done);
/**
* @param {object} args
* @param {function} done
*/
this.getProjects = (args, done) => {
const query = {
per_page: this.perPage,
sort_by: 'name',
sort_direction: 'ASC',
};
if (!args.page) query.page = 1;
else query.page = args.page;
if (args.mine) query.membership = 'true';
if (args.status !== 'ANY') query.status = args.status;
client.get('/workspaces/:workspace/projects', query, args, done);
};
/**
* @param {object} args
* @param {function} done
*/
this.getProject = (args, done) => client.get('/workspaces/:workspace/projects/:project', {}, args, done);
/**
* @param {object} args
* @param {function} done
*/
this.getPipelines = (args, done) => {
const query = {
per_page: this.perPage,
sort_by: 'name',
sort_direction: 'ASC',
};
if (!args.page) query.page = 1;
else query.page = args.page;
client.get('/workspaces/:workspace/projects/:project/pipelines', query, args, done);
};
/**
* @param {object} args
* @param {function} done
*/
this.getPipeline = (args, done) => client.get('/workspaces/:workspace/projects/:project/pipelines/:pipeline', {}, args, done);
/**
* @param {object} args
* @param {function} done
*/
this.runPipeline = (args, done) => {
const params = {};
if (args.tag) {
params.tag = {
name: args.tag,
};
} else if (args.branch) {
params.branch = {
name: args.branch,
};
} else if (args.revision) {
params.to_revision = {
revision: args.revision,
};
} else {
params.to_revision = {
revision: 'HEAD',
};
}
if (args.comment) params.comment = args.comment;
if (args.refresh) params.refresh = true;
client.post('/workspaces/:workspace/projects/:project/pipelines/:pipeline/executions', {}, args, params, done);
};
/**
* @param {object} args
* @param {function} done
*/
this.getLastExecution = (args, done) => client.get('/workspaces/:workspace/projects/:project/pipelines/:pipeline/executions', {
page: 1,
per_page: 1,
}, args, (err, obj) => {
if (err) done(err);
else if (!obj.executions.length) done();
else done(null, obj.executions[0]);
});
/**
* @param {object} args
* @param {function} done
*/
this.getExecution = (args, done) => client.get(`/workspaces/:workspace/projects/:project/pipelines/:pipeline/executions/${args.execution}`, {}, args, done);
/**
* @param {string} executionId
* @param {object} args
* @param {function} done
*/
this.cancelPipeline = (executionId, args, done) => client.patch(`/workspaces/:workspace/projects/:project/pipelines/:pipeline/executions/${executionId}`, {}, args, { operation: 'CANCEL' }, done);
/**
* @param {string} executionId
* @param {object} args
* @param {function} done
*/
this.retryPipeline = (executionId, args, done) => client.patch(`/workspaces/:workspace/projects/:project/pipelines/:pipeline/executions/${executionId}`, {}, args, { operation: 'RETRY' }, done);
/**
* @param {object} args
* @param {function} done
*/
this.getExecutions = (args, done) => {
const query = {
per_page: this.perPage,
};
if (!args.page) query.page = 1;
else query.page = args.page;
client.get('/workspaces/:workspace/projects/:project/pipelines/:pipeline/executions', {}, args, done);
};
}
module.exports = new Api();