sb-mig
Version:
CLI to rule the world. (and handle stuff related to Storyblok CMS)
98 lines (97 loc) • 3.31 kB
JavaScript
import Logger from "../../utils/logger.js";
import { getFileContentWithRequire } from "../../utils/main.js";
import { getAllItemsWithPagination } from "../utils/request.js";
// POST
export const createRole = (role, config) => {
const { sbApi, spaceId } = config;
sbApi
.post(`spaces/${spaceId}/space_roles/`, {
space_role: role,
})
.then(() => {
Logger.success(`Role '${role.role}' has been created.`);
})
.catch((err) => {
Logger.error("error happened... :(");
console.log(`${err.message} in migration of ${role.role} in createRole function`);
});
};
// PUT
export const updateRole = (role, config) => {
const { sbApi, spaceId } = config;
sbApi
.put(`spaces/${spaceId}/space_roles/${role.id}`, {
space_role: role,
})
.then(() => {
Logger.success(`Role '${role.role}' has been updated.`);
})
.catch((err) => {
Logger.error("error happened... :(");
console.log(`${err.message} in migration of ${role.role} in updateRole function`);
});
};
// GET
export const getAllRoles = async (config) => {
const { sbApi, spaceId } = config;
Logger.log("Trying to get all roles.");
// TODO: All Roles doesnt support pagination...
// https://github.com/storyblok/storyblok-js-client/issues/535
return getAllItemsWithPagination({
apiFn: ({ per_page, page }) => sbApi
.get(`spaces/${spaceId}/space_roles/`, { per_page, page })
.then((res) => {
Logger.log(`Amount of roles: ${res.total}`);
return res;
})
.catch((err) => {
if (err.response.status === 404) {
Logger.error(`There is no roles in your Storyblok ${spaceId} space.`);
return true;
}
else {
Logger.error(err);
return false;
}
}),
params: {
spaceId,
},
itemsKey: "space_roles",
});
};
// GET
export const getRole = async (roleName, config) => {
Logger.log(`Trying to get '${roleName}' role.`);
return getAllRoles(config)
.then((res) => res.filter((role) => role.role === roleName))
.then((res) => {
if (Array.isArray(res) && res.length === 0) {
Logger.warning(`There is no role named '${roleName}'`);
return false;
}
return res;
})
.catch((err) => Logger.error(err));
};
export const syncRoles = async ({ specifiedRoles }, config) => {
const specifiedRolesContent = await Promise.all(specifiedRoles.map((roles) => getFileContentWithRequire({ file: roles.p })));
const space_roles = await getAllRoles(config);
const rolesToUpdate = [];
const rolesToCreate = [];
for (const role of specifiedRolesContent) {
const shouldBeUpdated = space_roles.find((remoteRole) => role.role === remoteRole.role);
if (shouldBeUpdated) {
rolesToUpdate.push({ id: shouldBeUpdated.id, ...role });
}
else {
rolesToCreate.push(role);
}
}
rolesToUpdate.map(async (role) => {
await updateRole(role, config);
});
rolesToCreate.map(async (role) => {
await createRole(role, config);
});
};