File: D:/HostingSpaces/RImmers2/portal.photomenu.nl/wwwroot/controllers/settings.js
const validator = require('validator');
const json2csv = require('json2csv');
exports.install = function () {
F.route('/settings', settings, ['get', 'authorize', '@admin']);
F.route('/settings', settingsProcess, ['post', 'authorize', '@admin']);
F.route('/download-statistics', downloadStatistics, ['get', 'authorize', '@admin']);
F.route('/download-pageviews', downloadPageviews, ['get', 'authorize', '@admin']);
};
function downloadStatistics() {
const self = this;
F.model('share').list().then(function (snapshot) {
const dataset = [];
for (k in snapshot) {
dataset.push(snapshot[k])
}
try {
var result = json2csv({ data: dataset});
self.res.setHeader('Content-disposition', 'attachment; filename=statistics.csv');
self.res.setHeader('Content-Type', 'text/csv');
self.res.send(200, result);
} catch (err) {
self.res.json({error: err});
}
})
}
function downloadPageviews() {
const self = this;
F.model('restaurant').list().then(function (snapshot) {
let restaurants = snapshot.val();
let dataset = [];
let allRequests = [];
for (let r in restaurants) {
const menu = restaurants[r].Menu;
const getDishData = F.model('menu').loadDishesWithMenu(menu).then(function (response) {
const menu = response.menu;
const dishes = response.dishes;
const formattedDishes = [];
for (let d in dishes) {
formattedDishes.push({
"Title": dishes[d].Title,
"Number of times shown in overview iOS": dishes[d]["Number of times shown in overview iOS"],
"Number of times shown in overview android": dishes[d]["Number of times shown in overview android"],
"Number of times shown in detail iOS": dishes[d]["Number of times shown in detail iOS"],
"Number of times shown in detail android": dishes[d]["Number of times shown in detail android"],
})
}
for (let r in restaurants) {
if (restaurants[r].Menu === menu) {
dataset.push({
"Name": restaurants[r].Name,
"Number of times shown android" : restaurants[r]['Number of times shown android'],
"Number of times shown iOS" : restaurants[r]['Number of times shown iOS'],
"Dish": formattedDishes
})
}
}
});
allRequests.push(getDishData);
}
Promise.all(allRequests).then(()=> {
try {
const fields = [
'Name',
'Number of times shown android',
'Number of times shown iOS',
'Number of times shown iOS',
'Dish.Title',
'Dish.Number of times shown in overview iOS',
'Dish.Number of times shown in overview android',
'Dish.Number of times shown in detail iOS',
'Dish.Number of times shown in detail android'
];
const result = json2csv({ data: dataset, fields: fields, unwindPath: 'Dish'});
self.res.setHeader('Content-disposition', 'attachment; filename=pageviews.csv');
self.res.setHeader('Content-Type', 'text/csv');
self.res.send(200, result);
} catch (err) {
self.res.json({error: err});
}
})
});
}
function settings() {
var self = this;
var params = {};
F.model('settings').load().then(function(settings){
params.settings = settings;
self.layout('/layouts/protected');
self.view('/settings/index', params);
});
};
function settingsProcess() {
var self = this;
let params = {};
// Input validations.
if (!validator.isEmail(self.body['Admin email']) && validator.isLength(self.body['Admin email'], {min:0, max:40})) {
params.error = true;
params.errorMessage = 'Invalid "Admin email" value.'
}
if (!validator.isLength(self.body['Share text dish'], {min:0, max:250})) {
params.error = true;
params.errorMessage = '"Share text dish" value can have max 250 characters.'
}
if (!validator.isLength(self.body['Share text dish ENG'], {min:0, max:250})) {
params.error = true;
params.errorMessage = '"Share text dish ENG" value can have max 250 characters.'
}
if (!validator.isLength(self.body['Share text restaurant'], {min:0, max:250})) {
params.error = true;
params.errorMessage = '"Share text restaurant" value can have max 250 characters.'
}
if (!validator.isLength(self.body['Share text restaurant ENG'], {min:0, max:250})) {
params.error = true;
params.errorMessage = '"Share text restaurant ENG" value can have max 250 characters.'
}
self.body['Menu Review Distance'] = parseInt(self.body['Menu Review Distance']);
self.body['Nearest Restaurants Distance'] = parseInt(self.body['Nearest Restaurants Distance']);
if (params.error) {
params.settings = self.body;
self.layout('/layouts/protected');
self.view('/settings/index', params);
} else {
F.model('settings').save(self.body, function(){
self.res.redirect('/settings');
});
}
};