From 2af9ff58a22774fe46112a3a0ce056de8184044a Mon Sep 17 00:00:00 2001
From: Rosanny <rosanny.sihombing@hft-stuttgart.de>
Date: Wed, 5 May 2021 18:33:28 +0200
Subject: [PATCH] restructure the routes

---
 routes/public.js         | 169 +++++++++++++++++++++++-
 routes/routes-account.js | 271 ++++++++-------------------------------
 2 files changed, 219 insertions(+), 221 deletions(-)

diff --git a/routes/public.js b/routes/public.js
index 9ebc2255..19ce7da2 100644
--- a/routes/public.js
+++ b/routes/public.js
@@ -10,7 +10,7 @@ const salt = 64
 
 module.exports = function (app, config, lang) {
 
-    // ============= NEW USERS REGISTRATION ===========================
+    // ================== NEW USERS REGISTRATION ======================
 
     app.get('/registration', function(req, res) {
         res.render(lang+'/account/registration')
@@ -96,7 +96,172 @@ module.exports = function (app, config, lang) {
         }
     })
 
-    // ============= CONTACT FORM ===========================
+    // =================== USERS VERIFICATION =========================
+
+    app.get("/verifyAccount", function(req, res){
+      methods.getUserIdByVerificationToken(req.query.token, function(userId, err){
+        if (userId) {
+          let userData = {
+            id: userId,
+            verificationStatus: 1
+          }
+          methods.verifyUserAccount(userData, function(err){
+            if (err) {
+              console.log("Error: "+err)
+              res.render(lang+'/account/verification', {
+                status: false
+              });
+            }
+            else {
+              // send welcome email after successful account verification
+              methods.getUserById(userId, function(data, err){
+                if (err) {
+                  console.log("Error: "+err)
+                }
+                else {
+                  // send email
+                  var emailSubject = "Herzlich willkommen"
+                  var emailContent = '<div>Lieber Nutzer,<br/><br/>' +
+                    '<p>herzlich willkommen beim Transferportal der HFT Stuttgart!<br/>' +
+                    'Sie können nun alle Dienste des Portals nutzen.<p/><br/>' + constants.mailSignature;
+                  mailer.options.to = data.email;
+                  mailer.options.subject = emailSubject;
+                  mailer.options.html = emailContent;
+                  mailer.transport.sendMail(mailer.options, function(err) {
+                    if (err) {
+                      console.log('cannot send email')
+                      throw err
+                    }
+                  })
+                }
+              })
+  
+              res.render(lang+'/account/verification', {
+                status: true
+              });
+            }
+          })
+        }
+        else {
+          res.render(lang+'/account/verification', {
+            status: null
+          });
+        }
+      })
+    })
+
+    // ==================== FORGOT PASSWORD ===========================
+
+    app.get('/forgotPwd', function (req, res) {
+      res.render(lang+'/account/forgotPwd', {
+        user: req.user
+      })
+    })
+    app.post('/forgotPwd', function(req, res, next) {
+      let emailAddress = req.body.inputEmail
+      async.waterfall([
+        function(done) {
+          crypto.randomBytes(20, function(err, buf) {
+            var token = buf.toString('hex')
+            done(err, token)
+          })
+        },
+        function(token, done) {
+          methods.checkUserEmail(emailAddress, function(err, user){
+            if (user) {
+              var emailSubject = "Ihre Passwort-Anfrage an das Transferportal der HFT Stuttgart";
+              var emailContent = '<div>Lieber Nutzer,<br/><br/>' +
+                '<p>wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.<br/><br/>' +
+                'Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: '+config.app.host+'/reset/' + token + '<br/>' +
+                'Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.<br/></p>' + constants.mailSignature + '</div>'
+              
+              var credentialData = {
+                user_id: user.id,
+                resetPasswordToken: token,
+                resetPasswordExpires: Date.now() + 3600000 // 1 hour
+              }
+              methods.updateCredential(credentialData, function(err) {
+                done(err, token, user);
+              })
+  
+              // send email
+              mailer.options.to = emailAddress
+              mailer.options.subject = emailSubject
+              mailer.options.html = emailContent
+              mailer.transport.sendMail(mailer.options, function(err) {
+                done(err, 'done')
+              });
+            }
+            else {
+              done(err, 'no user found')
+            }
+          });
+        }
+      ], function(err) {
+        if (err) {
+          res.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.')
+        }
+        else {
+          res.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.')
+        }
+        res.redirect('/account/forgotPwd')
+      });
+    })
+
+    // reset
+    app.get('/reset/:token', function(req, res) {
+      methods.getUserByToken(req.params.token, function(err, user){
+        if (!user) {
+          res.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.')
+          res.redirect('/account/forgotPwd')
+        } else {
+          res.render(lang+'/account/reset')
+        }
+      })
+    })
+    app.post('/reset/:token', function(req, res) {
+      var newPwd = req.body.inputNewPwd
+      methods.getUserByToken(req.params.token, function(err, user){
+        if (user) {
+          // encrypt password
+          bcrypt.genSalt(saltRounds, function(err, salt) {
+            bcrypt.hash(newPwd, salt, function(err, hash) {
+              var credentialData = {
+                password: hash,
+                user_id: user.user_id
+              }
+              // update password
+              methods.updateCredential(credentialData, function(err){
+                if (err) {
+                  res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.")
+                  throw err
+                }
+                else {
+                  res.flash('success', "Passwort aktualisiert!")
+                  // send notifiaction email
+                  mailer.options.to = user.email
+                  mailer.options.subject = constants.updatePasswordMailSubject
+                  mailer.options.html = constants.updatePasswordMailContent+'<div>'+constants.mailSignature+'</div>'
+                  mailer.transport.sendMail(mailer.options, function(err) {
+                    if (err) {
+                      console.log(err)
+                    }
+                  });
+                  // redirect to login page
+                  res.redirect('/login')
+                }
+              })
+            });
+          });
+        }
+        else {
+          res.flash('error', "User not found.")
+          res.redirect('/login')
+        }
+      })
+    })
+
+    // ======================= CONTACT FORM ===========================
 
     app.get('/contact', function (req, res) {
       res.render(lang+'/account/contact', {
diff --git a/routes/routes-account.js b/routes/routes-account.js
index 26b328a3..eb99e1fa 100644
--- a/routes/routes-account.js
+++ b/routes/routes-account.js
@@ -86,8 +86,6 @@ module.exports = function (app, config, passport, lang) {
   );
 
   // ======== APP ROUTES - ACCOUNT ====================
-  var updatePasswordMailSubject = "Ihr Passwort für das Transferportal wurde gespeichert."
-  var updatePasswordMailContent = '<div>Lieber Nutzer,<br/><br/>Ihr Passwort wurde erfolgreich geändert.<br/><br/>' + constants.mailSignature + '</div>';
 
   async function getLoggedInUserData(email) {
     let user = await methods.getUserByEmail(email)
@@ -315,8 +313,8 @@ module.exports = function (app, config, passport, lang) {
                     } else {
                       res.flash('success', "Passwort aktualisiert!")
                       mailer.options.to = req.user.email
-                      mailer.options.subject = updatePasswordMailSubject
-                      mailer.options.html = updatePasswordMailContent
+                      mailer.options.subject = constants.updatePasswordMailSubject
+                      mailer.options.html = constants.updatePasswordMailContent+'<div>'+constants.mailSignature+'</div>'
                       mailer.transport.sendMail(mailer.options, function(err) {
                         if (err) { console.log(err) }
                       });
@@ -331,119 +329,61 @@ module.exports = function (app, config, passport, lang) {
       })
     }
   });
-
-  app.get('/forgotPwd', function (req, res) {
-    res.render(lang+'/account/forgotPwd', {
-      user: req.user
-    });
-  });
-
-  app.post('/forgotPwd', function(req, res, next) {
-    let emailAddress = req.body.inputEmail
-    async.waterfall([
-      function(done) {
-        crypto.randomBytes(20, function(err, buf) {
-          var token = buf.toString('hex');
-          done(err, token);
-        });
-      },
-      function(token, done) {
-        methods.checkUserEmail(emailAddress, function(err, user){
-          if (user) {
-            console.log("email: user found");
-            var emailSubject = "Ihre Passwort-Anfrage an das Transferportal der HFT Stuttgart";
-            var emailContent = '<div>Lieber Nutzer,<br/><br/>' +
-              '<p>wir haben Ihre Anfrage zur Erneuerung Ihres Passwortes erhalten. Falls Sie diese Anfrage nicht gesendet haben, ignorieren Sie bitte diese E-Mail.<br/><br/>' +
-              'Sie können Ihr Passwort mit dem Klick auf diesen Link ändern: '+config.app.host+'/reset/' + token + '<br/>' +
-              'Dieser Link ist aus Sicherheitsgründen nur für 1 Stunde gültig.<br/></p>' + constants.mailSignature + '</div>';
-            
-            var credentialData = {
-              user_id: user.id,
-              resetPasswordToken: token,
-              resetPasswordExpires: Date.now() + 3600000 // 1 hour
-            }
-            methods.updateCredential(credentialData, function(err) {
-              done(err, token, user);
-            });
-
-            // send email
-            mailer.options.to = emailAddress;
-            mailer.options.subject = emailSubject;
-            mailer.options.html = emailContent;
-            mailer.transport.sendMail(mailer.options, function(err) {
-              done(err, 'done');
-            });
-          }
-          else {
-            done(err, 'no user found');
-          }
-        });
-      }
-    ], function(err) {
-      if (err) {
-        res.flash('error', 'Ein Fehler ist aufgetreten. Bitte versuchen Sie es erneut.');
-      }
-      else {
-        res.flash('success', 'Wenn Ihre E-Mail-Adresse registriert ist, wurde eine E-Mail mit dem weiteren Vorgehen an ' + emailAddress + ' versendet.');
-      }
-      res.redirect('/account/forgotPwd');
-    });
-  });
-
-  app.get('/reset/:token', function(req, res) {
-    methods.getUserByToken(req.params.token, function(err, user){
-      if (!user) {
-        res.flash('error', 'Der Schlüssel zum zurücksetzen des Passworts ist ungültig oder abgelaufen.')
-        res.redirect('/account/forgotPwd')
-      }
-      else {
-        res.render(lang+'/account/reset')
-      }
-    });
-  });
-
-  app.post('/reset/:token', function(req, res) {
-    var newPwd = req.body.inputNewPwd
-    methods.getUserByToken(req.params.token, function(err, user){
-      if (user) {
-        // encrypt password
-        bcrypt.genSalt(saltRounds, function(err, salt) {
-          bcrypt.hash(newPwd, salt, function(err, hash) {
-            var credentialData = {
-              password: hash,
-              user_id: user.user_id
-            }
-            // update password
-            methods.updateCredential(credentialData, function(err){
-              if (err) {
-                res.flash('error', "Datenbankfehler: Passwort kann nicht geändert werden.")
-                throw err
-              }
-              else {
-                res.flash('success', "Passwort aktualisiert!")
-                // send notifiaction email
-                mailer.options.to = user.email
-                mailer.options.subject = updatePasswordMailSubject
-                mailer.options.html = updatePasswordMailContent
+  
+  app.get("/resendVerificationEmail", function(req, res){
+    if (req.isAuthenticated()) {
+      var emailAddress = req.user.email
+      
+      methods.getUserIdByEmail(req.user.email, function(userId, err) {
+        if (!err) {
+          // get token
+          methods.getVerificationTokenByUserId(userId, function(token, err){
+            if (!err) {
+              if (token) {
+                // send email
+                var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto"
+                var emailContent = '<div>Lieber Nutzer,<br/><br/>' +
+                  '<p>vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. <br/>' +
+                  'Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: ' + config.app.host + '/verifyAccount?token=' + token +
+                  '<br/><br/>' +
+                  'Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.</p><br/>' + constants.mailSignature +
+                  '</div>';
+                mailer.options.to = emailAddress;
+                mailer.options.subject = emailSubject;
+                mailer.options.html = emailContent;
                 mailer.transport.sendMail(mailer.options, function(err) {
                   if (err) {
-                    console.log(err)
+                    console.log('cannot send email')
+                    throw err
                   }
-                });
-                // redirect to login page
-                res.redirect('/login')
+                })
+                res.send(true)
               }
-            })
-          });
-        });
-      }
-      else {
-        res.flash('error', "User not found.")
-        res.redirect('/login')
-      }
-    });
+              else {
+                res.send(false)
+              }
+            }
+            else {
+              console.log(err)
+            }
+          })
+        }
+      })
+    }
+  })
 
-  });
+  app.get('/email/:email', function(req, res) {
+    methods.checkUserEmail(req.params.email, function(err, user){
+      if (!err) {
+        if (user) {
+          res.send(false)
+        }
+        else {
+          res.send(true)
+        }  
+      }
+    })
+  })
 
   // ============= NEW GITLAB PAGES ===========================
   
@@ -641,111 +581,4 @@ module.exports = function (app, config, passport, lang) {
     }
   })
 
