const { sanitizeConfig } = require('../utils'); const ConfigType = require("../services/type"); const AdminRolePermissionsConfigType = class AdminRolePermissionsConfigType extends ConfigType { /** * Import a single role-permissions config file into the db. * * @param {string} configName - The name of the config file. * @param {string} configContent - The JSON content of the config file. * @returns {void} */ importSingle = async (configName, configContent) => { // Check if the config should be excluded. const shouldExclude = strapi.config.get('plugin.config-sync.exclude').includes(`${this.configPrefix}.${configName}`); if (shouldExclude) return; const queryAPI = strapi.query(this.queryString); const existingConfig = await queryAPI .findOne({ where: { [this.uid]: configName } }); if (existingConfig && configContent === null) { await queryAPI.delete({ where: { [this.uid]: configName }, populate: this.relations.map(({ relationName }) => relationName), }); return; } if (!existingConfig) { // Format JSON fields. const query = { ...configContent }; this.jsonFields.map((field) => query[field] = JSON.stringify(configContent[field])); this.relations.map(({ queryString }) => { const queryAPI = strapi.query(queryString); // Compare relations // Make changes to the db }); await queryAPI.create({ data: query }); } else { const query = { ...configContent }; this.jsonFields.map((field) => query[field] = JSON.stringify(configContent[field])); await queryAPI.update({ where: { [this.uid]: configName }, data: { ...query } }); } } /** * Get all role-permissions config from the db. * * @returns {object} Object with key value pairs of configs. */ getAllFromDatabase = async () => { const AllConfig = await strapi.query(this.queryString).findMany({ limit: 0 }); const configs = {}; await Promise.all(Object.values(AllConfig).map(async (config) => { // Check if the config should be excluded. const shouldExclude = strapi.config.get('plugin.config-sync.exclude').includes(`${this.configPrefix}.${config[this.uid]}`); if (shouldExclude) return; config = sanitizeConfig(config); const existingPermissions = await strapi.admin.services.permission.findMany({ where: { role: { code: config.code } }, }); existingPermissions.map((permission) => sanitizeConfig(permission)); const formattedObject = { ...config, permissions: existingPermissions }; this.jsonFields.map((field) => formattedObject[field] = JSON.parse(config[field])); configs[`${this.configPrefix}.${config[this.uid]}`] = formattedObject; })); return configs; } }; module.exports = AdminRolePermissionsConfigType;