Index: backend/controllers/apiController.js
===================================================================
--- backend/controllers/apiController.js	(revision d16483b10ec44ceef98a23d71a8cfaf2c5e9b05c)
+++ backend/controllers/apiController.js	(revision bb596cf64ceb2a0e2542e765a92baeee4921e39f)
@@ -1,9 +1,22 @@
-const { supabase, restartSupabaseConnection } = require('../supabaseClient');
-const Student = require('../models/Student');
-const prisma = require('../lib/prisma');
+const { supabase } = require("../supabaseClient");
+const Student = require("../models/Student");
+const User = require("../models/User");
+const prisma = require("../lib/prisma");
 
 const registerPOST = async (req, res) => {
   try {
-    const { username, email, password, name } = req.body;
+    const { username, email, password, confirmPassword, name } = req.body;
+
+    const tempUser = new User({ username, email, name });
+    let valErrors = tempUser.validate(password, confirmPassword);
+
+    if (valErrors) {
+      return res.status(400).json({
+        message: "Validation failed",
+        errors: valErrors, // Send back the specific errors
+        success: false,
+      });
+    }
+
     const existingUser = await prisma.users.findUnique({
       where: { username: username },
@@ -11,6 +24,12 @@
     });
     if (existingUser) {
+      if (!valErrors) {
+        valErrors = {};
+      }
+      valErrors.username = "Username already in use";
+      console.log("Errors after checking existing user:", valErrors);
       return res.status(400).json({
-        message: 'Username already exists',
+        message: "Validation failed",
+        errors: valErrors,
         success: false,
       });
@@ -18,5 +37,5 @@
     if (!username || !email || !password || !name) {
       return res.status(400).json({
-        message: 'Username, email, password and name are required',
+        message: "Username, email, password and name are required",
         success: false,
       });
@@ -32,7 +51,18 @@
         });
 
-      if (authError) throw new Error(authError.message);
-
-      const student = new Student({
+      if (authError) {
+        if (!valErrors) {
+          valErrors = {};
+        }
+        valErrors.email = "Email already in use";
+        console.log("Errors after checking existing user:", valErrors);
+        return res.status(400).json({
+          message: "Validation failed",
+          errors: valErrors,
+          success: false,
+        });
+      }
+
+      const studentForDb = new Student({
         id: authUser.user.id,
         username,
@@ -41,16 +71,27 @@
       });
 
-      const { studentInstance, error } = await createUserInSupabase(student);
+      const { createdStudent, error } = await createUserInSupabase(
+        studentForDb
+      );
+      if (error && error.field) {
+        fieldErrors[error.field] = error.message; // fieldErrors becomes { username: "Username already in use" }
+        errorMessage = "Registration failed. Please check the details.";
+        res.status(400).json({
+          message: errorMessage,
+          errors: Object.keys(fieldErrors).length > 0 ? fieldErrors : undefined, // Sends errors: { username: "..." }
+          success: false,
+        });
+      }
 
       if (error) throw new Error(error.message);
-      console.log('User created in Supabase:', studentInstance);
+      console.log("User created in Supabase:", createdStudent);
 
       res.status(201).json({
-        message: 'Registration successful',
+        message: "Registration successful",
         success: true,
-        user: studentInstance,
+        user: convertBigIntToString(createdStudent),
       });
     } catch (error) {
-      console.error('Registration error:', error);
+      console.error("Registration error:", error);
       res.status(400).json({
         message: error.message,
@@ -59,7 +100,7 @@
     }
   } catch (error) {
-    console.error('Server error:', error);
+    console.error("Server error:", error);
     res.status(500).json({
-      message: 'An error occurred during registration',
+      message: "An error occurred during registration",
       success: false,
     });
@@ -76,26 +117,29 @@
         name: studentInstance.name,
         solved_problems: studentInstance.solvedProblems || 0,
-        rank: studentInstance.rank || 'Novice',
         points: studentInstance.points || 0,
-        commentCounter: studentInstance.commentCounter || 3,
-        commentCheckCounter: studentInstance.commentCheckCounter || 0,
+        rank: studentInstance.rank || "Novice",
+
         postCounter: studentInstance.postCounter || 3,
         postCheckCounter: studentInstance.postCheckCounter || 0,
         isModerator: studentInstance.isModerator || false,
+        attempts: studentInstance.attempts || 0,
         solvedDailyChallenge: studentInstance.solvedDailyChallenge || false,
+        daily_points: studentInstance.dailyPoints || 0,
+        daily_test_case_id: studentInstance.testCaseId || null,
       },
     });
-    return { studentInstance, error: null };
+    return { createdStudent: newUser, error: null };
   } catch (error) {
-    // Check for Prisma unique constraint error
-    if (error.code === 'P2002') {
+    if (error.code === "P2002") {
       const field = error.meta?.target[0];
-      if (field === 'username') {
-        throw new Error('Username already in use');
-      } else if (field === 'email') {
-        throw new Error('Email address already registered');
-      }
-    }
-    throw error; // Re-throw any other errors
+      if (field === "username") {
+        const specificError = new Error("Username already exists");
+        specificError.field = "username";
+        throw specificError;
+      } else if (field === "email") {
+        throw new Error("Email address already registered");
+      }
+    }
+    throw error;
   }
 }
