From 3b154135f1cab4a4d5fd75d359627463380f8937 Mon Sep 17 00:00:00 2001
From: Hannah <hz018@hdm-stuttgart.de>
Date: Thu, 21 Dec 2023 12:24:43 +0100
Subject: [PATCH] exception handling if email is invalid or already exists

---
 growbros-frontend/src/components/Footer.tsx   | 21 -------
 growbros-frontend/src/pages/Login.tsx         | 17 +++---
 growbros-frontend/src/pages/Register.tsx      | 56 ++++++++++++-------
 .../growbros/auth/AuthenticationService.java  | 25 +++++++++
 .../exceptions/InvalidDataException.java      |  8 +++
 .../exceptions/InvalidEmailException.java     |  7 +++
 .../growbros/security/ApplicationConfig.java  |  2 +-
 7 files changed, 86 insertions(+), 50 deletions(-)
 delete mode 100644 growbros-frontend/src/components/Footer.tsx
 create mode 100644 src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java
 create mode 100644 src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java

diff --git a/growbros-frontend/src/components/Footer.tsx b/growbros-frontend/src/components/Footer.tsx
deleted file mode 100644
index cc81f27..0000000
--- a/growbros-frontend/src/components/Footer.tsx
+++ /dev/null
@@ -1,21 +0,0 @@
-import {NavLink} from "react-router-dom";
-import {deleteCookie} from "../jwt/Cookies.ts";
-
-function Footer() {
-    const handleLogout = () => {
-        deleteCookie('Jwt');
-    };
-    return (
-        <nav>
-            <ul>
-                <div className="navLinks">
-                    <li>
-                        <NavLink to="/home" onClick={handleLogout}>
-                            Ausloggen</NavLink>
-                    </li>
-                </div>
-            </ul>
-        </nav>
-    );
-}
-export default Footer();
\ No newline at end of file
diff --git a/growbros-frontend/src/pages/Login.tsx b/growbros-frontend/src/pages/Login.tsx
index 21c4eed..7a158f6 100644
--- a/growbros-frontend/src/pages/Login.tsx
+++ b/growbros-frontend/src/pages/Login.tsx
@@ -16,7 +16,6 @@ function Login() {
         await handleLogin();
     };
     const handleLogin = async () => {
-        try {
             const res = await fetch("http://localhost:8080/api/v1/auth/authenticate",{
                 method:"POST",
                 body:JSON.stringify({email:email,password:password}),
@@ -38,14 +37,18 @@ function Login() {
                 navigate('/');
 
             } else {
-                window.alert(`Fehler bei der Anmeldung: ${res.status} - ${res.statusText}`);
+                const errorBody = await res.json();
+                if (res.status === 400 && errorBody.error === 'InvalidEmailException') {
+                    window.alert("Fehler bei der Anmeldung: Ungültige E-Mail-Adresse.");
+                    console.error('Fehler bei der Anmeldung: Ungültige E-Mail-Adresse.');
+                } else {
+                    window.alert(`Fehler bei der Anmeldung: ${res.status} - ${res.statusText}`);
+                    console.error('Fehler bei der Anmeldung:', res.status, res.statusText);
+                }
+
                 navigate('/login');
-                console.error('Fehler bei der Anmeldung:', res.status, res.statusText);
-            }
 
-        } catch (error:any) {
-            console.error('Fehler bei der Anmeldung:', error.message);
-        }
+            }
     };
 
     return (
diff --git a/growbros-frontend/src/pages/Register.tsx b/growbros-frontend/src/pages/Register.tsx
index 7f56bc0..cfb5404 100644
--- a/growbros-frontend/src/pages/Register.tsx
+++ b/growbros-frontend/src/pages/Register.tsx
@@ -44,17 +44,17 @@ function Register() {
         e.preventDefault(); //verhindert, dass die Seite neu geladen wird, wenn das Formular abgeschickt wird
 
         if (!isValidEmail(email)) {
-            openErrorModal('Ungültige E-Mail-Adresse');
+            openErrorModal('Ungültige E-Mail-Adresse. Frontend');
             return;
         }
 
         if (!isValidName(firstname) || !isValidName(lastname)) {
-            openErrorModal('Vorname und Nachname dürfen nicht leer sein');
+            openErrorModal('Vorname und Nachname dürfen nicht leer sein. Frontend');
             return;
         }
 
         if (!isValidPassword(password)) {
-            openErrorModal('Das Passwort muss mindestens 4 Zeichen lang sein');
+            openErrorModal('Das Passwort muss mindestens 4 Zeichen lang sein. Frontend');
             return;
         }
         await handleRegister();
@@ -64,31 +64,45 @@ function Register() {
         console.log("handle register")
         try {
             const requestBody = {
-                firstname:firstname,
-                lastname:lastname,
-                email:email,
-                password:password
+                firstname: firstname,
+                lastname: lastname,
+                email: email,
+                password: password
             };
             console.log(requestBody)
             const res = await fetch("http://localhost:8080/api/v1/auth/register", {
-                    method:"POST",
+                    method: "POST",
                     headers: {
                         "Content-Type": "application/json"
                     },
-                    body:JSON.stringify(requestBody
-                    )}
+                    body: JSON.stringify(requestBody)
+                }
             )
-            const {token} = await res.json();
-            console.log("Jwt Token not decoded"+token);
-            const decodedToken = jwtDecode(token);
-            // @ts-ignore
-            const expirationDate = new Date(decodedToken.exp * 1000); //*1000 Anzahl der Sekunden seit 1.1.1970 darstellt - JS arbeitet jedoch normalerweise mit Millisekunden
-            setCookie("Jwt",token, expirationDate);
-            console.log("Jwt decoded " + decodedToken);
-            navigate('/');
-        } catch (error:any) {
-            console.error('Fehler bei der Anmeldung:', error.message);
-            console.dir(error)
+            if (res.ok) {
+                const {token} = await res.json();
+                console.log("Jwt Token not decoded" + token);
+                const decodedToken = jwtDecode(token);
+                // @ts-ignore
+                const expirationDate = new Date(decodedToken.exp * 1000); //*1000 Anzahl der Sekunden seit 1.1.1970 darstellt - JS arbeitet jedoch normalerweise mit Millisekunden
+                setCookie("Jwt", token, expirationDate);
+                console.log("Jwt decoded " + decodedToken);
+                navigate('/');
+            } else {
+                const errorBody = await res.json();
+                if (res.status === 400 && errorBody.error === 'InvalidEmailException') {
+                    window.alert("Fehler bei der Anmeldung: Ungültige E-Mail-Adresse.");
+                    console.error('Fehler bei der Anmeldung: Ungültige E-Mail-Adresse.');
+                } else if (res.status === 409 && errorBody.error === 'DataIntegrityViolationException') {
+                    window.alert("Fehler bei der Anmeldung: E-Mail-Adresse bereits vorhanden.");
+                    console.error('Fehler bei der Anmeldung: E-Mail-Adresse bereits vorhanden.');
+
+                } else {
+                    window.alert(`Fehler bei der Anmeldung: ${res.status} - ${res.statusText}`);
+                    console.error('Fehler bei der Anmeldung:', res.status, res.statusText);
+                }
+            }
+
+        } catch (e) {
         }
     };
 
diff --git a/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java b/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java
index 9cba373..5eefc1f 100644
--- a/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java
+++ b/src/main/java/hdm/mi/growbros/auth/AuthenticationService.java
@@ -1,5 +1,7 @@
 package hdm.mi.growbros.auth;
 
+import hdm.mi.growbros.exceptions.InvalidDataException;
+import hdm.mi.growbros.exceptions.InvalidEmailException;
 import hdm.mi.growbros.models.user.Role;
 import hdm.mi.growbros.models.user.User;
 import hdm.mi.growbros.models.user.UserRepository;
@@ -9,6 +11,8 @@ import org.springframework.security.authentication.AuthenticationManager;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 
 @Service
 @RequiredArgsConstructor
@@ -24,6 +28,19 @@ public class AuthenticationService {
      * @return
      */
     public AuthenticationResponse register(RegisterRequest request) {
+
+        if (!isValidEmail(request.getEmail())) {
+            throw new InvalidEmailException("Ungültige E-Mail-Adresse. Backend");
+        }
+
+        if (request.getFirstname().length() < 4 ) {
+            throw new InvalidDataException("Vorname muss mindestens 4 Zeichen lang sein. Backend");
+        }
+
+        if (request.getLastname().length() < 4) {
+            throw new InvalidDataException("Nachname muss mindestens 4 Zeichen lang sein. Backend");
+        }
+
         var user = User.builder()
                 .firstname(request.getFirstname())
                 .lastname(request.getLastname())
@@ -53,4 +70,12 @@ public class AuthenticationService {
                 .token(jwtToken)
                 .build();
     }
+
+    private boolean isValidEmail(String email) {
+        String emailRegex = "^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\\.[A-Z|a-z]{2,}$";
+        Pattern pattern = Pattern.compile(emailRegex);
+        Matcher matcher = pattern.matcher(email);
+        return matcher.matches();
+    }
+
 }
diff --git a/src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java b/src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java
new file mode 100644
index 0000000..294be06
--- /dev/null
+++ b/src/main/java/hdm/mi/growbros/exceptions/InvalidDataException.java
@@ -0,0 +1,8 @@
+package hdm.mi.growbros.exceptions;
+
+public class InvalidDataException extends RuntimeException{
+    public InvalidDataException(String message) {
+        super(message);
+    }
+}
+
diff --git a/src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java b/src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java
new file mode 100644
index 0000000..34a7752
--- /dev/null
+++ b/src/main/java/hdm/mi/growbros/exceptions/InvalidEmailException.java
@@ -0,0 +1,7 @@
+package hdm.mi.growbros.exceptions;
+
+public class InvalidEmailException extends RuntimeException{
+    public InvalidEmailException(String message) {
+        super(message);
+    }
+}
diff --git a/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java b/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java
index cdcfea2..22a72c6 100644
--- a/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java
+++ b/src/main/java/hdm/mi/growbros/security/ApplicationConfig.java
@@ -17,7 +17,7 @@ import org.springframework.security.crypto.password.PasswordEncoder;
 @RequiredArgsConstructor
 public class ApplicationConfig {
     private final UserRepository repository;
-    @Bean //Schnittstelle die verwendet wird, um Benutzerdetails zu laden
+    @Bean
     public UserDetailsService userDetailsService() {
         return username -> repository.findByEmail(username)
                 .orElseThrow(() -> new UsernameNotFoundException("User not found"));
-- 
GitLab