forest-cli
Version:
The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.
100 lines • 7.58 kB
JavaScript
const agent = require('superagent');
const Context = require('@forestadmin/context');
const JobStateChecker = require('./job-state-checker');
/**
* Read access to a project's teams.
* Future `forest teams:*` commands (PRD-528/529) should extend this manager
* with write operations rather than re-implementing the HTTP calls.
* @param {{ projectId: number | string }} config
*/
function TeamManager(config) {
const { assertPresent, authenticator, env } = Context.inject();
assertPresent({ authenticator, env });
this.listForProject = async () => {
const authToken = authenticator.getAuthToken();
const response = await agent
.get(`${env.FOREST_SERVER_URL}/api/projects/${config.projectId}/teams`)
.set('Authorization', `Bearer ${authToken}`)
.set('forest-project-id', config.projectId)
.send();
return (response.body.data || []).map(team => ({
id: team.id,
name: team.attributes.name,
}));
};
/**
* Create a new team in the project identified by `config.projectId`.
* @param {string} name
* @returns {Promise<{ id: string, name: string }>}
*/
this.createTeam = async (name) => {
const authToken = authenticator.getAuthToken();
const response = await agent
.post(`${env.FOREST_SERVER_URL}/api/teams`)
.set('Authorization', `Bearer ${authToken}`)
.set('forest-project-id', config.projectId)
.send({
data: {
type: 'teams',
attributes: { name },
relationships: {
project: { data: { id: String(config.projectId), type: 'projects' } },
},
},
});
const { data } = response.body;
if (!data || !data.attributes) {
throw new Error('Unexpected response when creating team: missing data.attributes.');
}
return {
id: data.id,
name: data.attributes.name,
};
};
/**
* Delete a team by its id.
* @param {string|number} teamId
* @returns {Promise<void>}
*/
this.deleteTeam = async (teamId) => {
const authToken = authenticator.getAuthToken();
await agent
.delete(`${env.FOREST_SERVER_URL}/api/teams/${teamId}`)
.set('Authorization', `Bearer ${authToken}`)
.set('forest-project-id', config.projectId)
.send();
};
/**
* Copy the whole layout of one team onto another, within the same project.
* Asynchronous server-side: posts a deployment request, then polls the job
* until completion.
* @param {string|number} fromTeamId
* @param {string|number} toTeamId
* @param {(code: number) => void} oclifExit
* @returns {Promise<boolean>} true when the job completes, false on failure
*/
this.copyLayout = async (fromTeamId, toTeamId, oclifExit) => {
const authToken = authenticator.getAuthToken();
const jobStateChecker = new JobStateChecker('Copying layout', oclifExit);
const response = await agent
.post(`${env.FOREST_SERVER_URL}/api/deployment-requests`)
.set('Authorization', `Bearer ${authToken}`)
.set('forest-project-id', config.projectId)
.send({
data: {
type: 'deployment-requests',
attributes: {
type: 'team',
from: Number(fromTeamId),
to: Number(toTeamId),
},
},
});
const jobId = response.body?.meta?.job_id;
if (!jobId)
return false;
return jobStateChecker.check(jobId);
};
}
module.exports = TeamManager;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidGVhbS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3RlYW0tbWFuYWdlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDcEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFaEQsTUFBTSxlQUFlLEdBQUcsT0FBTyxDQUFDLHFCQUFxQixDQUFDLENBQUM7QUFFdkQ7Ozs7O0dBS0c7QUFDSCxTQUFTLFdBQVcsQ0FBQyxNQUFNO0lBQ3pCLE1BQU0sRUFBRSxhQUFhLEVBQUUsYUFBYSxFQUFFLEdBQUcsRUFBRSxHQUFHLE9BQU8sQ0FBQyxNQUFNLEVBQUUsQ0FBQztJQUMvRCxhQUFhLENBQUMsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLENBQUMsQ0FBQztJQUV0QyxJQUFJLENBQUMsY0FBYyxHQUFHLEtBQUssSUFBSSxFQUFFO1FBQy9CLE1BQU0sU0FBUyxHQUFHLGFBQWEsQ0FBQyxZQUFZLEVBQUUsQ0FBQztRQUUvQyxNQUFNLFFBQVEsR0FBRyxNQUFNLEtBQUs7YUFDekIsR0FBRyxDQUFDLEdBQUcsR0FBRyxDQUFDLGlCQUFpQixpQkFBaUIsTUFBTSxDQUFDLFNBQVMsUUFBUSxDQUFDO2FBQ3RFLEdBQUcsQ0FBQyxlQUFlLEVBQUUsVUFBVSxTQUFTLEVBQUUsQ0FBQzthQUMzQyxHQUFHLENBQUMsbUJBQW1CLEVBQUUsTUFBTSxDQUFDLFNBQVMsQ0FBQzthQUMxQyxJQUFJLEVBQUUsQ0FBQztRQUVWLE9BQU8sQ0FBQyxRQUFRLENBQUMsSUFBSSxDQUFDLElBQUksSUFBSSxFQUFFLENBQUMsQ0FBQyxHQUFHLENBQUMsSUFBSSxDQUFDLEVBQUUsQ0FBQyxDQUFDO1lBQzdDLEVBQUUsRUFBRSxJQUFJLENBQUMsRUFBRTtZQUNYLElBQUksRUFBRSxJQUFJLENBQUMsVUFBVSxDQUFDLElB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