strapi-plugin-config-sync/services/main.js

207 lines
6.3 KiB
JavaScript
Raw Normal View History

'use strict';
const fs = require('fs');
const util = require('util');
2021-03-27 17:14:56 +01:00
const difference = require('../utils/getObjectDiff');
/**
* Main services for config import/export.
*/
module.exports = {
/**
* Write a single config file.
*
* @param {string} configType - The type of the config.
* @param {string} configName - The name of the config file.
* @param {string} fileContents - The JSON content of the config file.
* @returns {void}
*/
writeConfigFile: async (configType, configName, fileContents) => {
// Check if the config should be excluded.
const shouldExclude = strapi.plugins['config-sync'].config.exclude.includes(`${configType}.${configName}`);
if (shouldExclude) return;
// Check if the JSON content should be minified.
const json =
!strapi.plugins['config-sync'].config.minify ?
JSON.stringify(fileContents, null, 2)
: JSON.stringify(fileContents);
if (!fs.existsSync(strapi.plugins['config-sync'].config.destination)) {
fs.mkdirSync(strapi.plugins['config-sync'].config.destination, { recursive: true });
}
const writeFile = util.promisify(fs.writeFile);
await writeFile(`${strapi.plugins['config-sync'].config.destination}${configType}.${configName}.json`, json)
.then(() => {
// @TODO:
// Add logging for successfull config export.
})
.catch(() => {
// @TODO:
// Add logging for failed config export.
});
},
2021-03-27 18:20:51 +01:00
/**
* 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.
*
* @param {string} configType - The type of config.
* @param {string} configName - The name of the config file.
* @returns {object} The JSON content of the config file.
*/
readConfigFile: async (configType, configName) => {
const readFile = util.promisify(fs.readFile);
return await readFile(`${strapi.plugins['config-sync'].config.destination}${configType}.${configName}.json`)
.then((data) => {
return JSON.parse(data);
})
.catch(() => {
return null;
});
},
2021-03-24 18:37:14 +01:00
/**
* Get all the config JSON from the filesystem.
*
* @returns {object} Object with key value pairs of configs.
*/
2021-03-27 18:20:51 +01:00
getAllConfigFromFiles: async (configType = null) => {
if (!fs.existsSync(strapi.plugins['config-sync'].config.destination)) {
return {};
}
2021-03-24 18:37:14 +01:00
const configFiles = fs.readdirSync(strapi.plugins['config-sync'].config.destination);
const getConfigs = async () => {
let fileConfigs = {};
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.
2021-03-27 18:20:51 +01:00
if (
configType && configType !== type ||
!strapi.plugins['config-sync'].config.include.includes(type) ||
strapi.plugins['config-sync'].config.exclude.includes(`${type}.${name}`)
) {
2021-03-27 18:20:51 +01:00
return;
}
2021-03-24 18:37:14 +01:00
const fileContents = await strapi.plugins['config-sync'].services.main.readConfigFile(type, name);
fileConfigs[`${type}.${name}`] = fileContents;
}));
return fileConfigs;
};
return await getConfigs();
},
/**
* Get all the config JSON from the database.
*
* @returns {object} Object with key value pairs of configs.
*/
getAllConfigFromDatabase: async (configType = null) => {
const getConfigs = async () => {
let databaseConfigs = {};
await Promise.all(strapi.plugins['config-sync'].config.include.map(async (type) => {
if (configType && configType !== type) {
return;
}
const config = await strapi.plugins['config-sync'].services[type].getAllFromDatabase();
databaseConfigs = Object.assign(config, databaseConfigs);
}));
return databaseConfigs;
}
return await getConfigs();
},
/**
* Import all config files into the db.
*
* @returns {void}
*/
importAllConfig: async (configType = null) => {
2021-03-27 17:14:56 +01:00
const fileConfig = await strapi.plugins['config-sync'].services.main.getAllConfigFromFiles();
const databaseConfig = await strapi.plugins['config-sync'].services.main.getAllConfigFromDatabase();
const diff = difference(databaseConfig, fileConfig);
2021-03-27 17:14:56 +01:00
Object.keys(diff).map((file) => {
const type = file.split('.')[0]; // Grab the first part of the filename.
2021-03-27 17:14:56 +01:00
const name = file.split(/\.(.+)/)[1]; // Grab the rest of the filename minus the file extension.
if (configType && configType !== type) {
return;
}
strapi.plugins['config-sync'].services.main.importSingleConfig(type, name);
});
},
/**
* Export all config files.
*
* @returns {void}
*/
exportAllConfig: async (configType = null) => {
await Promise.all(strapi.plugins['config-sync'].config.include.map(async (type) => {
if (configType && configType !== type) {
return;
}
await strapi.plugins['config-sync'].services[type].exportAll();
}));
},
/**
* Import a single config file into the db.
*
* @param {string} configType - The type of config.
* @param {string} configName - The name of the config file.
* @returns {void}
*/
importSingleConfig: async (configType, configName) => {
// Check if the config should be excluded.
const shouldExclude = strapi.plugins['config-sync'].config.exclude.includes(`${configType}.${configName}`);
if (shouldExclude) return;
const fileContents = await strapi.plugins['config-sync'].services.main.readConfigFile(configType, configName);
await strapi.plugins['config-sync'].services[configType].importSingle(configName, fileContents);
},
/**
* Export a single config file.
*
* @param {string} configType - The type of config.
* @param {string} configName - The name of the config file.
* @returns {void}
*/
exportSingleConfig: async (configType, configName) => {
},
};