HEX
Server: Microsoft-IIS/8.5
System: Windows NT YDAWBH120 6.3 build 9600 (Windows Server 2012 R2 Standard Edition) AMD64
User: tentjecom_web (0)
PHP: 7.4.14
Disabled: NONE
Upload Files
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 '';
  });
};