UNPKG

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
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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