-  // ============= USER VERIFICATION ================================
-  app.get("/verifyAccount", function(req, res){
-    methods.getUserIdByVerificationToken(req.query.token, function(userId, err){
-      if (userId) {
-        let userData = {
-          id: userId,
-          verificationStatus: 1
-        }
-        methods.verifyUserAccount(userData, function(err){
-          if (err) {
-            console.log("Error: "+err)
-            res.render(lang+'/account/verification', {
-              status: false
-            });
-          }
-          else {
-            // send welcome email after successful account verification
-            methods.getUserById(userId, function(data, err){
-              if (err) {
-                console.log("Error: "+err)
-              }
-              else {
-                // send email
-                var emailSubject = "Herzlich willkommen"
-                var emailContent = '<div>Lieber Nutzer,<br/><br/>' +
-                  '<p>herzlich willkommen beim Transferportal der HFT Stuttgart!<br/>' +
-                  'Sie können nun alle Dienste des Portals nutzen.<p/><br/>' + constants.mailSignature;
-                mailer.options.to = data.email;
-                mailer.options.subject = emailSubject;
-                mailer.options.html = emailContent;
-                mailer.transport.sendMail(mailer.options, function(err) {
-                  if (err) {
-                    console.log('cannot send email')
-                    throw err
-                  }
-                })
-              }
-            })
-
-            res.render(lang+'/account/verification', {
-              status: true
-            });
-          }
-        })
-      }
-      else {
-        res.render(lang+'/account/verification', {
-          status: null
-        });
-      }
-    })
-  })
-  app.get("/resendVerificationEmail", function(req, res){
-    if (req.isAuthenticated()) {
-      var emailAddress = req.user.email
-      
-      methods.getUserIdByEmail(req.user.email, function(userId, err) {
-        if (!err) {
-          // get token
-          methods.getVerificationTokenByUserId(userId, function(token, err){
-            if (!err) {
-              if (token) {
-                // send email
-                var emailSubject = "Bitte bestätigen Sie Ihr M4_LAB Benutzerkonto"
-                var emailContent = '<div>Lieber Nutzer,<br/><br/>' +
-                  '<p>vielen Dank für Ihre Anmeldung am Transferportal der HFT Stuttgart. <br/>' +
-                  'Um Ihre Anmeldung zu bestätigen, klicken Sie bitte diesen Link: ' + config.app.host + '/verifyAccount?token=' + token +
-                  '<br/><br/>' +
-                  'Ohne Bestätigung Ihres Kontos müssen wir Ihr Konto leider nach 7 Tagen löschen.</p><br/>' + constants.mailSignature +
-                  '</div>';
-                mailer.options.to = emailAddress;
-                mailer.options.subject = emailSubject;
-                mailer.options.html = emailContent;
-                mailer.transport.sendMail(mailer.options, function(err) {
-                  if (err) {
-                    console.log('cannot send email')
-                    throw err
-                  }
-                })
-                res.send(true)
-              }
-              else {
-                res.send(false)
-              }
-            }
-            else {
-              console.log(err)
-            }
-          })
-        }
-      })
-    }
-  })
-
-  app.get('/email/:email', function(req, res) {
-    methods.checkUserEmail(req.params.email, function(err, user){
-      if (!err) {
-        if (user) {
-          res.send(false)
-        }
-        else {
-          res.send(true)
-        }  
-      }
-    })
-  })
-
 }
\ No newline at end of file
-- 
GitLab