Mark Moffat 2018-10-05 21:26:18 +09:30
commit dbb3a15f65
7 changed files with 38 additions and 10 deletions

2
.gitignore vendored
View File

@ -1,5 +1,5 @@
node_modules/
data/
config/settings.json
/config/settings-local.json
.vscode
**.DS_Store

View File

@ -2,8 +2,11 @@ FROM mhart/alpine-node:8
ENV NODE_VERSION 8.9.4
RUN apk add --no-cache make gcc g++ python bash
WORKDIR /var/expressCart
COPY lib/ /var/expressCart/lib/
COPY bin/ /var/expressCart/bin/
COPY config/ /var/expressCart/config/
COPY public/ /var/expressCart/public/

View File

@ -122,7 +122,13 @@ Note: The `databaseConnectionString` property requires a full connection string.
## Configuration
All settings are managed from the admin panel ([http://127.0.0.1:1111/admin](http://127.0.0.1:1111/admin)) except the Payment gateway and database settings.
Settings can be managed from the admin panel ([http://127.0.0.1:1111/admin](http://127.0.0.1:1111/admin)) with the exception of the Payment gateway and database settings.
All settings are stored in json files in the `/config` directory. The main application-level settings are stored in `/config/settings.json` while payment gateway settings are stored in files in the `/config` directory named after the payment gateway. For example, configuration for the Stripe payment gateway is stored in `/config/stripe.json`.
##### Local configuration
If you'd rather store settings in a file which isn't checked into version control, you can create a new settings file at `/config/settings-local.json` and store your complete settings there. When viewing or editing settings in the admin panel, expressCart will detect the existence of this file and update it accordingly.
##### Cart name and Cart description

9
app.js
View File

@ -249,6 +249,15 @@ app.use((req, res, next) => {
next();
});
// update config when modified
app.use((req, res, next) => {
next();
if (res.configDirty) {
config = common.getConfig();
app.config = config;
}
});
// Ran on all routes
app.use((req, res, next) => {
res.setHeader('Cache-Control', 'no-cache, no-store');

View File

@ -15,13 +15,13 @@ services:
- mongodb
mongodb:
image: mongo:3.4.10
container_name: "mongodb"
container_name: "expresscart-mongodb"
ports:
- 27017
volumes:
- mongo-data:/data/db
- expresscart-mongo-data:/data/db
ports:
- 27017:27017
command: mongod --smallfiles --logpath=/dev/null
volumes:
mongo-data:
expresscart-mongo-data:

View File

@ -217,8 +217,17 @@ exports.getImages = (dir, req, res, callback) => {
});
};
exports.getConfigFilename = () => {
let filename = path.join(__dirname, '../config', 'settings-local.json');
if (fs.existsSync(filename)) {
return filename;
} else {
return path.join(__dirname, '../config', 'settings.json');
}
};
exports.getConfig = () => {
let config = JSON.parse(fs.readFileSync(path.join(__dirname, '../config', 'settings.json'), 'utf8'));
let config = JSON.parse(fs.readFileSync(exports.getConfigFilename(), 'utf8'));
config.customCss = typeof config.customCss !== 'undefined' ? escape.decode(config.customCss) : null;
config.footerHtml = typeof config.footerHtml !== 'undefined' ? escape.decode(config.footerHtml) : null;
config.googleAnalytics = typeof config.googleAnalytics !== 'undefined' ? escape.decode(config.googleAnalytics) : null;
@ -255,7 +264,7 @@ exports.getPaymentConfig = () => {
};
exports.updateConfig = (fields) => {
let settingsFile = JSON.parse(fs.readFileSync(path.join(__dirname, '../config/settings.json'), 'utf8'));
let settingsFile = exports.getConfig();
_.forEach(fields, (value, key) => {
settingsFile[key] = value;
@ -311,7 +320,7 @@ exports.updateConfig = (fields) => {
// write file
try{
fs.writeFileSync(path.join(__dirname, '../config/settings.json'), JSON.stringify(settingsFile, null, 4));
fs.writeFileSync(exports.getConfigFilename(), JSON.stringify(settingsFile, null, 4));
return true;
}catch(exception){
return false;

View File

@ -171,6 +171,7 @@ router.post('/admin/settings/update', common.restrict, common.checkAccess, (req,
let result = common.updateConfig(req.body);
if(result === true){
res.status(200).json({message: 'Settings successfully updated'});
res.configDirty = true;
return;
}
res.status(400).json({message: 'Permission denied'});