forest-cli
Version:
The Lumberjacks' toolbelt is the Forest CLI which makes easy to manage your back office application directly from the terminal.
105 lines • 8.18 kB
JavaScript
const agent = require('superagent');
const Context = require('@forestadmin/context');
/**
* Read/write access to a project's roles.
* PRD-528/535: extended with write operations for `forest roles:*` commands.
* @param {{ projectId: number | string }} config
*/
function RoleManager(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}/roles`)
.set('Authorization', `Bearer ${authToken}`)
.set('forest-project-id', config.projectId)
.send();
return (response.body.data || []).map(role => ({
id: role.id,
name: role.attributes.name,
}));
};
/**
* Fetch a single role with its full permissions object.
* @param {string|number} roleId
* @returns {Promise<{ id: string, name: string, permissions: object }>}
*/
this.getRoleById = async (roleId) => {
const authToken = authenticator.getAuthToken();
const response = await agent
.get(`${env.FOREST_SERVER_URL}/api/roles/${roleId}`)
.set('Authorization', `Bearer ${authToken}`)
.set('forest-project-id', config.projectId)
.send();
const { data } = response.body;
if (!data || !data.attributes) {
throw new Error(`Unexpected response for role ${roleId}: missing data.attributes.`);
}
return {
id: data.id,
name: data.attributes.name,
permissions: data.attributes.permissions || {},
};
};
/**
* Create a new role in the project.
* @param {string} name
* @param {string|number} projectId
* @returns {Promise<{ id: string, name: string }>}
*/
this.createRole = async (name, projectId) => {
const authToken = authenticator.getAuthToken();
const response = await agent
.post(`${env.FOREST_SERVER_URL}/api/roles`)
.set('Authorization', `Bearer ${authToken}`)
.set('forest-project-id', config.projectId)
.send({
data: {
type: 'roles',
attributes: {
name,
initialize_permissions_from: { roleId: null, everythingAllowed: false },
},
relationships: {
project: { data: { id: String(projectId), type: 'projects' } },
},
},
});
const { data } = response.body;
return {
id: data.id,
name: data.attributes.name,
};
};
/**
* Apply RFC-6902 JSON Patch ops to a role's permissions.
* @param {string|number} roleId
* @param {Array<{ op: string, path: string, value: unknown }>} ops
* @returns {Promise<void>}
*/
this.patchPermissions = async (roleId, ops) => {
const authToken = authenticator.getAuthToken();
await agent
.patch(`${env.FOREST_SERVER_URL}/api/roles/${roleId}/permissions`)
.set('Authorization', `Bearer ${authToken}`)
.set('forest-project-id', config.projectId)
.send(ops);
};
/**
* Copy all permissions from one environment to another within the project.
* @param {string|number} fromEnvId
* @param {string|number} toEnvId
* @returns {Promise<void>}
*/
this.copyPermissions = async (fromEnvId, toEnvId) => {
const authToken = authenticator.getAuthToken();
await agent
.post(`${env.FOREST_SERVER_URL}/api/projects/${config.projectId}/roles/copy-permissions`)
.set('Authorization', `Bearer ${authToken}`)
.set('forest-project-id', config.projectId)
.send({ from: String(fromEnvId), to: String(toEnvId) });
};
}
module.exports = RoleManager;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoicm9sZS1tYW5hZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vc3JjL3NlcnZpY2VzL3JvbGUtbWFuYWdlci5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxNQUFNLEtBQUssR0FBRyxPQUFPLENBQUMsWUFBWSxDQUFDLENBQUM7QUFDcEMsTUFBTSxPQUFPLEdBQUcsT0FBTyxDQUFDLHNCQUFzQixDQUFDLENBQUM7QUFFaEQ7Ozs7R0FJRztBQUNILFNBQVMsV0FBVyxDQUFDLE1BQU07SUFDekIsTUFBTSxFQUFFLGFBQWEsRUFBRSxhQUFhLEVBQUUsR0FBRyxFQUFFLEdBQUcsT0FBTyxDQUFDLE1BQU0sRUFBRSxDQUFDO0lBQy9ELGFBQWEsQ0FBQyxFQUFFLGFBQWEsRUFBRSxHQUFHLEVBQUUsQ0FBQyxDQUFDO0lBRXRDLElBQUksQ0FBQyxjQUFjLEdBQUcsS0FBSyxJQUFJLEVBQUU7UUFDL0IsTUFBTSxTQUFTLEdBQUcsYUFBYSxDQUFDLFlBQVksRUFBRSxDQUFDO1FBRS9DLE1BQU0sUUFBUSxHQUFHLE1BQU0sS0FBSzthQUN6QixHQUFHLENBQUMsR0FBRyxHQUFHLENBQUMsaUJBQWlCLGlCQUFpQixNQUFNLENBQUMsU0FBUyxRQUFRLENBQUM7YUFDdEUsR0FBRyxDQUFDLGVBQWUsRUFBRSxVQUFVLFNBQVMsRUFBRSxDQUFDO2FBQzNDLEdBQUcsQ0FBQyxtQkFBbUIsRUFBRSxNQUFNLENBQUMsU0FBUyxDQUFDO2FBQzFDLElBQUksRUFBRSxDQUFDO1FBRVYsT0FBTyxDQUFDLFFBQVEsQ0FBQyxJQUFJLENBQUMsSUFBSSxJQUFJLEVBQUUsQ0FBQyxDQUFDLEdBQUcsQ0FBQyxJQUFJLENBQUMsRUFBRSxDQUFDLENBQUM7WUFDN0MsRUFBRSxFQUFFLElBQUksQ0FBQyxFQUFFO1lBQ1gsSUFBSSxFQUFFLElBQUksQ0FBQyxVQUFVLENBQUMsSUFBSTtTQUMzQixDQUFDLENBQUMsQ0FBQztJQUNOLENBQUMsQ0FBQztJQUVGOzs7O09B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