| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133 | const fs            = require('fs');const error         = require('../lib/error');const settingModel  = require('../models/setting');const internalNginx = require('./nginx');const internalSetting = {	/**	 * @param  {Access}  access	 * @param  {Object}  data	 * @param  {String}  data.id	 * @return {Promise}	 */	update: (access, data) => {		return access.can('settings:update', data.id)			.then((/*access_data*/) => {				return internalSetting.get(access, {id: data.id});			})			.then((row) => {				if (row.id !== data.id) {					// Sanity check that something crazy hasn't happened					throw new error.InternalValidationError('Setting could not be updated, IDs do not match: ' + row.id + ' !== ' + data.id);				}				return settingModel					.query()					.where({id: data.id})					.patch(data);			})			.then(() => {				return internalSetting.get(access, {					id: data.id				});			})			.then((row) => {				if (row.id === 'default-site') {					// write the html if we need to					if (row.value === 'html') {						fs.writeFileSync('/data/nginx/default_www/index.html', row.meta.html, {encoding: 'utf8'});					}					// Configure nginx					return internalNginx.deleteConfig('default')						.then(() => {							return internalNginx.generateConfig('default', row);						})						.then(() => {							return internalNginx.test();						})						.then(() => {							return internalNginx.reload();						})						.then(() => {							return row;						})						.catch((/*err*/) => {							internalNginx.deleteConfig('default')								.then(() => {									return internalNginx.test();								})								.then(() => {									return internalNginx.reload();								})								.then(() => {									// I'm being slack here I know..									throw new error.ValidationError('Could not reconfigure Nginx. Please check logs.');								});						});				} else {					return row;				}			});	},	/**	 * @param  {Access}   access	 * @param  {Object}   data	 * @param  {String}   data.id	 * @return {Promise}	 */	get: (access, data) => {		return access.can('settings:get', data.id)			.then(() => {				return settingModel					.query()					.where('id', data.id)					.first();			})			.then((row) => {				if (row) {					return row;				} else {					throw new error.ItemNotFoundError(data.id);				}			});	},	/**	 * This will only count the settings	 *	 * @param   {Access}  access	 * @returns {*}	 */	getCount: (access) => {		return access.can('settings:list')			.then(() => {				return settingModel					.query()					.count('id as count')					.first();			})			.then((row) => {				return parseInt(row.count, 10);			});	},	/**	 * All settings	 *	 * @param   {Access}  access	 * @returns {Promise}	 */	getAll: (access) => {		return access.can('settings:list')			.then(() => {				return settingModel					.query()					.orderBy('description', 'ASC');			});	}};module.exports = internalSetting;
 |