@@ -104,9 +148,9 @@
   if (Array.isArray(obj)) {
     return obj.map(convertBigIntToString);
-  } else if (obj && typeof obj === 'object') {
+  } else if (obj && typeof obj === "object") {
     return Object.fromEntries(
       Object.entries(obj).map(([k, v]) => [
         k,
-        typeof v === 'bigint' ? v.toString() : convertBigIntToString(v),
+        typeof v === "bigint" ? v.toString() : convertBigIntToString(v),
       ])
     );
@@ -121,5 +165,5 @@
       return res
         .status(400)
-        .json({ message: 'Email and password are required', success: false });
+        .json({ message: "Email and password are required", success: false });
     }
     const userData = await prisma.users.findUnique({
@@ -129,5 +173,5 @@
       return res
         .status(404)
-        .json({ message: 'User not found in database', success: false });
+        .json({ message: "User not found in database", success: false });
     }
 
@@ -149,5 +193,5 @@
         return res
           .status(404)
-          .json({ message: 'User not found in database', success: false });
+          .json({ message: "User not found in database", success: false });
       }
 
@@ -155,19 +199,19 @@
 
       res.status(200).json({
-        message: 'User data retrieved',
+        message: "User data retrieved",
         success: true,
         user: safeUserData,
       });
     } catch (error) {
-      console.error('Login error:', error);
+      console.error("Login error:", error);
       res
         .status(500)
-        .json({ message: 'An error occurred during login', success: false });
+        .json({ message: "An error occurred during login", success: false });
     }
   } catch (error) {
-    console.error('Login error:', error);
+    console.error("Login error:", error);
     res
       .status(500)
-      .json({ message: 'An error occurred during login', success: false });
+      .json({ message: "An error occurred during login", success: false });
   }
 };
Index: backend/models/Student.js
===================================================================
--- backend/models/Student.js	(revision d16483b10ec44ceef98a23d71a8cfaf2c5e9b05c)
+++ backend/models/Student.js	(revision bb596cf64ceb2a0e2542e765a92baeee4921e39f)
@@ -1,3 +1,3 @@
-const User = require('./User');
+const User = require("./User");
 
 class Student extends User {
@@ -5,5 +5,5 @@
     super(data);
     this.solvedProblems = data.solvedProblems || 0;
-    this.rank = data.rank || 'Novice';
+    this.rank = data.rank || "Novice";
     this.points = data.points || 0;
     this.commentCounter = data.commentCounter || 3;
@@ -11,23 +11,23 @@
     this.postCounter = data.postCounter || 3;
     this.postCheckCounter = data.postCheckCounter || 0;
-    this.isModerator = false;
   }
-  toJSON() {
-    return {
-      id: this.id,
-      username: this.username,
-      email: this.email,
-      // Add other fields you want to include:
-      name: this.name,
-      solvedProblems: this.solvedProblems,
-      rank: this.rank,
-      points: this.points,
-      commentCounter: this.commentCounter,
-      commentCheckCounter: this.commentCheckCounter,
-      postCounter: this.postCounter,
-      postCheckCounter: this.postCheckCounter,
-      isModerator: this.isModerator,
-    };
-  }
+  // toJSON() {
+  //   return {
+  //     id: this.id,
+  //     username: this.username,
+  //     email: this.email,
+  //     name: this.name,
+  //     solvedProblems: this.solvedProblems,
+  //     rank: this.rank,
+  //     points: this.points,
+  //     commentCounter: this.commentCounter,
+  //     commentCheckCounter: this.commentCheckCounter,
+  //     postCounter: this.postCounter,
+  //     postCheckCounter: this.postCheckCounter,
+  //     isModerator: this.isModerator,
+  //     dailyPoints: this.dailyPoints,
+  //     testCaseId: this.testCaseId,
+  //   };
+  // }
 }
 
