diff --git a/services/core-store.js b/services/core-store.js index 268e232..4bbf3eb 100644 --- a/services/core-store.js +++ b/services/core-store.js @@ -2,6 +2,7 @@ const coreStoreQueryString = 'core_store'; const configPrefix = 'core-store'; // Should be the same as the filename. +const difference = require('../utils/getObjectDiff'); /** * Import/Export for core-store configs. @@ -14,15 +15,38 @@ module.exports = { * @returns {void} */ exportAll: async () => { - const coreStore = await strapi.query(coreStoreQueryString).find({ _limit: -1 }); + const formattedDiff = { + fileConfig: {}, + databaseConfig: {}, + diff: {} + }; + + const fileConfig = await strapi.plugins['config-sync'].services.main.getAllConfigFromFiles(configPrefix); + const databaseConfig = await strapi.plugins['config-sync'].services.main.getAllConfigFromDatabase(configPrefix); + const diff = difference(databaseConfig, fileConfig); - await Promise.all(Object.values(coreStore).map(async ({ id, ...config }) => { + formattedDiff.diff = diff; + + Object.keys(diff).map((changedConfigName) => { + formattedDiff.fileConfig[changedConfigName] = fileConfig[changedConfigName]; + formattedDiff.databaseConfig[changedConfigName] = databaseConfig[changedConfigName]; + }) + + await Promise.all(Object.entries(diff).map(async ([configName, config]) => { // Check if the config should be excluded. - const shouldExclude = strapi.plugins['config-sync'].config.exclude.includes(`${configPrefix}.${config.key}`); + const shouldExclude = strapi.plugins['config-sync'].config.exclude.includes(`${configName}`); if (shouldExclude) return; - config.value = JSON.parse(config.value); - await strapi.plugins['config-sync'].services.main.writeConfigFile(configPrefix, config.key, config); + const currentConfig = formattedDiff.databaseConfig[configName]; + + if ( + !currentConfig && + formattedDiff.fileConfig[configName] + ) { + await strapi.plugins['config-sync'].services.main.deleteConfigFile(configName); + } else { + await strapi.plugins['config-sync'].services.main.writeConfigFile(configPrefix, currentConfig.key, currentConfig); + } })); }, diff --git a/services/main.js b/services/main.js index 0058d01..58a2f7e 100644 --- a/services/main.js +++ b/services/main.js @@ -44,6 +44,20 @@ module.exports = { }); }, + /** + * Delete config file. + * + * @param {string} configName - The name of the config file. + * @returns {void} + */ + deleteConfigFile: async (configName) => { + // Check if the config should be excluded. + const shouldExclude = strapi.plugins['config-sync'].config.exclude.includes(`${configName}`); + if (shouldExclude) return; + + fs.unlinkSync(`${strapi.plugins['config-sync'].config.destination}${configName}.json`); + }, + /** * Read from a config file. * @@ -68,7 +82,7 @@ module.exports = { * * @returns {object} Object with key value pairs of configs. */ - getAllConfigFromFiles: async () => { + getAllConfigFromFiles: async (configType = null) => { const configFiles = fs.readdirSync(strapi.plugins['config-sync'].config.destination); const getConfigs = async () => { @@ -77,6 +91,11 @@ module.exports = { await Promise.all(configFiles.map(async (file) => { const type = file.split('.')[0]; // Grab the first part of the filename. const name = file.split(/\.(.+)/)[1].split('.').slice(0, -1).join('.'); // Grab the rest of the filename minus the file extension. + + if (configType && configType !== type) { + return; + } + const fileContents = await strapi.plugins['config-sync'].services.main.readConfigFile(type, name); fileConfigs[`${type}.${name}`] = fileContents; })); diff --git a/services/role-permissions.js b/services/role-permissions.js index d009eed..9511148 100644 --- a/services/role-permissions.js +++ b/services/role-permissions.js @@ -1,6 +1,7 @@ 'use strict'; const { sanitizeEntity } = require('strapi-utils'); +const difference = require('../utils/getObjectDiff'); const configPrefix = 'role-permissions'; // Should be the same as the filename. @@ -15,30 +16,39 @@ module.exports = { * @returns {void} */ exportAll: async () => { - const service = - strapi.plugins['users-permissions'].services.userspermissions; + const formattedDiff = { + fileConfig: {}, + databaseConfig: {}, + diff: {} + }; + + const fileConfig = await strapi.plugins['config-sync'].services.main.getAllConfigFromFiles(configPrefix); + const databaseConfig = await strapi.plugins['config-sync'].services.main.getAllConfigFromDatabase(configPrefix); + const diff = difference(databaseConfig, fileConfig); - const [roles, plugins] = await Promise.all([ - service.getRoles(), - service.getPlugins(), - ]); + formattedDiff.diff = diff; - const rolesWithPermissions = await Promise.all( - roles.map(async role => service.getRole(role.id, plugins)) - ); + Object.keys(diff).map((changedConfigName) => { + formattedDiff.fileConfig[changedConfigName] = fileConfig[changedConfigName]; + formattedDiff.databaseConfig[changedConfigName] = databaseConfig[changedConfigName]; + }) - const sanitizedRolesArray = rolesWithPermissions.map(role => - sanitizeEntity(role, { - model: strapi.plugins['users-permissions'].models.role, - }) - ); - - await Promise.all(sanitizedRolesArray.map(async ({id, ...config}) => { + await Promise.all(Object.entries(diff).map(async ([configName, config]) => { // Check if the config should be excluded. - const shouldExclude = strapi.plugins['config-sync'].config.exclude.includes(`${configPrefix}.${config.type}`); + const shouldExclude = strapi.plugins['config-sync'].config.exclude.includes(`${configName}`); if (shouldExclude) return; - await strapi.plugins['config-sync'].services.main.writeConfigFile(configPrefix, config.type, config); + const currentConfig = formattedDiff.databaseConfig[configName]; + + if ( + !currentConfig && + formattedDiff.fileConfig[configName] + ) { + await strapi.plugins['config-sync'].services.main.deleteConfigFile(configName); + } else { + await strapi.plugins['config-sync'].services.main.writeConfigFile(configPrefix, currentConfig.type, currentConfig); + } + })); }, diff --git a/services/webhooks.js b/services/webhooks.js index 005a451..bb4c4ac 100644 --- a/services/webhooks.js +++ b/services/webhooks.js @@ -6,6 +6,7 @@ const webhookQueryString = 'strapi_webhooks'; const configPrefix = 'webhooks'; // Should be the same as the filename. +const difference = require('../utils/getObjectDiff'); module.exports = { /** @@ -14,14 +15,38 @@ module.exports = { * @returns {void} */ exportAll: async () => { - const webhooks = await strapi.query(webhookQueryString).find({ _limit: -1 }); + const formattedDiff = { + fileConfig: {}, + databaseConfig: {}, + diff: {} + }; + + const fileConfig = await strapi.plugins['config-sync'].services.main.getAllConfigFromFiles(configPrefix); + const databaseConfig = await strapi.plugins['config-sync'].services.main.getAllConfigFromDatabase(configPrefix); + const diff = difference(databaseConfig, fileConfig); - await Promise.all(Object.values(webhooks).map(async (config) => { + formattedDiff.diff = diff; + + Object.keys(diff).map((changedConfigName) => { + formattedDiff.fileConfig[changedConfigName] = fileConfig[changedConfigName]; + formattedDiff.databaseConfig[changedConfigName] = databaseConfig[changedConfigName]; + }) + + await Promise.all(Object.entries(diff).map(async ([configName, config]) => { // Check if the config should be excluded. - const shouldExclude = strapi.plugins['config-sync'].config.exclude.includes(`${configPrefix}.${config.id}`); + const shouldExclude = strapi.plugins['config-sync'].config.exclude.includes(`${configName}`); if (shouldExclude) return; - await strapi.plugins['config-sync'].services.main.writeConfigFile(configPrefix, config.id, config); + const currentConfig = formattedDiff.databaseConfig[configName]; + + if ( + !currentConfig && + formattedDiff.fileConfig[configName] + ) { + await strapi.plugins['config-sync'].services.main.deleteConfigFile(configName); + } else { + await strapi.plugins['config-sync'].services.main.writeConfigFile(configPrefix, currentConfig.id, currentConfig); + } })); },