File: D:/HostingSpaces/RImmers2/portal.photomenu.nl/wwwroot/controllers/users.js
exports.install = function () {
F.route('/users', users, ['get', 'authorize', '@admin']);
F.route('/users/edit/{id}', usersEdit, ['get', 'authorize', '@admin']);
F.route('/users/edit/{id}', usersEditProcess, ['post', 'authorize', '@admin']);
F.route('/users/delete/{id}', usersDelete, ['get', 'authorize', '@admin']);
};
const validator = require('validator');
function users() {
var self = this;
return F.model('user').list().then(function (snapshot) {
let sorted = [];
let promises = [];
snapshot.forEach(u => {
let item = u.val();
item.key = u.key;
promises.push(restaurantName(item.restaurant).then(function (result) {
item.restaurantName = result;
return item;
}));
});
return Promise.all(promises).then(result => {
let sorted = result.sort((u1, u2) => {
if (u1.name.toLowerCase() > u2.name.toLowerCase()) return 1;
if (u1.name.toLowerCase() === u2.name.toLowerCase()) return 0;
if (u1.name.toLowerCase() < u2.name.toLowerCase()) return -1;
});
self.layout('/layouts/protected');
self.view('/users/index', { users: sorted });
});
});
};
function usersEdit(id) {
var self = this;
var params = {};
F.model('restaurant').list().then(function (snapshot) {
let sorted = [];
snapshot.forEach(r => {
let item = r.val();
item.key = r.key;
sorted.push(item);
})
const restaurants = sorted.sort((i1, i2) => {
if (i1.Name.toLowerCase() < i2.Name.toLowerCase()) return -1;
if (i1.Name.toLowerCase() === i2.Name.toLowerCase()) return 0;
if (i1.Name.toLowerCase() > i2.Name.toLowerCase()) return 1;
});
self.layout('/layouts/protected');
if (id === 'new') {
self.view('/users/edit', {
user: {
status: true
},
id: id,
restaurants: restaurants
});
} else {
F.model('user').load(id).then(function (snapshot) {
self.view('/users/edit', {
user: snapshot.val(),
id: id,
restaurants: restaurants
});
});
}
});
};
function usersEditProcess(id) {
var self = this;
var params = {};
var postData = {
name: self.body.name,
email: self.body.email,
role: self.body.role,
status: self.body.status == 'on' ? true : false,
hasStatistics: self.body.hasStatistics == 'on' ? true : false,
hasLunch: self.body.hasLunch == 'on' ? true : false,
hasAllergens: self.body.hasAllergens == 'on' ? true : false,
hasDrinks: self.body.hasDrinks == 'on' ? true : false,
restaurant: self.body.restaurant == 'none-selected' ? null : self.body.restaurant
};
if (!validator.isLength(self.body['name'], {
min: 1,
max: 25
})) {
params.error = true;
params.errorMessage = 'Invalid "Name" value.'
}
if (id === 'new') {
if (!validator.isEmail(self.body['email']) || !validator.isLength(self.body['email'], {
min: 1,
max: 40
})) {
params.error = true;
params.errorMessage = 'Invalid "E-mail" value.'
}
if (!validator.isLength(self.body['password'], {
min: 1,
max: 25
})) {
params.error = true;
params.errorMessage = 'Invalid "Password" value.'
}
}
if (params.error) {
F.model('restaurant').list().then(function (snapshot) {
const restaurants = snapshot.val();
self.layout('/layouts/protected');
self.view('/users/edit', {
user: postData,
id: id,
error: true,
errorMessage: params.errorMessage,
restaurants: restaurants
});
});
} else {
if (self.body.id === 'new') {
postData.created_at = new Date().getTime();
if (postData.role === 'admin') {
delete postData.restaurant
} else {
if (!postData.restaurant) {
F.model('restaurant').list().then(function (snapshot) {
const restaurants = snapshot.val();
self.layout('/layouts/protected');
self.view('/users/edit', {
user: postData,
id: id,
error: true,
errorMessage: 'Restaurant is required.',
restaurants: restaurants
});
});
return;
}
}
F.firebaseAuth().createUserWithEmailAndPassword(self.body.email, self.body.password).then(function (result) {
F.model('user').create(result.uid, postData).then(function (snapshot) {
self.res.redirect('/users');
}).catch(err => {
console.log(err);
F.model('restaurant').list().then(function (snapshot) {
const restaurants = snapshot.val();
F.firebaseAdmin().deleteUser(result.uid);
self.layout('/layouts/protected');
self.view('/users/edit', {
user: postData,
id: 'new',
error: true,
errorMessage: 'Please fill in all required fields.',
restaurants: restaurants
});
});
});
}).catch(function (error) {
console.log(error);
F.model('restaurant').list().then(function (snapshot) {
const restaurants = snapshot.val();
self.layout('/layouts/protected');
self.view('/users/edit', {
user: postData,
id: 'new',
error: true,
errorMessage: error.message,
restaurants: restaurants
});
});
});
} else {
F.model('user').load(id).then(function (snapshot) {
const current = snapshot.val();
// console.log('current:', current);
postData.email = current.email;
postData.updated_at = new Date().getTime();
if (self.body.password && self.body.password.length > 0) {
postData.password = self.body.password;
}
if (postData.role === 'admin') {
delete postData.restaurant
} else {
if (!postData.restaurant) {
F.model('restaurant').list().then(function (snapshot) {
const restaurants = snapshot.val();
self.layout('/layouts/protected');
self.view('/users/edit', {
user: postData,
id: id,
error: true,
errorMessage: 'Restaurant is required.',
restaurants: restaurants
});
});
}
}
F.model('user').update(id, postData).then(function (snapshot) {
self.res.redirect('/users');
});
});
}
}
};
function usersDelete(id) {
var self = this;
F.model('user').delete(id).then(function () {
self.res.redirect('/users');
});
};
function restaurantName(id) {
var retvalue;
return F.model('restaurant').load(id).then(function (restaurant) {
retvalue = restaurant.Name;
return retvalue;
}).catch(function (error) {
return '';
});
};