sb-mig
Version:
CLI to rule the world. (and handle stuff related to Storyblok CMS)
145 lines (144 loc) • 5.42 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.syncRolesData = exports.getRole = exports.getAllRoles = exports.updateRole = exports.createRole = void 0;
const logger_js_1 = __importDefault(require("../../utils/logger.js"));
const request_js_1 = require("../utils/request.js");
// POST
const createRole = (role, config) => {
const { sbApi, spaceId } = config;
return sbApi
.post(`spaces/${spaceId}/space_roles/`, {
space_role: role,
})
.then(() => {
logger_js_1.default.success(`Role '${role.role}' has been created.`);
})
.catch((err) => {
logger_js_1.default.error("error happened... :(");
console.log(`${err.message} in migration of ${role.role} in createRole function`);
throw err;
});
};
exports.createRole = createRole;
// PUT
const updateRole = (role, config) => {
const { sbApi, spaceId } = config;
return sbApi
.put(`spaces/${spaceId}/space_roles/${role.id}`, {
space_role: role,
})
.then(() => {
logger_js_1.default.success(`Role '${role.role}' has been updated.`);
})
.catch((err) => {
logger_js_1.default.error("error happened... :(");
console.log(`${err.message} in migration of ${role.role} in updateRole function`);
throw err;
});
};
exports.updateRole = updateRole;
// GET
const getAllRoles = async (config) => {
const { sbApi, spaceId } = config;
logger_js_1.default.log("Trying to get all roles.");
// TODO: All Roles doesnt support pagination...
// https://github.com/storyblok/storyblok-js-client/issues/535
return (0, request_js_1.getAllItemsWithPagination)({
apiFn: ({ per_page, page }) => sbApi
.get(`spaces/${spaceId}/space_roles/`, { per_page, page })
.then((res) => {
logger_js_1.default.log(`Amount of roles: ${res.total}`);
return res;
})
.catch((err) => {
if (err.response.status === 404) {
logger_js_1.default.error(`There is no roles in your Storyblok ${spaceId} space.`);
return true;
}
else {
logger_js_1.default.error(err);
return false;
}
}),
params: {
spaceId,
},
itemsKey: "space_roles",
});
};
exports.getAllRoles = getAllRoles;
// GET
const getRole = async (roleName, config) => {
logger_js_1.default.log(`Trying to get '${roleName}' role.`);
return (0, exports.getAllRoles)(config)
.then((res) => res.filter((role) => role.role === roleName))
.then((res) => {
if (Array.isArray(res) && res.length === 0) {
logger_js_1.default.warning(`There is no role named '${roleName}'`);
return false;
}
return res;
})
.catch((err) => logger_js_1.default.error(err));
};
exports.getRole = getRole;
const syncRolesData = async ({ roles, dryRun }, config) => {
const result = {
created: [],
updated: [],
skipped: [],
errors: [],
};
if (dryRun) {
logger_js_1.default.warning("[dry-run] Role sync will only read remote data and report planned changes.");
}
const space_roles_raw = await (0, exports.getAllRoles)(config);
const space_roles = Array.isArray(space_roles_raw) ? space_roles_raw : [];
const rolesToUpdate = [];
const rolesToCreate = [];
for (const role of roles) {
if (!role || typeof role !== "object" || !("role" in role)) {
result.skipped.push(String(role?.role ?? "unknown"));
continue;
}
const shouldBeUpdated = space_roles.find((remoteRole) => role.role === remoteRole.role);
if (shouldBeUpdated) {
rolesToUpdate.push({ id: shouldBeUpdated.id, ...role });
}
else {
rolesToCreate.push(role);
}
}
const updateResults = dryRun
? rolesToUpdate.map(() => ({ status: "fulfilled" }))
: await Promise.allSettled(rolesToUpdate.map((role) => (0, exports.updateRole)(role, config)));
updateResults.forEach((r, idx) => {
const name = String(rolesToUpdate[idx]?.role ?? "unknown");
if (dryRun) {
logger_js_1.default.warning(`[dry-run] Would update role '${name}'.`);
}
if (r.status === "fulfilled")
result.updated.push(name);
else
result.errors.push({ name, message: String(r.reason) });
});
const createResults = dryRun
? rolesToCreate.map(() => ({ status: "fulfilled" }))
: await Promise.allSettled(rolesToCreate.map((role) => (0, exports.createRole)(role, config)));
createResults.forEach((r, idx) => {
const name = String(rolesToCreate[idx]?.role ?? "unknown");
if (dryRun) {
logger_js_1.default.warning(`[dry-run] Would create role '${name}'.`);
}
if (r.status === "fulfilled")
result.created.push(name);
else
result.errors.push({ name, message: String(r.reason) });
});
return result;
};
exports.syncRolesData = syncRolesData;
// File-based sync wrapper lives in `roles.sync.ts` to keep this module CJS-safe.