Index: backend/models/User.js
===================================================================
--- backend/models/User.js	(revision d16483b10ec44ceef98a23d71a8cfaf2c5e9b05c)
+++ backend/models/User.js	(revision bb596cf64ceb2a0e2542e765a92baeee4921e39f)
@@ -2,17 +2,56 @@
   constructor(data = {}) {
     this.id = data.id || null;
-    this.username = data.username || '';
+    this.username = data.username;
     this.name = data.name;
-    this.isModerator = false;
-    this.email = data.email || '';
+    this.isModerator = data.isModerator || false;
+    this.email = data.email;
+    this.attempts = data.attempts || 0;
+    this.dailyPoints = data.dailyPoints || 0;
+    this.testCaseId = data.testCaseId || null;
   }
 
-  validate() {
+  validate(password, confirmPassword) {
     const errors = {};
 
-    if (!this.username) errors.username = 'Username is required';
-    if (!this.email) errors.email = 'Email is required';
-    if (this.email && !this.email.endsWith('@students.finki.ukim.mk')) {
-      errors.email = 'Email must be a valid FINKI student email';
+    if (!this.username) {
+      errors.username = "Username is required";
+    }
+    if (!this.name) {
+      errors.name = "Name is required";
+    }
+
+    const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/;
+    const multipleAtOrDotComRegex = /@.*@|(\.com).*\.com/;
+
+    if (!this.email) {
+      errors.email = "Email is required";
+    } else if (!this.email.endsWith("@students.finki.ukim.mk")) {
+      errors.email = "Email must be a valid FINKI student email";
+    } else if (!emailRegex.test(this.email)) {
+      errors.email = "Email format is invalid";
+    } else if (multipleAtOrDotComRegex.test(this.email)) {
+      errors.email = "Email cannot contain multiple '@' or '.com'";
+    }
+
+    // Password validations
+    if (!password) {
+      errors.password = "Password is required";
+    } else {
+      if (password.length < 8) {
+        errors.passwordLength = "Password must be at least 8 characters long";
+      }
+      if (!/[A-Z]/.test(password)) {
+        errors.passwordUppercase =
+          "Password must contain at least one uppercase letter";
+      }
+      if (!/[0-9]/.test(password)) {
+        errors.passwordNumber = "Password must contain at least one number";
+      }
+    }
+
+    if (!confirmPassword) {
+      errors.confirmPassword = "Please confirm your password";
+    } else if (password && password !== confirmPassword) {
+      errors.passwordMatch = "Passwords do not match";
     }
 
@@ -20,12 +59,13 @@
   }
 
-  toJSON() {
-    return {
-      id: this.id,
-      username: this.username,
-      email: this.email,
-      createdAt: this.createdAt,
-    };
-  }
+  // toJSON() {
+  //   return {
+  //     id: this.id,
+  //     username: this.username,
+  //     email: this.email,
+  //     isModerator: this.isModerator,
+
+  //   };
+  // }
 }
 
Index: client/src/Register/Register.jsx
===================================================================
--- client/src/Register/Register.jsx	(revision d16483b10ec44ceef98a23d71a8cfaf2c5e9b05c)
+++ client/src/Register/Register.jsx	(revision bb596cf64ceb2a0e2542e765a92baeee4921e39f)
@@ -6,5 +6,6 @@
 
 const Register = () => {
-  const [error, setError] = React.useState("");
+  const [formErrors, setFormErrors] = useState({});
+  const [generalError, setGeneralError] = useState("");
   const nav = useNavigate();
   const [showPassword, setShowPassword] = useState({
@@ -28,6 +29,6 @@
     name: "",
   });
-  function validateEmail(email) {
-    return email.endsWith("@students.finki.ukim.mk");
+  function validateLocalEmailFormat(email) {
+    return email.includes("@") && email.includes(".");
   }
   const handleInputChange = (e) => {
@@ -37,52 +38,39 @@
       [name]: value,
     });
+    if (formErrors[name]) {
+      setFormErrors((prev) => ({ ...prev, [name]: undefined }));
+    }
+    setGeneralError("");
   };
   const handleSubmit = async (e) => {
     e.preventDefault();
     setLoading(true);
-    setError("");
-
-    if (!validateEmail(formData.email)) {
-      setError("Email must end with @students.finki.ukim.mk");
-      setLoading(false);
-      return;
-    }
-    if (formData.username === "") {
-      setError("Must enter username");
-      setLoading(false);
-      return;
-    }
-    if (formData.name === "") {
-      setError("Name is required");
-      setLoading(false);
-      return;
-    }
-    if (formData.password === "") {
-      setError("Password is required");
-      setLoading(false);
-      return;
-    }
-    if (formData.confirmPassword === "") {
-      setError("Please confirm your password");
+    setGeneralError("");
+    setFormErrors({});
+
+    if (!validateLocalEmailFormat(formData.email)) {
+      setFormErrors((prev) => ({
+        ...prev,
+        email: "Please enter a valid email format.",
+      }));
       setLoading(false);
       return;
     }
     if (formData.password !== formData.confirmPassword) {
-      setError("Passwords do not match");
+      setFormErrors((prev) => ({
+        ...prev,
+        passwordMatch: "Passwords do not match",
+      }));
       setLoading(false);
       return;
     }
-    if (formData.password.length < 8) {
-      setError("Password must be at least 8 characters long");
-      setLoading(false);
-      return;
-    }
-    if (!/[A-Z]/.test(formData.password)) {
-      setError("Password must contain at least one uppercase letter");
-      setLoading(false);
-      return;
-    }
-    if (!/[0-9]/.test(formData.password)) {
-      setError("Password must contain at least one number");
+    if (
+      !formData.username ||
+      !formData.email ||
+      !formData.password ||
+      !formData.name ||
+      !formData.confirmPassword
+    ) {
+      setGeneralError("Please fill in all required fields.");
       setLoading(false);
       return;
@@ -94,95 +82,70 @@
         email: formData.email,
         password: formData.password,
+        confirmPassword: formData.confirmPassword,
         name: formData.name,
       };
 
       const data = await registerUser(userData);
+
+      localStorage.setItem("user", JSON.stringify(data.user));
       let registrationAttemptError = "";
 
-      if (data.success) {
-        localStorage.setItem("user", JSON.stringify(data.user));
-        try {
-          const { data: authData, error: supabaseError } =
-            await supabase.auth.signInWithPassword({
-              email: formData.email,
-              password: formData.password,
-            });
-
-          if (supabaseError) {
-            console.error(
-              "Supabase sign-in error after registration:",
-              supabaseError
-            );
-            registrationAttemptError =
-              "Registration successful, but Supabase session could not be started. Please try logging in.";
-            setError(registrationAttemptError);
-          } else if (authData.session?.access_token) {
-            localStorage.setItem("jwt", authData.session.access_token);
-          } else {
-            console.warn(
-              "Supabase session or access token missing after sign-in."
-            );
-            registrationAttemptError =
-              "Registration successful, but session token is missing. Please try logging in.";
-            setError(registrationAttemptError);
-          }
-        } catch (supabaseCatchError) {
-          console.error("Supabase auth error (caught):", supabaseCatchError);
+      try {
+        registrationAttemptError = "";
+        const { data: authData, error: supabaseError } =
+          await supabase.auth.signInWithPassword({
+            email: formData.email,
+            password: formData.password,
+          });
+
+        if (supabaseError) {
+          console.error(
+            "Supabase sign-in error after registration:",
+            supabaseError
+          );
           registrationAttemptError =
-            "Registration successful, but an error occurred starting your session. Please try logging in.";
-          setError(registrationAttemptError);
+            "Registration successful, but Supabase session could not be started. Please try logging in.";
+          setGeneralError(registrationAttemptError);
+        } else if (authData.session?.access_token) {
+          localStorage.setItem("jwt", authData.session.access_token);
+        } else {
+          console.warn(
+            "Supabase session or access token missing after sign-in."
+          );
+          registrationAttemptError =
+            "Registration successful, but session token is missing. Please try logging in.";
+          setGeneralError(registrationAttemptError);
         }
-
-        if (registrationAttemptError === "") {
-          nav("/dashboard");
-        }
-      } else {
-        console.error("Registration failed (backend):", data.message);
-        let backendErrorMessage =
-          data.message || "Registration failed. Please try again.";
-        if (
-          data.message &&
-          data.message.toLowerCase().includes("username already in use")
-        ) {
-          backendErrorMessage = "Username already in use";
-        } else if (
-          data.message &&
-          (data.message
-            .toLowerCase()
-            .includes("email address already registered") ||
-            data.message.toLowerCase().includes("email already in use"))
-        ) {
-          backendErrorMessage = "Email already in use";
-        }
-        setError(backendErrorMessage);
+      } catch (supabaseCatchError) {
+        console.error("Supabase auth error (caught):", supabaseCatchError);
+        registrationAttemptError =
+          "Registration successful, but an error occurred starting your session. Please try logging in.";
+        setGeneralError(registrationAttemptError);
+      }
+
+      if (registrationAttemptError === "") {
+        const user = localStorage.getItem("user");
+
+        nav("/dashboard");
       }
     } catch (apiError) {
       console.error("Registration API error:", apiError);
-      let apiErrorMessage =
-        "Registration failed due to a network or server error. Please try again.";
-      if (
-        apiError.response &&
-        apiError.response.data &&
-        apiError.response.data.message
-      ) {
-        apiErrorMessage = apiError.response.data.message;
-        if (
-          apiError.response.data.message
-            .toLowerCase()
-            .includes("username already in use")
-        ) {
-          apiErrorMessage = "Username already in use";
-        } else if (
-          apiError.response.data.message
-            .toLowerCase()
-            .includes("email address already registered") ||
-          apiError.response.data.message
-            .toLowerCase()
-            .includes("email already in use")
-        ) {
-          apiErrorMessage = "Email already in use";
+      if (apiError.response && apiError.response.data) {
+        const responseData = apiError.response.data;
+        if (responseData.errors) {
+          setFormErrors(responseData.errors);
+          setGeneralError(
+            responseData.message || "Please correct the highlighted errors."
+          );
+        } else {
+          setGeneralError(
+            responseData.message || "Registration failed. Please try again."
+          );
         }
+      } else {
+        setGeneralError(
+          "Registration failed due to a network or server error. Please try again."
+        );
       }
-      setError(apiErrorMessage);
     } finally {
       setLoading(false);
@@ -215,4 +178,7 @@
               disabled={loading}
             />
+            {formErrors.name && (
+              <p className="text-red-500 text-xs mt-1">{formErrors.name}</p>
+            )}
           </div>
 
@@ -231,4 +197,7 @@
               disabled={loading}
             />
+            {formErrors.username && (
+              <p className="text-red-500 text-xs mt-1">{formErrors.username}</p>
+            )}
           </div>
 
@@ -247,4 +216,7 @@
               disabled={loading}
             />
+            {formErrors.email && (
+              <p className="text-red-500 text-xs mt-1">{formErrors.email}</p>
+            )}
           </div>
 
@@ -262,5 +234,4 @@
                 value={formData.password}
                 onChange={handleInputChange}
-                required
                 disabled={loading}
               />
@@ -310,8 +281,27 @@
               </button>
             </div>
+            {formErrors.password && (
+              <p className="text-red-500 text-xs mt-1">{formErrors.password}</p>
+            )}
+            {formErrors.passwordLength && (
+              <p className="text-red-500 text-xs mt-1">
+                {formErrors.passwordLength}
+              </p>
+            )}
+            {formErrors.passwordUppercase && (
+              <p className="text-red-500 text-xs mt-1">
+                {formErrors.passwordUppercase}
+              </p>
+            )}
+            {formErrors.passwordNumber && (
+              <p className="text-red-500 text-xs mt-1">
+                {formErrors.passwordNumber}
+              </p>
+            )}
           </div>
 
           <div>
-            <label className="label text-lg" htmlFor="password">
+            <label className="label text-lg" htmlFor="confirmPassword">
+              {" "}
               Confirm Password
             </label>
@@ -372,9 +362,19 @@
               </button>
             </div>
+            {formErrors.confirmPassword && (
+              <p className="text-red-500 text-xs mt-1">
+                {formErrors.confirmPassword}
+              </p>
+            )}
+            {formErrors.passwordMatch && (
+              <p className="text-red-500 text-xs mt-1">
+                {formErrors.passwordMatch}
+              </p>
+            )}
           </div>
 
           <button
             type="submit"
-            className="btn bg-black btn-xs sm:btn-sm md:btn-md lg:btn-lg xl:btn-xl flex items-center justify-center"
+            className="btn bg-black btn-xs sm:btn-sm md:btn-md lg:btn-lg xl:btn-xl w-full flex items-center justify-center" // Added w-full for consistency
             disabled={loading}
           >
@@ -384,9 +384,9 @@
             Register
           </button>
-          {error ? (
-            <p className="text-red-500 text-sm mt-1">{error}</p>
-          ) : (
-            <p className="text-sm mt-1">
-              *Must register with your students address
+
+          {!generalError && Object.keys(formErrors).length === 0 && (
+            <p className="text-sm mt-1 text-center">
+              {" "}
+              *Must register with your FINKI student email address.
             </p>
           )}
