Index: my-react-app/package-lock.json
===================================================================
--- my-react-app/package-lock.json	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/package-lock.json	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -14,4 +14,5 @@
         "axios": "^1.6.7",
         "bootstrap": "^5.3.2",
+        "jwt-decode": "^4.0.0",
         "react": "^18.2.0",
         "react-dom": "^18.2.0",
@@ -12268,4 +12269,12 @@
       }
     },
+    "node_modules/jwt-decode": {
+      "version": "4.0.0",
+      "resolved": "https://registry.npmjs.org/jwt-decode/-/jwt-decode-4.0.0.tgz",
+      "integrity": "sha512-+KJGIyHgkGuIq3IEBNftfhW/LfWhXUIY6OmyVWjliu5KH1y0fw7VQ8YndE2O4qZdMSd9SqbnC8GOcZEy0Om7sA==",
+      "engines": {
+        "node": ">=18"
+      }
+    },
     "node_modules/keyv": {
       "version": "4.5.4",
Index: my-react-app/package.json
===================================================================
--- my-react-app/package.json	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/package.json	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -9,4 +9,5 @@
     "axios": "^1.6.7",
     "bootstrap": "^5.3.2",
+    "jwt-decode": "^4.0.0",
     "react": "^18.2.0",
     "react-dom": "^18.2.0",
Index: my-react-app/src/App.js
===================================================================
--- my-react-app/src/App.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/App.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,3 +1,3 @@
-import {BrowserRouter as Router, Route, Routes, useNavigate} from 'react-router-dom';
+import {BrowserRouter as Router, Navigate, Route, Routes, useNavigate} from 'react-router-dom';
 import Customers from './components/Customers';
 import Layout from "./components/Layout";
@@ -14,8 +14,22 @@
 import { CuisineContext } from './components/CuisineContext';
 import RestaurantInfo from "./components/RestaurantInfo";
-import LoginForm from "./components/Login";
+import AuthForm from "./components/AuthForm";
 import AppContent from "./components/AppContent";
+import ReservationHistory from "./components/ReservationHistory";
+
+const ProtectedRoute = ({ element, isAuthenticated }) => {
+    return isAuthenticated ? element : <Navigate to="/login" />;
+};
 
 const App = () => {
+    const [isAuthenticated, setIsAuthenticated] = React.useState(false);
+
+    React.useEffect(() => {
+        const token = localStorage.getItem('token');
+        if (token) {
+            setIsAuthenticated(true);
+        }
+    }, []);
+
     return (
         <Router>
@@ -23,21 +37,22 @@
                 <Routes>
                     <Route path="/" element={<Home />} />
-                    <Route path="/customers" element={<Customers />} />
-                    <Route path="/customers/add" element={<CustomerFormContainer/>} />
-                    <Route path="/customers/:id" element={<CustomerDetails />} />
-                    <Route path="/customers/edit/:id" element={<CustomerFormContainer/>} />
-                    <Route path="/restaurants" element={<Restaurants />} />
-                    <Route path="/restaurants/:id" element={<RestaurantDetails />} />
-                    <Route path="/reservations" element={<Reservations />} />
-                    <Route path="/reservationConfirmation/:tableNumber/:timeSlot/:restaurantId" element={<ReservationConfirmation />} />
-                    <Route path="/reservations/reservationEdit/:reservationId" element={<ReservationEdit />} />
-                    <Route path="/login" element={<LoginForm/>}/>
-                    <Route path="/error" element={<ErrorPage/>}/>
+                    <Route path="/customers" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<Customers />} />} />
+                    <Route path="/customers/add" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<CustomerFormContainer />} />} />
+                    <Route path="/customers/:id" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<CustomerDetails />} />} />
+                    <Route path="/customers/edit/:id" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<CustomerFormContainer />} />} />
+                    <Route path="/restaurants" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<Restaurants />} />} />
+                    <Route path="/restaurants/:id" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<RestaurantDetails />} />} />
+                    <Route path="/reservations" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<Reservations />} />} />
+                    <Route path="/reservationConfirmation/:tableNumber/:timeSlot/:restaurantId" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<ReservationConfirmation />} />} />
+                    <Route path="/reservations/reservationEdit/:reservationId" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<ReservationEdit />} />} />
+                    <Route path="/reservations-past" element={<ProtectedRoute isAuthenticated={isAuthenticated} element={<ReservationHistory />} />} />
+                    <Route path="/login" element={<AuthForm setIsAuthenticated={setIsAuthenticated} />} />
+
+                    <Route path="/error" element={<ErrorPage />} />
                 </Routes>
-                <AppContent/>
             </Layout>
         </Router>
     );
-}
+};
 
 
@@ -149,5 +164,5 @@
 
         try {
-            const response = await axios.post('http://localhost:8080/api/search', data);
+            const response = await axios.post('http://localhost:8081/api/search', data);
             const filteredRestaurants = response.data;
             setFilteredRestaurants(filteredRestaurants);
@@ -163,5 +178,5 @@
         const cuisineName = cuisine.replace('Searching by cuisine: ', '');
         try {
-            const response = await axios.post(`http://localhost:8080/api/search/shortcut/${cuisineName}`, cuisineName);
+            const response = await axios.post(`http://localhost:8081/api/search/shortcut/${cuisineName}`, cuisineName);
             console.log(response.data);
             setFilteredRestaurants(response.data)
Index: my-react-app/src/axios_helper.js
===================================================================
--- my-react-app/src/axios_helper.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/axios_helper.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,13 +1,9 @@
 import axios from "axios";
 import data from "bootstrap/js/src/dom/data";
-axios.defaults.baseURL = 'http://localhost:8080'
+axios.defaults.baseURL = 'http://localhost:8081'
 axios.defaults.headers.post["Content-Type"] = 'application/json'
 
 export const getAuthToken = () => {
     return window.localStorage.getItem("auth_token");
-}
-
-export const setAuthToken = (token) => {
-    window.localStorage.setItem("auth_token", token);
 }
 
@@ -24,2 +20,12 @@
     })
 }
+
+export const setAuthToken = (token) => {
+    if (token) {
+        axios.defaults.headers.common['Authorization'] = `Bearer ${token}`;
+        localStorage.setItem('token', token);
+    } else {
+        delete axios.defaults.headers.common['Authorization'];
+        localStorage.removeItem('token');
+    }
+};
Index: my-react-app/src/components/AppContent.js
===================================================================
--- my-react-app/src/components/AppContent.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/AppContent.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,56 +1,93 @@
-import * as React from "react";
+import React from "react";
+import axios from "axios";
 import WelcomeContent from "./WelcomeContent";
 import AuthContent from "./AuthContent";
 import LoginForm from "./LoginForm";
-import { request, setAuthToken } from "../axios_helper";
-import Buttons from './Buttons'
+import AuthForm from "./AuthForm";
+import Buttons from './Buttons';
+import restaurants from "./Restaurants";
 
-export default class AppContent extends React.Component {
+class AppContent extends React.Component {
     constructor(props) {
         super(props);
         this.state = {
-            componentToShow: "welcome"
+            componentToShow: "welcome",
+            isAuthenticated: false,
+            user: null,
+            loading: false // Add loading state
         };
+    }
+
+    componentDidMount() {
+        const token = localStorage.getItem('token');
+        console.log(token);
+        if (token) {
+            this.setAuthToken(token);
+            this.setState({ componentToShow: "restaurants", isAuthenticated: true });
+        }
+    }
+
+    fetchUserDetails = (token) => {
+        console.log("Fetch");
+        axios.get("/api/user")
+            .then((response) => {
+                this.setState({ user: response.data, componentToShow: "restaurants", isAuthenticated: true });
+            })
+            .catch((error) => {
+                console.error("Failed to fetch user details:", error);
+                this.logout();
+            });
     };
 
     login = () => {
-        this.setState({componentToShow: "login"})
+        this.setState({ componentToShow: "login" });
     }
 
     logout = () => {
-        this.setState({componentToShow: "welcome"})
+        localStorage.removeItem('token');
+        this.setAuthToken(null);
+        this.setState({ componentToShow: "welcome", isAuthenticated: false });
     }
 
     onLogin = (e, email, password) => {
         e.preventDefault();
-        request(
-            "POST",
-            "/api/login",
-            {email: email, password: password}
-        ).then((response) => {
-            this.setState({componentToShow: "restaurants"})
-            setAuthToken(response.data.token);
-        }).catch((error) => {
-            this.setState({componentToShow: "welcome"})
-        });
+        // After successful login, save the token
+        axios.post("/api/login", { email, password })
+            .then((response) => {
+                const token = response.data.token;
+                localStorage.setItem('token', token);  // Save the token
+                console.log(token);
+                this.setAuthToken(token);  // Set the token for future requests
+                this.setState({ componentToShow: "restaurants", isAuthenticated: true });
+            })
+            .catch((error) => {
+                console.error("Login failed:", error);
+                this.setState({ componentToShow: "welcome" });
+            });
+
     };
 
     onRegister = (e, firstName, lastName, email, password) => {
         e.preventDefault();
-        request(
-            "POST",
-            "/api/register",
-            {
-                firstName: firstName,
-                lastName: lastName,
-                email: email,
-                password: password
-            }
-        ).then((response) => {
-            this.setState({componentToShow: "restaurants"})
-            setAuthToken(response.data.token);
-        }).catch((error) => {
-            this.setState({componentToShow: "welcome"})
-        });
+        axios.post("/api/register", { firstName, lastName, email, password })
+            .then((response) => {
+                const token = response.data.token;
+                localStorage.setItem('token', token);
+                console.log(token);
+                this.setAuthToken(token);
+                this.fetchUserDetails(token);
+            })
+            .catch((error) => {
+                this.setState({ componentToShow: "welcome" });
+                console.error(error);
+            });
+    };
+
+    setAuthToken = (token) => {
+        if (token) {
+            axios.defaults.headers.common["Authorization"] = `Bearer ${token}`;
+        } else {
+            delete axios.defaults.headers.common["Authorization"];
+        }
     };
 
@@ -58,10 +95,14 @@
         return (
             <div>
-                <Buttons login={this.login} logout={this.logout}></Buttons>
-                {this.state.componentToShow === "welcome" && <WelcomeContent/>}
-                {this.state.componentToShow === "restaurants" && <AuthContent/>}
-                {this.state.componentToShow === "login" && <LoginForm onLogin={this.onLogin} onRegister={this.onRegister}/>}
+                <Buttons login={this.login} logout={this.logout} />
+                {this.state.componentToShow === "welcome" && <WelcomeContent />}
+                {this.state.componentToShow === "restaurants" && <AuthContent />}
+                {this.state.componentToShow === "login" && <LoginForm onLogin={this.onLogin} onRegister={this.onRegister} />}
+                {this.state.loading && <div>Loading...</div>} {/* Show loading state */}
             </div>
-        )
+        );
     }
 }
+
+
+export default AppContent;
Index: my-react-app/src/components/AuthContent.js
===================================================================
--- my-react-app/src/components/AuthContent.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/AuthContent.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -28,5 +28,5 @@
                         <p>Cuisine Type: {restaurant.cuisineType}</p>
                         <p>Address: {restaurant.address}</p>
-
+                        <p>User: {}</p>
                     </div>
                 ))}
Index: my-react-app/src/components/AuthForm.js
===================================================================
--- my-react-app/src/components/AuthForm.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
+++ my-react-app/src/components/AuthForm.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -0,0 +1,204 @@
+import React, { useState } from 'react';
+import axios from 'axios';
+import { useNavigate } from 'react-router-dom';
+import 'bootstrap/dist/css/bootstrap.min.css';
+import classNames from 'classnames';
+import MembershipsEnum from './MembershipsEnum';
+
+const AuthForm = () => {
+    const navigate = useNavigate();
+    const [activeTab, setActiveTab] = useState('login');
+    const [credentials, setCredentials] = useState({
+        firstName: '',
+        lastName: '',
+        email: '',
+        password: '',
+        phone: '',
+        address: '',
+        membershipLevel: ''
+    });
+    const [error, setError] = useState('');
+
+    const handleChange = (e) => {
+        const { name, value } = e.target;
+        setCredentials({ ...credentials, [name]: value });
+    };
+
+    const handleLogin = async (e) => {
+        e.preventDefault();
+        try {
+            const response = await axios.post('http://localhost:8081/api/login', {
+                email: credentials.email,
+                password: credentials.password
+            });
+
+            const { token } = response.data;
+            localStorage.setItem('token', token);
+            navigate('/');
+        } catch (err) {
+            setError('Login failed. Please check your credentials.');
+        }
+    };
+
+    const handleRegister = async (e) => {
+        e.preventDefault();
+        try {
+            await axios.post('http://localhost:8081/api/register', {
+                firstName: credentials.firstName,
+                lastName: credentials.lastName,
+                email: credentials.email,
+                password: credentials.password,
+                phone: credentials.phone,
+                address: credentials.address,
+                membershipLevel: credentials.membershipLevel
+            });
+            setActiveTab('login');
+            alert('Registration successful. Please log in.');
+        } catch (err) {
+            setError('Registration failed. Please try again.');
+        }
+    };
+
+    return (
+        <div className="container mt-5">
+            <ul className="nav nav-pills nav-justified mb-3">
+                <li className="nav-item">
+                    <button
+                        className={classNames('nav-link', { active: activeTab === 'login' })}
+                        onClick={() => setActiveTab('login')}
+                    >
+                        Login
+                    </button>
+                </li>
+                <li className="nav-item">
+                    <button
+                        className={classNames('nav-link', { active: activeTab === 'register' })}
+                        onClick={() => setActiveTab('register')}
+                    >
+                        Register
+                    </button>
+                </li>
+            </ul>
+
+            {activeTab === 'login' && (
+                <form onSubmit={handleLogin}>
+                    <div className="form-outline mb-4">
+                        <input
+                            type="email"
+                            name="email"
+                            className="form-control"
+                            placeholder="Email"
+                            value={credentials.email}
+                            onChange={handleChange}
+                            required
+                        />
+                    </div>
+                    <div className="form-outline mb-4">
+                        <input
+                            type="password"
+                            name="password"
+                            className="form-control"
+                            placeholder="Password"
+                            value={credentials.password}
+                            onChange={handleChange}
+                            required
+                        />
+                    </div>
+                    {error && <div className="text-danger mb-3">{error}</div>}
+                    <button type="submit" className="btn btn-primary w-100">Login</button>
+                </form>
+            )}
+
+            {activeTab === 'register' && (
+                <form onSubmit={handleRegister}>
+                    <div className="form-outline mb-4">
+                        <input
+                            type="text"
+                            name="firstName"
+                            className="form-control"
+                            placeholder="First Name"
+                            value={credentials.firstName}
+                            onChange={handleChange}
+                            required
+                        />
+                    </div>
+                    <div className="form-outline mb-4">
+                        <input
+                            type="text"
+                            name="lastName"
+                            className="form-control"
+                            placeholder="Last Name"
+                            value={credentials.lastName}
+                            onChange={handleChange}
+                            required
+                        />
+                    </div>
+                    <div className="form-outline mb-4">
+                        <input
+                            type="email"
+                            name="email"
+                            className="form-control"
+                            placeholder="Email"
+                            value={credentials.email}
+                            onChange={handleChange}
+                            required
+                        />
+                    </div>
+                    <div className="form-outline mb-4">
+                        <input
+                            type="password"
+                            name="password"
+                            className="form-control"
+                            placeholder="Password"
+                            value={credentials.password}
+                            onChange={handleChange}
+                            required
+                        />
+                    </div>
+                    <div className="form-outline mb-4">
+                        <input
+                            type="text"
+                            name="phone"
+                            className="form-control"
+                            placeholder="Phone"
+                            value={credentials.phone}
+                            onChange={handleChange}
+                            required
+                        />
+                    </div>
+                    <div className="form-outline mb-4">
+                        <input
+                            type="text"
+                            name="address"
+                            className="form-control"
+                            placeholder="Address"
+                            value={credentials.address}
+                            onChange={handleChange}
+                            required
+                        />
+                    </div>
+                    <div className="form-outline mb-4">
+                        <select
+                            name="membershipLevel"
+                            className="form-control"
+                            value={credentials.membershipLevel}
+                            onChange={handleChange}
+                            required
+                        >
+                            <option value="">Select Membership Type</option>
+                            {MembershipsEnum().map((membership, index) => (
+                                <option key={index} value={membership}>
+                                    {membership}
+                                </option>
+                            ))}
+                        </select>
+                    </div>
+                    {error && <div className="text-danger mb-3">{error}</div>}
+                    <button type="submit" className="btn btn-success w-100">Register</button>
+                </form>
+            )}
+        </div>
+    );
+};
+
+export default AuthForm;
Index: my-react-app/src/components/CuisineContext.js
===================================================================
--- my-react-app/src/components/CuisineContext.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/CuisineContext.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -10,5 +10,5 @@
         const fetchCuisineTypes = async () => {
             try {
-                const response = await axios.get('http://localhost:8080/api/cuisineTypes');
+                const response = await axios.get('http://localhost:8081/api/cuisineTypes');
                 setCuisineTypes(response.data);
             } catch (error) {
Index: my-react-app/src/components/CustomerContext.js
===================================================================
--- my-react-app/src/components/CustomerContext.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/CustomerContext.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -10,5 +10,5 @@
         const fetchCustomers = async () => {
             try {
-                const response = await axios.get("http://localhost:8080/api/customers");
+                const response = await axios.get("http://localhost:8081/api/customers");
                 setCustomers(response.data)
             } catch (error) {
Index: my-react-app/src/components/CustomerDetails.js
===================================================================
--- my-react-app/src/components/CustomerDetails.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/CustomerDetails.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -10,5 +10,5 @@
         const fetchCustomer = async () => {
             try {
-                const response = await axios.get(`http://localhost:8080/api/customers/${id}`);
+                const response = await axios.get(`http://localhost:8081/api/customers/${id}`);
                 setCustomer(response.data);
             } catch (error) {
Index: my-react-app/src/components/CustomerFormContainer.js
===================================================================
--- my-react-app/src/components/CustomerFormContainer.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/CustomerFormContainer.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -26,5 +26,5 @@
             const fetchCustomer = async () => {
                 try {
-                    const response = await axios.get(`http://localhost:8080/api/customers/${id}`);
+                    const response = await axios.get(`http://localhost:8081/api/customers/${id}`);
                     const customerData = response.data;
                     setFormData({
@@ -54,7 +54,7 @@
         try {
             if (customer) {
-                await axios.put(`http://localhost:8080/api/customers/edit/${customer.id}`, formData);
+                await axios.put(`http://localhost:8081/api/customers/edit/${customer.id}`, formData);
             } else {
-                await axios.post("http://localhost:8080/api/customers", formData);
+                await axios.post("http://localhost:8081/api/customers", formData);
             }
             navigate("/customers");
Index: my-react-app/src/components/Customers.js
===================================================================
--- my-react-app/src/components/Customers.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/Customers.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -26,5 +26,5 @@
     const handleDeleteClick = async (customerId) => {
         try {
-            await axios.delete(`http://localhost:8080/api/customers/delete/${customerId}`);
+            await axios.delete(`http://localhost:8081/api/customers/delete/${customerId}`);
             setCustomers(customers.filter(customer => customer.customerID !== customerId));
             window.location.reload();
@@ -48,6 +48,5 @@
                                     <p className="card-text"><strong>Phone:</strong> {customer.phone}</p>
                                     <p className="card-text"><strong>Address:</strong> {customer.address}</p>
-                                    <p className="card-text"><strong>Membership
-                                        Level:</strong> {customer.membershipLevel}</p>
+                                    <p className="card-text"><strong>Membership Level:</strong> {customer.membershipLevel}</p>
                                     {/*<p className="card-text"><strong>Registration*/}
                                     {/*    Date:</strong> {new Date(customer.registrationDate).toLocaleString()}</p>*/}
Index: my-react-app/src/components/Header.js
===================================================================
--- my-react-app/src/components/Header.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/Header.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,6 +1,18 @@
 import React from 'react';
-import { Link } from 'react-router-dom';
+import { Link, useNavigate } from 'react-router-dom';
 
 const Header = () => {
+    const navigate = useNavigate();
+
+    // Check if the user is logged in by looking for a token in localStorage
+    const isLoggedIn = localStorage.getItem('token');
+
+    const handleLogout = () => {
+        // Clear the token from localStorage
+        localStorage.removeItem('token');
+        // Redirect to the home page or login page after logging out
+        navigate('/login');
+    };
+
     return (
         <header className="header navbar navbar-expand-lg navbar-light bg-light">
@@ -15,10 +27,4 @@
                         </li>
                         <li className="nav-item">
-                            <Link className="nav-link" to="/customers">Customers</Link>
-                        </li>
-                        <li className="nav-item">
-                            <Link className="nav-link" to="/customers/add">Add Customer</Link>
-                        </li>
-                        <li className="nav-item">
                             <Link className="nav-link" to="/restaurants">Restaurants</Link>
                         </li>
@@ -26,6 +32,13 @@
                             <Link className="nav-link" to="/reservations">Reservations</Link>
                         </li>
+                        <li className="nav-item">
+                            <Link className="nav-link" to="/reservations-past">Reservation history</Link>
+                        </li>
                         <form className="form-inline mt-2 mt-md-0 ml-3">
-                            <Link className="btn btn-outline-info my-2 my-sm-0" to={"/login"}>Login</Link>
+                            {isLoggedIn ? (
+                                <button className="btn btn-outline-danger my-2 my-sm-0" onClick={handleLogout}>Logout</button>
+                            ) : (
+                                <Link className="btn btn-outline-info my-2 my-sm-0" to="/login">Login</Link>
+                            )}
                         </form>
                     </ul>
Index: my-react-app/src/components/Login.js
===================================================================
--- my-react-app/src/components/Login.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/Login.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -6,4 +6,5 @@
     const navigate = useNavigate();
     const [credentials, setCredentials] = useState({ username: '', password: '' });
+    const [error, setError] = useState('');
 
     const handleChange = (e) => {
@@ -15,10 +16,11 @@
         e.preventDefault();
         try {
-            const response = await axios.post('http://localhost:8080/api/login', {
+            const response = await axios.post('http://localhost:8081/api/login', {
                 email: credentials.username,
                 password: credentials.password
             });
             const { token } = response.data;
-            // Store token securely (e.g., using HTTP cookies)
+
+            // Store token securely (consider httpOnly cookies)
             localStorage.setItem('token', token);
 
@@ -27,7 +29,7 @@
             // Handle login failure
             console.error('Login failed:', error);
+            setError('Login failed. Please check your credentials and try again.');
         }
     };
-
 
     return (
@@ -53,4 +55,5 @@
                     />
                 </div>
+                {error && <div style={{ color: 'red' }}>{error}</div>}
                 <button type="submit">Login</button>
             </form>
Index: my-react-app/src/components/LoginForm.js
===================================================================
--- my-react-app/src/components/LoginForm.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/LoginForm.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -55,12 +55,15 @@
                     <div className="tab-content">
                         <div
-                            className={classNames("tab-pane", "fade", this.state.active === "login" ? "show active" : "")} id="pills-login">
+                            className={classNames("tab-pane", "fade", this.state.active === "login" ? "show active" : "")}
+                            id="pills-login">
                             <form onSubmit={this.onSubmitLogin}>
                                 <div className="form-outline mb-4">
-                                    <input type="email" id="email" name="email" className="form-control" onChange={this.onChangeHandler}/>
+                                    <input type="email" id="email" name="email" className="form-control"
+                                           onChange={this.onChangeHandler}/>
                                     <label className="form-label" htmlFor="email">Email</label>
                                 </div>
                                 <div className="form-outline mb-4">
-                                    <input type="password" id="loginPassword" name="password" className="form-control" onChange={this.onChangeHandler}/>
+                                    <input type="password" id="loginPassword" name="password" className="form-control"
+                                           onChange={this.onChangeHandler}/>
                                     <label className="form-label" htmlFor="loginPassword">Password</label>
                                 </div>
@@ -71,24 +74,29 @@
 
                         <div
-                            className={classNames("tab-pane", "fade", this.state.active === "register" ? "show active" : "")} id="pills-register">
+                            className={classNames("tab-pane", "fade", this.state.active === "register" ? "show active" : "")}
+                            id="pills-register">
                             <form onSubmit={this.onSubmitRegister}>
                                 <div className="form-outline mb-4">
-                                    <input type="text" id="firstName" name="firstName" className="form-control" onChange={this.onChangeHandler}/>
+                                    <input type="text" id="firstName" name="firstName" className="form-control"
+                                           onChange={this.onChangeHandler}/>
                                     <label className="form-label" htmlFor="firstName">First Name</label>
                                 </div>
                                 <div className="form-outline mb-4">
-                                    <input type="text" id="lastName" name="lastName" className="form-control" onChange={this.onChangeHandler}/>
+                                    <input type="text" id="lastName" name="lastName" className="form-control"
+                                           onChange={this.onChangeHandler}/>
                                     <label className="form-label" htmlFor="lastName">Last Name</label>
                                 </div>
                                 <div className="form-outline mb-4">
-                                    <input type="text" id="email" name="email" className="form-control" onChange={this.onChangeHandler}/>
+                                    <input type="email" id="email" name="email" className="form-control"
+                                           onChange={this.onChangeHandler}/>
                                     <label className="form-label" htmlFor="email">Email</label>
                                 </div>
                                 <div className="form-outline mb-4">
-                                    <input type="password" id="loginPassword" name="password" className="form-control" onChange={this.onChangeHandler}/>
+                                    <input type="password" id="loginPassword" name="password" className="form-control"
+                                           onChange={this.onChangeHandler}/>
                                     <label className="form-label" htmlFor="loginPassword">Password</label>
                                 </div>
 
-                                <button type="submit" className="btn btn-primary btn-block mb-4">Sign In</button>
+                                <button type="submit" className="btn btn-primary btn-block mb-4">Register</button>
                             </form>
                         </div>
@@ -96,5 +104,6 @@
                 </div>
             </div>
-        )
+        );
+
     }
 }
Index: my-react-app/src/components/MembershipsEnum.js
===================================================================
--- my-react-app/src/components/MembershipsEnum.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/MembershipsEnum.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -3,21 +3,5 @@
 
 const MembershipsEnum = () => {
-    const [memberships, setMemberships] = useState([]);
-
-    useEffect(() => {
-        const fetchMemberships = async () => {
-            try {
-                const response = await axios.get('http://localhost:8080/api/memberships');
-                // Assuming the response.data is an array of enum values
-                setMemberships(response.data);
-            } catch (error) {
-                console.error('Error fetching enum data:', error);
-            }
-        };
-
-        fetchMemberships();
-    }, []);
-
-    return memberships;
+    return ['GOLD', 'PLATINUM', 'STANDARD'];
 };
 
Index: my-react-app/src/components/ReservationConfirmation.js
===================================================================
--- my-react-app/src/components/ReservationConfirmation.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/ReservationConfirmation.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -3,4 +3,5 @@
 import axios from 'axios';
 import { useNavigate } from 'react-router-dom';
+import {jwtDecode} from "jwt-decode";
 
 const ReservationConfirmation = () => {
@@ -17,8 +18,8 @@
         const fetchTableDetails = async () => {
             try {
-                const tableResponse = await axios.get(`http://localhost:8080/api/tables/${tableNumber}`);
+                const tableResponse = await axios.get(`http://localhost:8081/api/tables/${tableNumber}`);
                 setTable(tableResponse.data);
 
-                const restaurantResponse = await axios.get(`http://localhost:8080/api/restaurants/${restaurantId}`);
+                const restaurantResponse = await axios.get(`http://localhost:8081/api/restaurants/${restaurantId}`);
                 setRestaurant(restaurantResponse.data);
             } catch (error) {
@@ -31,22 +32,39 @@
     const handleSubmit = async (e) => {
         e.preventDefault();
-        // Handle form submission here
+
+        if (!restaurant || !table) {
+            console.error("Restaurant or table is missing.");
+            return;
+        }
+
         try {
-            // Check if restaurant and table are valid
-            if (!restaurant || !table) {
-                console.error("Restaurant or table is missing.");
+            const token = localStorage.getItem("token");
+            if (!token) {
+                console.error("No token found");
                 return;
             }
 
-            const response = await axios.post(`http://localhost:8080/api/reservations`, {
-                restaurant: restaurant, // Assuming restaurant has an 'id' property
-                table: table, // Assuming table has an 'id' property
-                checkInTime: timeSlot, // Fill in as needed
-                partySize: partySize,
-                specialRequests: specialRequests
-            });
-            // Handle successful reservation creation
-            // console.log("Reservation created:", response.data);
-            navigate("/reservations")
+            // Decode the token to get the user email
+            const decodedToken = jwtDecode(token);
+            console.log(decodedToken)
+            const userId = decodedToken.iss;// Assuming the email is part of the decoded JWT token
+
+            const response = await axios.post(
+                `http://localhost:8081/api/reservations/${userId}`,
+                {
+                    restaurant: restaurant,
+                    table: table,
+                    checkInTime: timeSlot,
+                    partySize: partySize,
+                    specialRequests: specialRequests
+                },
+                {
+                    headers: {
+                        Authorization: `Bearer ${token}` // Include the token here
+                    }
+                }
+            );
+
+            navigate("/reservations");
         } catch (error) {
             console.error("Error creating reservation:", error);
Index: my-react-app/src/components/ReservationEdit.js
===================================================================
--- my-react-app/src/components/ReservationEdit.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/ReservationEdit.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -3,4 +3,5 @@
 import {useNavigate, useParams} from 'react-router-dom';
 import StarRating from "./StarRating";
+import {jwtDecode} from "jwt-decode";
 
 const ReservationEdit = () => {
@@ -14,4 +15,5 @@
     const [timeSlots, setTimeSlots] = useState([]);
     const [filteredTimeSlots, setFilteredTimeSlots] = useState([]);
+    const [checkInTime, setCheckInTime] = useState([]);
 
     useEffect(() => {
@@ -19,6 +21,7 @@
             try {
                 setIsLoading(true);
-                const response = await axios.get(`http://localhost:8080/api/reservations/${reservationId}`);
-                setFormData(response.data); // Set form data with reservation data
+                const response = await axios.get(`http://localhost:8081/api/reservations/${reservationId}`);
+                setCheckInTime(response.data.checkInTime)
+                setFormData(response.data);
                 setTable(response.data.table);
                 setRestaurant(response.data.restaurant);
@@ -56,8 +59,18 @@
     const handleSubmit = async (e) => {
         e.preventDefault();
+
         try {
-            // Send updated reservation data to the server
-            await axios.post(`http://localhost:8080/api/reservations/${reservationId}`, formData);
-            // Redirect or show success message
+            const token = localStorage.getItem("token");
+            if (!token) {
+                console.error("No token found");
+                return;
+            }
+
+            const decodedToken = jwtDecode(token);
+            console.log(decodedToken)
+            const userId = decodedToken.iss;
+
+            await axios.post(`http://localhost:8081/api/reservations/${reservationId}/${userId}`, formData);
+
             navigate(`/reservations`)
         } catch (error) {
@@ -71,4 +84,11 @@
         const formattedTime = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' });
         return `${formattedDate} - ${formattedTime}`;
+    };
+
+    const formatCurrentTimeSlot = (timeSlot) => {
+        const date = new Date(timeSlot);
+        const formattedDate = date.toLocaleDateString('en-GB'); // Format date as YYYY-MM-DD
+        const formattedTime = date.toLocaleTimeString([], { hour: '2-digit', minute: '2-digit' }); // Format time as HH:MM
+        return `${formattedDate} ${formattedTime}`;
     };
 
@@ -100,4 +120,5 @@
                                 ))}
                             </select>
+                            <label className=".text-danger">Current check in time: {formatTimeSlot(checkInTime)}</label>
                         </div>
                         <div className="mb-3">
Index: my-react-app/src/components/ReservationHistory.js
===================================================================
--- my-react-app/src/components/ReservationHistory.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
+++ my-react-app/src/components/ReservationHistory.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -0,0 +1,79 @@
+import React, { useEffect, useState } from "react";
+import {jwtDecode} from "jwt-decode";
+import axios from "axios";
+
+const ReservationHistory = () => {
+    const [reservations, setReservations] = useState([]);
+    const [loading, setLoading] = useState(true);
+    const [error, setError] = useState(null);
+
+    useEffect(() => {
+        const fetchReservations = async () => {
+            try {
+                const token = localStorage.getItem("token");
+                if (!token) {
+                    setError("User not authenticated.");
+                    setLoading(false);
+                    return;
+                }
+
+                const decodedToken = jwtDecode(token);
+                const userId = decodedToken.iss;
+
+                const response = await axios.get(
+                    `http://localhost:8081/api/past-reservations/${userId}`,
+                    {
+                        headers: { Authorization: `Bearer ${token}` },
+                    }
+                );
+
+                setReservations(response.data);
+            } catch (err) {
+                setError("Failed to fetch reservations.");
+            } finally {
+                setLoading(false);
+            }
+        };
+
+        fetchReservations();
+    }, []);
+
+    if (loading) return <div>Loading...</div>;
+    if (error) return <div className="alert alert-danger">{error}</div>;
+
+    return (
+        <div className="container mt-5">
+            <h3>Past Reservations</h3>
+            <table className="table table-bordered">
+                <thead className="thead-dark">
+                <tr>
+                    <th>#</th>
+                    <th>Restaurant</th>
+                    <th>Table</th>
+                    <th>Date & Time</th>
+                    <th>Party Size</th>
+                    <th>Special Requests</th>
+                    <th>Status</th>
+                    <th>Cancellation Reason</th>
+                </tr>
+                </thead>
+                <tbody>
+                {reservations.map((res, index) => (
+                    <tr key={res.id}>
+                        <td>{index + 1}</td>
+                        <td>{res.restaurant?.name || "N/A"}</td>
+                        <td>{res.table?.id || "N/A"}</td>
+                        <td>{new Date(res.reservationDateTime).toLocaleString()}</td>
+                        <td>{res.partySize}</td>
+                        <td>{res.specialRequests || "None"}</td>
+                        <td>{res.status}</td>
+                        <td>{res.cancellationReason || "None"}</td>
+                    </tr>
+                ))}
+                </tbody>
+            </table>
+        </div>
+    );
+};
+
+export default ReservationHistory;
Index: my-react-app/src/components/Reservations.js
===================================================================
--- my-react-app/src/components/Reservations.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/Reservations.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -3,4 +3,5 @@
 import 'bootstrap/dist/css/bootstrap.min.css';
 import {useNavigate} from "react-router-dom";
+import {jwtDecode} from "jwt-decode";
 
 
@@ -13,5 +14,14 @@
         const fetchReservations = async () => {
             try {
-                const response = await axios.get('http://localhost:8080/api/reservations'); // Adjust URL as needed
+                const token = localStorage.getItem("token");
+                if (!token) {
+                    console.error("No token found");
+                    return;
+                }
+                const decodedToken = jwtDecode(token);
+                console.log(decodedToken)
+                const userId = decodedToken.iss;
+
+                const response = await axios.get(`http://localhost:8081/api/reservations/by/${userId}`);
                 setReservations(response.data);
             } catch (error) {
@@ -31,5 +41,5 @@
     const handleCancelReservation = async (reservationID) => {
         try {
-            await axios.delete(`http://localhost:8080/api/reservations/delete/${reservationID}`);
+            await axios.delete(`http://localhost:8081/api/reservations/delete/${reservationID}`);
             setReservations(reservations.filter(reservation => reservation.reservationID !== reservationID));
             alert('Reservation canceled successfully!');
Index: my-react-app/src/components/RestaurantContext.js
===================================================================
--- my-react-app/src/components/RestaurantContext.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/RestaurantContext.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -10,5 +10,5 @@
         const fetchRestaurants = async () => {
             try {
-                const response = await axios.get('http://localhost:8080/api/restaurants');
+                const response = await axios.get('http://localhost:8081/api/restaurants');
                 setRestaurants(response.data);
             } catch (error) {
@@ -17,5 +17,5 @@
         };
 
-        fetchRestaurants();
+        fetchRestaurants().then(r => console.log(fetchRestaurants()));
     }, []);
 
Index: my-react-app/src/components/RestaurantDetails.js
===================================================================
--- my-react-app/src/components/RestaurantDetails.js	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ my-react-app/src/components/RestaurantDetails.js	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -21,5 +21,5 @@
             try {
                 if (!id) return;
-                const response = await axios.get(`http://localhost:8080/api/restaurants/${id}`);
+                const response = await axios.get(`http://localhost:8081/api/restaurants/${id}`);
                 setRestaurant(response.data);
             } catch (error) {
@@ -36,5 +36,5 @@
         const fetchTableDetails = async () => {
             try {
-                const response = await axios.get(`http://localhost:8080/api/tables/${selectedTableId}`);
+                const response = await axios.get(`http://localhost:8081/api/tables/${selectedTableId}`);
                 setSelectedTable(response.data);
             } catch (error) {
Index: package-lock.json
===================================================================
--- package-lock.json	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ package-lock.json	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -6,4 +6,5 @@
     "": {
       "dependencies": {
+        "classnames": "^2.5.1",
         "react-router-dom": "^6.22.1",
         "swagger-ui-express": "^5.0.0",
Index: package.json
===================================================================
--- package.json	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ package.json	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,4 +1,5 @@
 {
   "dependencies": {
+    "classnames": "^2.5.1",
     "react-router-dom": "^6.22.1",
     "swagger-ui-express": "^5.0.0",
Index: pom.xml
===================================================================
--- pom.xml	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ pom.xml	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -108,4 +108,11 @@
 			<version>4.3.0</version>
 		</dependency>
+
+		<dependency>
+			<groupId>javax.xml.bind</groupId>
+			<artifactId>jaxb-api</artifactId>
+			<version>2.3.1</version>
+		</dependency>
+
 	</dependencies>
 
Index: src/main/java/com/example/rezevirajmasa/demo/bootstrap/ReservationInitializer.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/bootstrap/ReservationInitializer.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/bootstrap/ReservationInitializer.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,48 +1,48 @@
-package com.example.rezevirajmasa.demo.bootstrap;
-
-import com.example.rezevirajmasa.demo.model.Reservation;
-import com.example.rezevirajmasa.demo.model.Restaurant;
-import com.example.rezevirajmasa.demo.service.ReservationHistoryService;
-import com.example.rezevirajmasa.demo.service.ReservationService;
-import org.springframework.stereotype.Component;
-
-import jakarta.annotation.PostConstruct;
-import java.time.LocalDateTime;
-import java.util.List;
-import java.util.stream.Collectors;
-
-@Component
-public class ReservationInitializer {
-    private final ReservationHistoryService reservationHistoryService;
-    private final ReservationService reservationService;
-
-    public ReservationInitializer(ReservationHistoryService reservationHistoryService, ReservationService reservationService) {
-        this.reservationHistoryService = reservationHistoryService;
-        this.reservationService = reservationService;
-    }
-
-    @PostConstruct
-    public void initializePastReservations() {
-        LocalDateTime currentTime = LocalDateTime.now();
-        List<Reservation> reservationsToMove = reservationService.findReservationsToMove(currentTime);
-
-        List<Restaurant.ReservationHistory> reservationHistories = reservationsToMove.stream()
-                .map(reservation -> new Restaurant.ReservationHistory(
-                        reservation.getCustomer(),
-                        reservation.getTable(),
-                        reservation.getRestaurant(),
-                        reservation.getReservationDateTime(),
-                        reservation.getPartySize(),
-                        reservation.getSpecialRequests(),
-                        "Done",
-                        null, // You can set cancellation reason if needed, it's not clear from the code provided
-                        reservation.getCheckInTime() // Use currentTime for check-in date
-                ))
-                .collect(Collectors.toList());
-
-        reservationHistoryService.moveReservationsToPast(reservationHistories);
-
-        reservationsToMove.forEach(reservation -> reservationService.deleteReservation(reservation.getReservationID()));
-    }
-
-}
+//package com.example.rezevirajmasa.demo.bootstrap;
+//
+//import com.example.rezevirajmasa.demo.model.Reservation;
+//import com.example.rezevirajmasa.demo.model.Restaurant;
+//import com.example.rezevirajmasa.demo.service.ReservationHistoryService;
+//import com.example.rezevirajmasa.demo.service.ReservationService;
+//import org.springframework.stereotype.Component;
+//
+//import jakarta.annotation.PostConstruct;
+//import java.time.LocalDateTime;
+//import java.util.List;
+//import java.util.stream.Collectors;
+//
+//@Component
+//public class ReservationInitializer {
+//    private final ReservationHistoryService reservationHistoryService;
+//    private final ReservationService reservationService;
+//
+//    public ReservationInitializer(ReservationHistoryService reservationHistoryService, ReservationService reservationService) {
+//        this.reservationHistoryService = reservationHistoryService;
+//        this.reservationService = reservationService;
+//    }
+//
+//    @PostConstruct
+//    public void initializePastReservations() {
+//        LocalDateTime currentTime = LocalDateTime.now();
+//        List<Reservation> reservationsToMove = reservationService.findReservationsToMove(currentTime);
+//
+//        List<Restaurant.ReservationHistory> reservationHistories = reservationsToMove.stream()
+//                .map(reservation -> new Restaurant.ReservationHistory(
+//                        reservation.getUser(),
+//                        reservation.getTable(),
+//                        reservation.getRestaurant(),
+//                        reservation.getReservationDateTime(),
+//                        reservation.getPartySize(),
+//                        reservation.getSpecialRequests(),
+//                        "Done",
+//                        null,
+//                        reservation.getCheckInTime()
+//                ))
+//                .collect(Collectors.toList());
+//
+//        reservationHistoryService.moveReservationsToPast(reservationHistories);
+//
+//        reservationsToMove.forEach(reservation -> reservationService.deleteReservation(reservation.getReservationID()));
+//    }
+//
+//}
Index: src/main/java/com/example/rezevirajmasa/demo/config/SecurityConfig.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/config/SecurityConfig.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/config/SecurityConfig.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -7,4 +7,5 @@
 import org.springframework.http.HttpMethod;
 import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.config.Customizer;
 import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
 import org.springframework.security.config.annotation.web.builders.HttpSecurity;
@@ -15,6 +16,13 @@
 import org.springframework.security.core.userdetails.UserDetailsService;
 import org.springframework.security.web.SecurityFilterChain;
+import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
 import org.springframework.security.web.authentication.www.BasicAuthenticationFilter;
+import org.springframework.security.web.util.matcher.AntPathRequestMatcher;
 import org.springframework.web.servlet.config.annotation.CorsRegistry;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+import org.springframework.security.web.SecurityFilterChain;
 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
 
@@ -40,33 +48,29 @@
     public void addCorsMappings(CorsRegistry registry) {
         registry.addMapping("/**")
+                .allowedOrigins("http://localhost:3000")
+                .allowedMethods("GET", "POST", "PUT", "DELETE")
+                .allowedHeaders("*")
                 .allowCredentials(true)
-                .allowedOrigins("http://localhost:3000") // Allow requests from this origin
-                .allowedMethods("GET", "POST", "PUT", "DELETE") // Allow these HTTP methods
-                .allowedHeaders("*")
-                .maxAge(3600L); // Allow all headers
+                .maxAge(3600L);
     }
 
 //    @Bean
-//    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception  {
-//
+//    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
 //        http
+//                .exceptionHandling(exception -> exception.authenticationEntryPoint(customerAuthenticationEntryPoint))
+//                .addFilterBefore(new JwtAuthFilter(userAuthProvider), BasicAuthenticationFilter.class)
 //                .csrf(AbstractHttpConfigurer::disable)
-//                .authorizeHttpRequests( (requests) -> requests
-//                        .requestMatchers(AntPathRequestMatcher.antMatcher("/"), AntPathRequestMatcher.antMatcher("/restaurants"))
-//                        .permitAll()
-//                        .anyRequest()
-//                        .hasAnyRole("ADMIN", "USER")
+//                .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+//                .authorizeHttpRequests(requests -> requests
+//                        .requestMatchers(HttpMethod.POST, "/api/login", "/api/register").permitAll()
+//                        .requestMatchers("/", "/home").authenticated()  // Restrict `/` to authenticated users
+//                        .anyRequest().authenticated()
 //                )
-//                .formLogin((form) -> form
-//                        .permitAll()
-//                        .failureUrl("/login?error=BadCredentials")
-//                        .defaultSuccessUrl("/restaurants", true)
-//                )
-//                .logout((logout) -> logout
+//                .logout(logout -> logout
 //                        .logoutUrl("/logout")
 //                        .clearAuthentication(true)
 //                        .invalidateHttpSession(true)
 //                        .deleteCookies("JSESSIONID")
-//                        .logoutSuccessUrl("/")
+//                        .logoutSuccessUrl("/api/login")  // Redirect to login page after logout
 //                );
 //
@@ -83,8 +87,8 @@
                 .authorizeHttpRequests((requests) -> requests
                         .requestMatchers(HttpMethod.POST, "/api/login", "/api/register").permitAll()
-                        .anyRequest().authenticated()
-                );
+                        .anyRequest().authenticated());
         return http.build();
     }
+
     @Bean
     public AuthenticationManager authManager(HttpSecurity http) throws Exception {
@@ -95,2 +99,50 @@
     }
 }
+//
+//import com.example.rezevirajmasa.demo.web.filters.JwtAuthFilter;
+//import org.springframework.context.annotation.Bean;
+//import org.springframework.context.annotation.Configuration;
+//import org.springframework.security.authentication.AuthenticationManager;
+//import org.springframework.security.config.annotation.authentication.builders.AuthenticationManagerBuilder;
+//import org.springframework.security.config.annotation.web.builders.HttpSecurity;
+//import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
+//import org.springframework.security.config.annotation.web.configurers.AbstractHttpConfigurer;
+//import org.springframework.security.config.http.SessionCreationPolicy;
+//import org.springframework.security.core.userdetails.UserDetailsService;
+//import org.springframework.security.web.SecurityFilterChain;
+//import org.springframework.security.web.authentication.UsernamePasswordAuthenticationFilter;
+//
+//@Configuration
+//@EnableWebSecurity
+//public class SecurityConfig {
+//
+//    private final UserDetailsService userDetailsService;
+////    private final UserAuthProvider userAuthProvider;
+//    private final JwtAuthFilter jwtAuthFilter;
+//
+//    public SecurityConfig(UserDetailsService userDetailsService) {
+//        this.userDetailsService = userDetailsService;
+////        this.userAuthProvider = userAuthProvider;
+//        this.jwtAuthFilter = new JwtAuthFilter(userAuthProvider);
+//    }
+//
+//    @Bean
+//    public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
+//        http
+//                .csrf(AbstractHttpConfigurer::disable)
+//                .sessionManagement(sess -> sess.sessionCreationPolicy(SessionCreationPolicy.STATELESS))
+//                .authorizeHttpRequests((requests) -> requests
+//                        .requestMatchers("/api/login", "/api/register").permitAll()
+//                        .anyRequest().authenticated())
+//                .addFilterBefore(jwtAuthFilter, UsernamePasswordAuthenticationFilter.class);
+//
+//        return http.build();
+//    }
+//
+//    @Bean
+//    public AuthenticationManager authenticationManager(HttpSecurity http) throws Exception {
+//        AuthenticationManagerBuilder authenticationManagerBuilder = http.getSharedObject(AuthenticationManagerBuilder.class);
+//        authenticationManagerBuilder.userDetailsService(userDetailsService);
+//        return authenticationManagerBuilder.build();
+//    }
+//}
Index: src/main/java/com/example/rezevirajmasa/demo/config/UserAuthProvider.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/config/UserAuthProvider.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/config/UserAuthProvider.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -7,4 +7,6 @@
 import com.example.rezevirajmasa.demo.dto.UserDto;
 import com.example.rezevirajmasa.demo.service.UserService;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.Jwts;
 import jakarta.annotation.PostConstruct;
 import lombok.RequiredArgsConstructor;
@@ -12,9 +14,9 @@
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.Authentication;
+import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Component;
 
-import java.util.Base64;
-import java.util.Collections;
-import java.util.Date;
+import java.util.*;
+import java.util.function.Function;
 
 @RequiredArgsConstructor
@@ -29,4 +31,9 @@
     protected void init() {
         secretKey = Base64.getEncoder().encodeToString(secretKey.getBytes());
+    }
+
+    public String generateToken(UserDetails userDetails){
+        Map<String, Object> claims = new HashMap<>();
+        return createToken(userDetails.getUsername());
     }
 
@@ -50,3 +57,24 @@
         return new UsernamePasswordAuthenticationToken(user, null, Collections.emptyList());
     }
+
+    public String extractUsername(String token) {
+        return extractClaim(token, Claims::getSubject);
+    }
+
+    public Date extractExpiration(String token) {
+        return extractClaim(token, Claims::getExpiration);
+    }
+
+    public <T> T extractClaim(String token, Function<Claims, T> claimsResolver) {
+        final Claims claims = extractAllClaims(token);
+        return claimsResolver.apply(claims);
+    }
+
+    private Claims extractAllClaims(String token) {
+        return Jwts.parser().setSigningKey(secretKey).parseClaimsJws(token).getBody();
+    }
+
+    private Boolean isTokenExpired(String token) {
+        return extractExpiration(token).before(new Date());
+    }
 }
Index: src/main/java/com/example/rezevirajmasa/demo/dto/CredentialsDto.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/dto/CredentialsDto.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/dto/CredentialsDto.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -11,5 +11,5 @@
 @Data
 public class CredentialsDto {
-    private String login;
+    private String email;
     private char[] password;
 }
Index: src/main/java/com/example/rezevirajmasa/demo/dto/SignUpDto.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/dto/SignUpDto.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/dto/SignUpDto.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -15,3 +15,6 @@
     private String email;
     private char[] password;
+    private String phone;
+    private String address;
+    private String membershipLevel;
 }
Index: src/main/java/com/example/rezevirajmasa/demo/dto/UserDto.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/dto/UserDto.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/dto/UserDto.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -16,3 +16,6 @@
     private String email;
     private String token;
+    private String phone;
+    private String address;
+    private String membershipLevel;
 }
Index: src/main/java/com/example/rezevirajmasa/demo/mappers/UserMapper.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/mappers/UserMapper.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/mappers/UserMapper.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -14,3 +14,6 @@
     @Mapping(target = "password", ignore = true)
     User signUpToUser(SignUpDto userDto);
+
+    SignUpDto toSignUpDto(UserDto userDto);
+    User toUser(UserDto userDto);
 }
Index: src/main/java/com/example/rezevirajmasa/demo/mappers/UserMapperImpl.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/mappers/UserMapperImpl.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/mappers/UserMapperImpl.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -3,4 +3,5 @@
 import com.example.rezevirajmasa.demo.dto.SignUpDto;
 import com.example.rezevirajmasa.demo.dto.UserDto;
+import com.example.rezevirajmasa.demo.model.MembershipLevel;
 import com.example.rezevirajmasa.demo.model.User;
 import org.springframework.stereotype.Component;
@@ -36,5 +37,41 @@
         user.setFirstName(userDto.getFirstName());
         user.setLastName(userDto.getLastName());
-        user.setPassword(Arrays.toString(userDto.getPassword()));
+        user.setPassword(Arrays.toString(userDto.getPassword())); // Assuming password is a char[] or string array.
+
+        return user;
+    }
+
+    @Override
+    public SignUpDto toSignUpDto(UserDto userDto) {
+        if (userDto == null) {
+            return null;
+        }
+
+        SignUpDto signUpDto = new SignUpDto();
+        signUpDto.setEmail(userDto.getEmail());
+        signUpDto.setFirstName(userDto.getFirstName());
+        signUpDto.setLastName(userDto.getLastName());
+
+        // Since SignUpDto has password field, you may set it if needed.
+        // Assuming a default value or handling empty password as required.
+        signUpDto.setPassword(new char[0]); // Empty password for now or assign actual value if required.
+
+        return signUpDto;
+    }
+
+    @Override
+    public User toUser(UserDto userDto) {
+        if(userDto == null) {
+            return null;
+        }
+
+        User user = new User();
+        user.setLastName(userDto.getLastName());
+        user.setFirstName(userDto.getFirstName());
+        user.setPhone(userDto.getPhone());
+        user.setMembershipLevel(MembershipLevel.valueOf(userDto.getMembershipLevel()));
+        user.setAddress(userDto.getAddress());
+        user.setEmail(userDto.getEmail());
+        user.setId(userDto.getId());
 
         return user;
Index: src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/model/Reservation.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -16,6 +16,6 @@
 
     @ManyToOne
-    @JoinColumn(name = "CustomerID")
-    private Customer customer;
+    @JoinColumn(name = "UserID")
+    private User user;
 
     @ManyToOne
@@ -68,7 +68,8 @@
     }
 
-    public Reservation(Customer customer, TableEntity table, Restaurant restaurant, LocalDateTime reservationDateTime, int partySize, String specialRequests, String status, LocalDateTime checkInTime, LocalDateTime checkOutTime, String paymentStatus) {
+    public Reservation(User user, TableEntity table, Restaurant restaurant, LocalDateTime reservationDateTime, int partySize, String specialRequests, String status, LocalDateTime checkInTime, LocalDateTime checkOutTime, String paymentStatus) {
 //        this.customer = customer;
         this.table = table;
+        this.user = user;
         this.restaurant = restaurant;
         this.reservationDateTime = reservationDateTime;
@@ -81,4 +82,12 @@
     }
 
+    public User getUser() {
+        return user;
+    }
+
+    public void setUser(User user) {
+        this.user = user;
+    }
+
     public Long getReservationID() {
         return reservationID;
@@ -89,11 +98,4 @@
     }
 
-    public Customer getCustomer() {
-        return customer;
-    }
-
-    public void setCustomer(Customer customer) {
-        this.customer = customer;
-    }
 
     public TableEntity getTable() {
@@ -173,5 +175,5 @@
         return "Reservation{" +
                 "reservationID=" + reservationID +
-                ", customer=" + customer +
+                ", customer=" + user +
                 ", table=" + table +
                 ", restaurant=" + restaurant +
Index: src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/model/Restaurant.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -151,5 +151,5 @@
         @ManyToOne
         @JoinColumn(name = "customer_id")
-        private Customer customer;
+        private User user;
 
         @ManyToOne
@@ -179,6 +179,6 @@
         private LocalDateTime checkInDate;
 
-        public ReservationHistory(Customer customer, TableEntity table, Restaurant restaurant, LocalDateTime reservationDateTime, int partySize, String specialRequests, String status, String cancellationReason, LocalDateTime checkInDate) {
-            this.customer = customer;
+        public ReservationHistory(User user, TableEntity table, Restaurant restaurant, LocalDateTime reservationDateTime, int partySize, String specialRequests, String status, String cancellationReason, LocalDateTime checkInDate) {
+            this.user = user;
             this.table = table;
             this.restaurant = restaurant;
@@ -202,10 +202,10 @@
         }
 
-        public Customer getCustomer() {
-            return customer;
-        }
-
-        public void setCustomer(Customer customer) {
-            this.customer = customer;
+        public User getUser() {
+            return user;
+        }
+
+        public void setUser(User user) {
+            this.user = user;
         }
 
@@ -278,5 +278,5 @@
             return "ReservationHistory{" +
                     "id=" + id +
-                    ", customer=" + customer +
+                    ", user=" + user +
                     ", table=" + table +
                     ", restaurant=" + restaurant +
Index: src/main/java/com/example/rezevirajmasa/demo/model/User.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/model/User.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/model/User.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -7,4 +7,6 @@
 import lombok.NoArgsConstructor;
 import org.springframework.web.bind.annotation.GetMapping;
+
+import java.util.Date;
 
 @AllArgsConstructor
@@ -31,3 +33,20 @@
     @Column(nullable = false)
     private String password;
+
+    @Enumerated(EnumType.STRING)
+    private Role role;
+
+    @Column(name = "Phone", length = 20)
+    private String phone;
+
+    @Column(name = "Address", columnDefinition = "TEXT")
+    private String address;
+
+    @Enumerated(EnumType.STRING)
+    @Column(name = "MembershipLevel", length = 20)
+    private MembershipLevel membershipLevel;
+
+    @Column(name = "RegistrationDate", columnDefinition = "TIMESTAMP DEFAULT CURRENT_TIMESTAMP")
+    @Temporal(TemporalType.TIMESTAMP)
+    private Date registrationDate;
 }
Index: src/main/java/com/example/rezevirajmasa/demo/repository/ReservationHistoryRepository.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/repository/ReservationHistoryRepository.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/repository/ReservationHistoryRepository.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -4,4 +4,5 @@
 import com.example.rezevirajmasa.demo.model.Reservation;
 import com.example.rezevirajmasa.demo.model.Restaurant;
+import com.example.rezevirajmasa.demo.model.User;
 import org.springframework.cglib.core.Local;
 import org.springframework.data.jpa.repository.JpaRepository;
@@ -11,5 +12,5 @@
 
 public interface ReservationHistoryRepository extends JpaRepository<Restaurant.ReservationHistory, Long> {
-    List<Restaurant.ReservationHistory> findAllByCustomer(Customer customer);
+    List<Restaurant.ReservationHistory> findALlByUser(User user);
     List<Restaurant.ReservationHistory> findByCheckInDateBeforeAndStatus(LocalDateTime currentTime, String scheduled);
     List<Restaurant.ReservationHistory> findAllByCheckInDateBefore(LocalDateTime currentTime);
Index: src/main/java/com/example/rezevirajmasa/demo/repository/ReservationRepository.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/repository/ReservationRepository.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/repository/ReservationRepository.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,8 +1,5 @@
 package com.example.rezevirajmasa.demo.repository;
 
-import com.example.rezevirajmasa.demo.model.Customer;
-import com.example.rezevirajmasa.demo.model.Reservation;
-import com.example.rezevirajmasa.demo.model.Restaurant;
-import com.example.rezevirajmasa.demo.model.TableEntity;
+import com.example.rezevirajmasa.demo.model.*;
 import org.springframework.data.jpa.repository.JpaRepository;
 
@@ -11,5 +8,5 @@
 
 public interface ReservationRepository extends JpaRepository<Reservation, Long> {
-    List<Reservation> findAllByCustomer(Customer customer);
+    List<Reservation> findALlByUserAndCheckInTimeAfter(User user, LocalDateTime now);
     List<Reservation> findByTableAndCheckInTimeBetween(TableEntity table, LocalDateTime startTime, LocalDateTime endTime);
 
@@ -17,3 +14,4 @@
     List<Reservation> findAllByCheckInTimeBefore(LocalDateTime currentTime);
     List<Reservation> findByCheckInTimeAfterAndCheckInTimeBefore(LocalDateTime startTime, LocalDateTime endTime);
+    List<Reservation> findALlByUserAndCheckInTimeBefore(User user, LocalDateTime now);
 }
Index: src/main/java/com/example/rezevirajmasa/demo/service/ReservationHistoryService.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/ReservationHistoryService.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/service/ReservationHistoryService.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -4,4 +4,5 @@
 import com.example.rezevirajmasa.demo.model.Reservation;
 import com.example.rezevirajmasa.demo.model.Restaurant;
+import com.example.rezevirajmasa.demo.model.User;
 
 import java.time.LocalDateTime;
@@ -11,5 +12,5 @@
     public void moveReservationToHistory(Reservation reservation, String status, String cancellationReason);
     public void moveReservationsToPast(List<Restaurant.ReservationHistory> reservationsToMove);
-    List<Restaurant.ReservationHistory> findByCustomer(Customer customer);
+    List<Restaurant.ReservationHistory> findByUser(User user);
     List<Restaurant.ReservationHistory> findAll();
     List<Restaurant.ReservationHistory> findReservationsToMove(LocalDateTime currentTime);
Index: src/main/java/com/example/rezevirajmasa/demo/service/ReservationSchedulerService.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/ReservationSchedulerService.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
+++ src/main/java/com/example/rezevirajmasa/demo/service/ReservationSchedulerService.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -0,0 +1,34 @@
+package com.example.rezevirajmasa.demo.service;
+
+import com.example.rezevirajmasa.demo.model.Reservation;
+import com.example.rezevirajmasa.demo.repository.ReservationRepository;
+import org.springframework.scheduling.annotation.Scheduled;
+import org.springframework.stereotype.Service;
+
+import java.time.LocalDateTime;
+import java.util.List;
+
+@Service
+public class ReservationSchedulerService {
+
+    private final ReservationRepository reservationRepository;
+    private final ReservationHistoryService reservationHistoryService;
+
+    public ReservationSchedulerService(
+            ReservationRepository reservationRepository,
+            ReservationHistoryService reservationHistoryService) {
+        this.reservationRepository = reservationRepository;
+        this.reservationHistoryService = reservationHistoryService;
+    }
+
+    @Scheduled(cron = "0 0 0 * * ?")
+    public void archivePastReservations() {
+        LocalDateTime now = LocalDateTime.now();
+        List<Reservation> pastReservations = reservationRepository.findAllByCheckInTimeBefore(now);
+
+        for (Reservation reservation : pastReservations) {
+            reservationHistoryService.moveReservationToHistory(reservation, "Past", null);
+            reservationRepository.delete(reservation);
+        }
+    }
+}
Index: src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/service/ReservationService.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,8 +1,6 @@
 package com.example.rezevirajmasa.demo.service;
 
-import com.example.rezevirajmasa.demo.model.Customer;
-import com.example.rezevirajmasa.demo.model.Reservation;
-import com.example.rezevirajmasa.demo.model.Restaurant;
-import com.example.rezevirajmasa.demo.model.TableEntity;
+import com.example.rezevirajmasa.demo.model.*;
+import org.springframework.security.core.userdetails.UserDetails;
 
 import java.time.LocalDateTime;
@@ -10,11 +8,12 @@
 
 public interface ReservationService {
-    public void makeReservation(Customer customer, TableEntity table, Restaurant restaurant, LocalDateTime localDateTime, LocalDateTime checkInTime, int partySize, String specialRequests);
-    public Reservation makeReservationRest(Reservation reservation);
+    public void makeReservation(User user, TableEntity table, Restaurant restaurant, LocalDateTime localDateTime, LocalDateTime checkInTime, int partySize, String specialRequests);
+    public Reservation makeReservationRest(Reservation reservation, User user);
     public List<Reservation> listAll();
     public Reservation findById(Long id);
     public Reservation getReservationById(Long reservationId);
     public boolean cancelReservation(Long reservationId);
-    public List<Reservation> findReservationByCustomer(Customer customer);
+    public List<Reservation> findReservationByUser(User user);
+    public List<Reservation> findReservationsByUserPast(User user);
     public List<Reservation> findReservationsByTableAndDateRange(TableEntity table, LocalDateTime startDateTime, LocalDateTime endDateTime);
     List<Reservation> findReservationsToMove(LocalDateTime currentTime);
Index: src/main/java/com/example/rezevirajmasa/demo/service/UserService.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/UserService.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/service/UserService.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -4,4 +4,5 @@
 import com.example.rezevirajmasa.demo.dto.SignUpDto;
 import com.example.rezevirajmasa.demo.dto.UserDto;
+import com.example.rezevirajmasa.demo.model.User;
 import lombok.RequiredArgsConstructor;
 
@@ -9,5 +10,7 @@
 public interface UserService {
     public UserDto findByEmail(String email);
+    public User findByMail(String email);
     public UserDto login(CredentialsDto credentialsDto);
     public UserDto register(SignUpDto userDto);
+    public User findUserById(Long userId);
 }
Index: src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationHistoryServiceImpl.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationHistoryServiceImpl.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationHistoryServiceImpl.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -4,4 +4,5 @@
 import com.example.rezevirajmasa.demo.model.Reservation;
 import com.example.rezevirajmasa.demo.model.Restaurant;
+import com.example.rezevirajmasa.demo.model.User;
 import com.example.rezevirajmasa.demo.repository.ReservationHistoryRepository;
 import com.example.rezevirajmasa.demo.service.ReservationHistoryService;
@@ -22,5 +23,5 @@
     public void moveReservationToHistory(Reservation reservation, String status, String cancellationReason) {
         Restaurant.ReservationHistory history = new Restaurant.ReservationHistory();
-        history.setCustomer(reservation.getCustomer());
+        history.setUser(reservation.getUser());
         history.setTable(reservation.getTable());
         history.setReservationDateTime(reservation.getReservationDateTime());
@@ -42,16 +43,14 @@
 
     @Override
-    public List<Restaurant.ReservationHistory> findByCustomer(Customer customer) {
-        return reservationHistoryRepository.findAllByCustomer(customer);
+    public List<Restaurant.ReservationHistory> findByUser(User user) {
+        return reservationHistoryRepository.findALlByUser(user);
     }
 
     @Override
     public void moveReservationsToPast(List<Restaurant.ReservationHistory> reservationsToMove) {
-        // Update the status of reservations to "Past"
         for (Restaurant.ReservationHistory reservation : reservationsToMove) {
             reservation.setStatus("Past");
         }
 
-        // Save the updated reservations
         reservationHistoryRepository.saveAll(reservationsToMove);
     }
Index: src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/service/impl/ReservationImpl.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,8 +1,7 @@
 package com.example.rezevirajmasa.demo.service.impl;
 
-import com.example.rezevirajmasa.demo.model.Customer;
-import com.example.rezevirajmasa.demo.model.Reservation;
-import com.example.rezevirajmasa.demo.model.Restaurant;
-import com.example.rezevirajmasa.demo.model.TableEntity;
+import com.example.rezevirajmasa.demo.dto.UserDto;
+import com.example.rezevirajmasa.demo.mappers.UserMapper;
+import com.example.rezevirajmasa.demo.model.*;
 import com.example.rezevirajmasa.demo.model.exceptions.InvalidReservationException;
 import com.example.rezevirajmasa.demo.model.exceptions.InvalidReservationIdException;
@@ -11,7 +10,15 @@
 import com.example.rezevirajmasa.demo.repository.RestaurantRepository;
 import com.example.rezevirajmasa.demo.repository.TableRepository;
+import com.example.rezevirajmasa.demo.service.ReservationHistoryService;
 import com.example.rezevirajmasa.demo.service.ReservationService;
+import com.example.rezevirajmasa.demo.service.UserService;
 import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cglib.core.Local;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.stereotype.Service;
+import org.springframework.web.bind.annotation.RequestBody;
 
 import javax.swing.text.html.Option;
@@ -27,9 +34,14 @@
     private TableRepository tableRepository;
     @Autowired
-    private RestaurantRepository restaurantRepository;
+    private ReservationHistoryService reservationHistoryService;
+    private final UserMapper userMapper;
     @Autowired
-    private CustomerRepository customerRepository;
+    private UserService userService;
     @Autowired
     private ReservationRepository reservationRepository;
+
+    public ReservationImpl(UserMapper userMapper) {
+        this.userMapper = userMapper;
+    }
 
     @Override
@@ -39,5 +51,5 @@
 
     @Override
-    public void makeReservation(Customer customer, TableEntity table, Restaurant restaurant, LocalDateTime localDateTime, LocalDateTime checkInTime, int partySize, String specialRequests) {
+    public void makeReservation(User user, TableEntity table, Restaurant restaurant, LocalDateTime localDateTime, LocalDateTime checkInTime, int partySize, String specialRequests) {
         if (!table.isAvailable(checkInTime)) {
             // Handle unavailability (throw an exception, return a specific response, etc.)
@@ -46,5 +58,5 @@
 
         Reservation reservation =
-                new Reservation(customer, table, restaurant, LocalDateTime.now(), partySize, specialRequests, "Reserved", checkInTime, checkInTime.plusHours(2), null);
+                new Reservation(user, table, restaurant, LocalDateTime.now(), partySize, specialRequests, "Reserved", checkInTime, checkInTime.plusHours(2), null);
 
 //        // Update table status or perform additional logic if needed
@@ -56,8 +68,10 @@
 
     @Override
-    public Reservation makeReservationRest(Reservation reservation) {
+    public Reservation makeReservationRest(Reservation reservation, User user) {
         Optional<TableEntity> optionalTable = tableRepository.findById(reservation.getTable().getId());
-        if(optionalTable.isPresent()) {
+        if (optionalTable.isPresent()) {
             TableEntity table = optionalTable.get();
+
+            reservation.setUser(user);
 
             LocalDateTime startTime = reservation.getCheckInTime().minusHours(2);
@@ -67,10 +81,11 @@
                     x -> x.isAfter(startTime) && x.isBefore(endTime)
             );
-
+            reservation.setReservationDateTime(LocalDateTime.now());
             return reservationRepository.save(reservation);
         } else {
-            throw new InvalidReservationException("Unsuccessful reservation -> time slot not avalaible");
+            throw new InvalidReservationException("Unsuccessful reservation -> time slot not available");
         }
     }
+
 
     @Override
@@ -109,8 +124,9 @@
                 from = from.plusMinutes(15);
             }
+            reservationHistoryService.moveReservationToHistory(reservation, "Canceled", "Canceled by user");
             reservationRepository.delete(reservation);
-            return true; // Return true indicating successful cancellation
+            return true;
         } else {
-            return false; // Return false indicating reservation with the given ID not found
+            return false;
         }
     }
@@ -118,6 +134,13 @@
 
     @Override
-    public List<Reservation> findReservationByCustomer(Customer customer) {
-        return reservationRepository.findAllByCustomer(customer);
+    public List<Reservation> findReservationByUser(User user) {
+        LocalDateTime now = LocalDateTime.now();
+        return reservationRepository.findALlByUserAndCheckInTimeAfter(user, now);
+    }
+
+    @Override
+    public List<Reservation> findReservationsByUserPast(User user) {
+        LocalDateTime now = LocalDateTime.now();
+        return reservationRepository.findALlByUserAndCheckInTimeBefore(user, now);
     }
 
Index: src/main/java/com/example/rezevirajmasa/demo/service/impl/RestaurantServiceImpl.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/impl/RestaurantServiceImpl.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/service/impl/RestaurantServiceImpl.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -175,5 +175,6 @@
                     .collect(Collectors.toList());
         } else {
-            List<Restaurant> restaurantList = restaurantRepository.findAllByNameLikeIgnoreCase(search);
+            String searchTerm = "%" + search + "%";
+            List<Restaurant> restaurantList = restaurantRepository.findAllByNameLikeIgnoreCase(searchTerm);
             if (restaurantList.isEmpty()) {
                 restaurantList = restaurantRepository.findAllByCuisineTypeContaining(search);
Index: src/main/java/com/example/rezevirajmasa/demo/service/impl/TokenService.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/impl/TokenService.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
+++ src/main/java/com/example/rezevirajmasa/demo/service/impl/TokenService.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -0,0 +1,34 @@
+package com.example.rezevirajmasa.demo.service.impl;
+
+import com.example.rezevirajmasa.demo.config.security.SecurityConstants;
+import io.jsonwebtoken.Claims;
+import io.jsonwebtoken.ExpiredJwtException;
+import io.jsonwebtoken.Jwts;
+import io.jsonwebtoken.SignatureException;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.stereotype.Service;
+
+@Service
+public class TokenService {
+
+    public String getUserIdFromToken(String token) {
+        try {
+            String jwtToken = token.substring(7);
+
+            Claims claims = Jwts.parser()
+                    .setSigningKey(SecurityConstants.SECRET)
+                    .parseClaimsJws(jwtToken)
+                    .getBody();
+
+            return claims.getSubject();  // Assumes 'sub' claim contains user ID
+        } catch (ExpiredJwtException e) {
+            throw new RuntimeException("Token has expired", e);
+        } catch (SignatureException e) {
+            throw new RuntimeException("Invalid token signature", e);
+        } catch (IllegalArgumentException e) {
+            throw new RuntimeException("Invalid token format", e);
+        } catch (Exception e) {
+            throw new RuntimeException("Could not extract user ID from token", e);
+        }
+    }
+}
Index: src/main/java/com/example/rezevirajmasa/demo/service/impl/UserServiceImpl.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/service/impl/UserServiceImpl.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/service/impl/UserServiceImpl.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -6,4 +6,6 @@
 import com.example.rezevirajmasa.demo.mappers.UserMapper;
 import com.example.rezevirajmasa.demo.mappers.UserMapperImpl;
+import com.example.rezevirajmasa.demo.model.MembershipLevel;
+import com.example.rezevirajmasa.demo.model.Role;
 import com.example.rezevirajmasa.demo.model.User;
 import com.example.rezevirajmasa.demo.model.exceptions.AppException;
@@ -12,8 +14,11 @@
 import lombok.RequiredArgsConstructor;
 import org.mapstruct.control.MappingControl;
+import org.openqa.selenium.InvalidArgumentException;
 import org.springframework.http.HttpStatus;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.stereotype.Service;
 import java.nio.CharBuffer;
+import java.sql.Date;
+import java.time.LocalDate;
 import java.util.Optional;
 
@@ -30,6 +35,11 @@
     }
 
+    @Override
+    public User findByMail(String email) {
+        return userRepository.findByEmail(email).orElseThrow(() -> new AppException(("Unknown user"), HttpStatus.NOT_FOUND));
+    }
+
     public UserDto login(CredentialsDto credentialsDto) {
-        User user = userRepository.findByEmail(credentialsDto.getLogin())
+        User user = userRepository.findByEmail(credentialsDto.getEmail())
                 .orElseThrow(() -> new AppException("Unknown user", HttpStatus.NOT_FOUND));
 
@@ -51,7 +61,20 @@
         user.setPassword(passwordEncoder.encode(CharBuffer.wrap(userDto.getPassword())));
 
+        user.setFirstName(userDto.getFirstName());
+        user.setLastName(userDto.getLastName());
+        user.setAddress(userDto.getAddress());
+        user.setPhone(userDto.getPhone());
+        user.setMembershipLevel(MembershipLevel.valueOf(userDto.getMembershipLevel()));
+        user.setRegistrationDate(Date.valueOf(LocalDate.now()));
+        user.setRole(Role.ROLE_USER);
+
         User savedUser = userRepository.save(user);
 
-        return userMapper.toUserDto(user);
+        return userMapper.toUserDto(savedUser);
+    }
+
+    @Override
+    public User findUserById(Long userId) {
+        return userRepository.findById(userId).orElseThrow(()->new InvalidArgumentException("Invalid user Id"));
     }
 }
Index: src/main/java/com/example/rezevirajmasa/demo/web/controller/ReservationController.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/web/controller/ReservationController.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/web/controller/ReservationController.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,4 +1,7 @@
 package com.example.rezevirajmasa.demo.web.controller;
 
+import com.example.rezevirajmasa.demo.dto.SignUpDto;
+import com.example.rezevirajmasa.demo.dto.UserDto;
+import com.example.rezevirajmasa.demo.mappers.UserMapper;
 import com.example.rezevirajmasa.demo.model.*;
 import com.example.rezevirajmasa.demo.model.exceptions.ExpiredReservationException;
@@ -19,28 +22,33 @@
 public class ReservationController {
     private final ReservationService reservationService;
-    private final CustomerService customerService;
+    private final UserService userService;
     private final TableService tableService;
     private final ReservationHistoryService reservationHistoryService;
 
-    public ReservationController(ReservationService reservationService, CustomerService customerService, TableService tableService, ReservationHistoryService reservationHistoryService) {
+    private final UserMapper userMapper;
+
+    public ReservationController(ReservationService reservationService, UserService userService, TableService tableService, ReservationHistoryService reservationHistoryService, UserMapper userMapper) {
         this.reservationService = reservationService;
-        this.customerService = customerService;
+        this.userService = userService;
         this.tableService = tableService;
         this.reservationHistoryService = reservationHistoryService;
+        this.userMapper = userMapper;
     }
 
     @GetMapping("/reservations")
     public String showReservations(Model model, Authentication authentication) {
-        Customer customer = customerService.findByEmail(authentication.getName());
-        List<Reservation> reservationList;
-        if(customer.getRole().equals(Role.ROLE_ADMIN)) {
-            reservationList = reservationService.listAll();
-        } else {
-            reservationList = reservationService.findReservationByCustomer(customer);
-        }
+        UserDto userDto = userService.findByEmail(authentication.getName());
+
+        SignUpDto signUpDto = userMapper.toSignUpDto(userDto);
+
+        User user = userMapper.signUpToUser(signUpDto);
+
+        List<Reservation> reservationList = reservationService.findReservationByUser(user);
+
         model.addAttribute("bodyContent", "reservationList");
         model.addAttribute("reservations", reservationList);
         return "index";
     }
+
 
     @GetMapping("/reservations/edit/{reservationId}")
@@ -62,5 +70,9 @@
         Restaurant restaurant = table.getRestaurant();
 
-        Customer customer = customerService.findByEmail(authentication.getName());
+        UserDto userDto = userService.findByEmail(authentication.getName());
+
+        SignUpDto signUpDto = userMapper.toSignUpDto(userDto);
+
+        User user = userMapper.signUpToUser(signUpDto);
 
         if(!table.isAvailable(reservationDateTime)) {
@@ -68,5 +80,5 @@
         }
         tableService.deleteTimeSlotsForReservation(tableNumber, reservationDateTime);
-        reservationService.makeReservation(customer, table, restaurant, LocalDateTime.now(), reservationDateTime, partySize, specialRequests);
+        reservationService.makeReservation(user, table, restaurant, LocalDateTime.now(), reservationDateTime, partySize, specialRequests);
         return "redirect:/reservations";
     }
Index: src/main/java/com/example/rezevirajmasa/demo/web/controller/ReservationHistoryController.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/web/controller/ReservationHistoryController.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/web/controller/ReservationHistoryController.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -1,9 +1,14 @@
 package com.example.rezevirajmasa.demo.web.controller;
 
+import com.example.rezevirajmasa.demo.dto.SignUpDto;
+import com.example.rezevirajmasa.demo.dto.UserDto;
+import com.example.rezevirajmasa.demo.mappers.UserMapper;
 import com.example.rezevirajmasa.demo.model.Customer;
 import com.example.rezevirajmasa.demo.model.Restaurant;
 import com.example.rezevirajmasa.demo.model.Role;
+import com.example.rezevirajmasa.demo.model.User;
 import com.example.rezevirajmasa.demo.service.CustomerService;
 import com.example.rezevirajmasa.demo.service.ReservationHistoryService;
+import com.example.rezevirajmasa.demo.service.UserService;
 import org.springframework.security.core.Authentication;
 import org.springframework.stereotype.Controller;
@@ -18,9 +23,11 @@
 public class ReservationHistoryController {
     private final ReservationHistoryService reservationHistoryService;
-    private final CustomerService customerService;
+    private final UserService userService;
+    private final UserMapper userMapper;
 
-    public ReservationHistoryController(ReservationHistoryService reservationHistoryService, CustomerService customerService) {
+    public ReservationHistoryController(ReservationHistoryService reservationHistoryService, UserService userService, UserMapper userMapper) {
         this.reservationHistoryService = reservationHistoryService;
-        this.customerService = customerService;
+        this.userService = userService;
+        this.userMapper = userMapper;
     }
 
@@ -28,10 +35,16 @@
     public String showPastReservations(Authentication authentication, Model model) {
         List<Restaurant.ReservationHistory> reservationHistoryList;
-        Customer customer = customerService.findByEmail(authentication.getName());
-        if(customer.getRole().equals(Role.ROLE_ADMIN)) {
-            reservationHistoryList = reservationHistoryService.findAll();
-        } else {
-            reservationHistoryList = reservationHistoryService.findByCustomer(customer);
-        }
+        UserDto userDto = userService.findByEmail(authentication.getName());
+
+        SignUpDto signUpDto = userMapper.toSignUpDto(userDto);
+
+        User user = userMapper.signUpToUser(signUpDto);
+
+        reservationHistoryList = reservationHistoryService.findByUser(user);
+//        if(customer.getRole().equals(Role.ROLE_ADMIN)) {
+//            reservationHistoryList = reservationHistoryService.findAll();
+//        } else {
+//            reservationHistoryList = reservationHistoryService.findByUser(User user);
+//        }
         model.addAttribute("historyReservations", reservationHistoryList);
         model.addAttribute("bodyContent", "pastReservations");
Index: src/main/java/com/example/rezevirajmasa/demo/web/filters/JwtAuthFilter.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/web/filters/JwtAuthFilter.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/web/filters/JwtAuthFilter.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -2,4 +2,5 @@
 
 import com.example.rezevirajmasa.demo.config.UserAuthProvider;
+import io.jsonwebtoken.ExpiredJwtException;
 import jakarta.servlet.FilterChain;
 import jakarta.servlet.ServletException;
@@ -7,5 +8,7 @@
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.RequiredArgsConstructor;
+import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.http.HttpHeaders;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
 import org.springframework.web.filter.OncePerRequestFilter;
@@ -17,4 +20,5 @@
 
     private final UserAuthProvider userAuthProvider;
+
     @Override
     protected void doFilterInternal(
@@ -24,12 +28,31 @@
         String header = request.getHeader(HttpHeaders.AUTHORIZATION);
 
+        String username = null;
+        String jwt = null;
+
         if(header != null) {
+            jwt = header.substring(7);
             String[] elements = header.split(" ");
 
             if(elements.length == 2 && "Bearer".equals(elements[0])) {
                 try {
+                    username = userAuthProvider.extractUsername(jwt); // logikata vidi ja
                     SecurityContextHolder.getContext().setAuthentication(
                             userAuthProvider.validateToken(elements[1])
                     );
+                    if (username != null) {
+                        System.out.println("Authenticated user: " + username); // Debug log
+                        SecurityContextHolder.getContext().setAuthentication(
+                                userAuthProvider.validateToken(jwt) // Ensure token validation works properly
+                        );
+                    }
+                } catch (ExpiredJwtException e) {
+                    String isRefreshToken = request.getHeader("isRefreshToken");
+                    String requestURL = request.getRequestURL().toString();
+                    if (isRefreshToken != null && isRefreshToken.equals("true") && requestURL.contains("refresh-token")) {
+                        allowForRefreshToken(e, request);
+                    } else
+                        request.setAttribute("exception", e);
+
                 } catch (RuntimeException e) {
                     SecurityContextHolder.clearContext();
@@ -40,3 +63,10 @@
         filterChain.doFilter(request, response);
     }
+
+    private void allowForRefreshToken(ExpiredJwtException ex, HttpServletRequest request) {
+        UsernamePasswordAuthenticationToken usernamePasswordAuthenticationToken = new UsernamePasswordAuthenticationToken(
+                null, null, null);
+        SecurityContextHolder.getContext().setAuthentication(usernamePasswordAuthenticationToken);
+        request.setAttribute("claims", ex.getClaims());
+    }
 }
Index: src/main/java/com/example/rezevirajmasa/demo/web/rest/AuthController.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/web/rest/AuthController.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/web/rest/AuthController.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -14,4 +14,6 @@
 import org.springframework.http.ResponseEntity;
 import org.springframework.security.authentication.AuthenticationManager;
+import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
+import org.springframework.security.core.Authentication;
 import org.springframework.security.crypto.password.PasswordEncoder;
 import org.springframework.web.bind.annotation.CrossOrigin;
@@ -30,5 +32,7 @@
     public ResponseEntity<UserDto> login(@RequestBody CredentialsDto credentialsDto) {
         UserDto user = userService.login(credentialsDto);
-        user.setToken(userAuthProvider.createToken(user.getEmail()));
+        String token = userAuthProvider.createToken(user.getEmail());
+        user.setToken(token);
+
         return ResponseEntity.ok(user);
     }
@@ -38,6 +42,5 @@
         UserDto user = userService.register(signUpDto);
         user.setToken(userAuthProvider.createToken(user.getEmail()));
-        return ResponseEntity.created(URI.create("/users/" + user.getId()))
-                .body(user);
+        return ResponseEntity.created(URI.create("/users/" + user.getId())).body(user);
     }
 }
Index: src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java
===================================================================
--- src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/java/com/example/rezevirajmasa/demo/web/rest/testController.java	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -2,16 +2,25 @@
 
 import com.example.rezevirajmasa.demo.dto.CustomerDTO;
+import com.example.rezevirajmasa.demo.dto.UserDto;
+import com.example.rezevirajmasa.demo.mappers.UserMapper;
 import com.example.rezevirajmasa.demo.model.*;
-import com.example.rezevirajmasa.demo.service.CustomerService;
-import com.example.rezevirajmasa.demo.service.ReservationService;
-import com.example.rezevirajmasa.demo.service.RestaurantService;
-import com.example.rezevirajmasa.demo.service.TableService;
+import com.example.rezevirajmasa.demo.service.*;
+import com.example.rezevirajmasa.demo.service.impl.TokenService;
+import jakarta.servlet.http.HttpServletRequest;
 import jdk.jfr.consumer.RecordingStream;
 import org.apache.coyote.Response;
+import org.apache.http.protocol.HTTP;
 import org.springframework.format.annotation.DateTimeFormat;
 import org.springframework.http.HttpStatus;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.core.Authentication;
+import org.springframework.security.core.annotation.AuthenticationPrincipal;
+import org.springframework.security.core.context.SecurityContextHolder;
+import org.springframework.security.core.parameters.P;
+import org.springframework.security.core.userdetails.UserDetails;
 import org.springframework.web.bind.annotation.*;
 
+import java.nio.file.attribute.UserPrincipal;
+import java.security.Principal;
 import java.time.LocalDateTime;
 import java.time.format.DateTimeFormatter;
@@ -26,12 +35,19 @@
     private final RestaurantService restaurantService;
     private final CustomerService customerService;
+    private final UserService userService;
     private final ReservationService reservationService;
+    private final ReservationHistoryService reservationHistoryService;
     private final TableService tableService;
-
-    public testController(RestaurantService restaurantService, CustomerService customerService, ReservationService reservationService, TableService tableService) {
+    private final UserMapper userMapper;
+    private final TokenService tokenService;
+    public testController(RestaurantService restaurantService, CustomerService customerService, UserService userService, ReservationService reservationService, ReservationHistoryService reservationHistoryService, TableService tableService, UserMapper userMapper, TokenService tokenService) {
         this.restaurantService = restaurantService;
         this.customerService = customerService;
+        this.userService = userService;
         this.reservationService = reservationService;
+        this.reservationHistoryService = reservationHistoryService;
         this.tableService = tableService;
+        this.userMapper = userMapper;
+        this.tokenService = tokenService;
     }
 
@@ -114,4 +130,16 @@
         );
     }
+    @GetMapping("/api/user")
+    public ResponseEntity<?> getCurrentUser() {
+        Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
+
+        if (authentication == null || !authentication.isAuthenticated() || authentication.getPrincipal().equals("anonymousUser")) {
+            return new ResponseEntity<>("User is not authenticated", HttpStatus.UNAUTHORIZED);
+        }
+
+        Customer customer = (Customer) authentication.getPrincipal();
+        return new ResponseEntity<>(customer, HttpStatus.OK);
+    }
+
 
     @PostMapping("/api/customers")
@@ -137,15 +165,18 @@
 //    Reservation Calls
 
-    @GetMapping("/api/reservations")
-    public ResponseEntity<List<Reservation>> getReservations() {
-        return new ResponseEntity<List<Reservation>>(reservationService.listAll(), HttpStatus.OK);
-    }
-
-    @PostMapping("/api/reservations")
-    public ResponseEntity<Reservation> createReservation(@RequestBody Reservation reservation) {
-        reservation.setReservationDateTime(LocalDateTime.now());
-        Reservation savedReservation = reservationService.makeReservationRest(reservation);
+    @GetMapping("/api/reservations/by/{email}")
+    public ResponseEntity<List<Reservation>> getReservations(@PathVariable String email) {
+        User user = userService.findByMail(email);
+        return new ResponseEntity<List<Reservation>>(reservationService.findReservationByUser(user), HttpStatus.OK);
+    }
+
+    @PostMapping("/api/reservations/{email}")
+    public ResponseEntity<Reservation> createReservation(@RequestBody Reservation reservation, @PathVariable String email) {
+        User user = userService.findByMail(email);
+        Reservation savedReservation = reservationService.makeReservationRest(reservation, user);
+
         return new ResponseEntity<>(savedReservation, HttpStatus.CREATED);
     }
+
 
     @GetMapping("/api/reservations/{reservationId}")
@@ -159,30 +190,38 @@
     }
 
-    @PostMapping("/api/reservations/{reservationId}")
+    @PostMapping("/api/reservations/{reservationId}/{email}")
     public ResponseEntity<Reservation> editReservation(@PathVariable Long reservationId,
-                                                       @RequestBody Reservation reservation) {
+                                                       @RequestBody Reservation reservation,
+                                                       @PathVariable String email) {
+        User user = userService.findByMail(email);
+
         if (!reservation.getReservationID().equals(reservationId)) {
             return ResponseEntity.badRequest().build();
         }
 
-        Reservation savedReservation = reservationService.findById(reservationId);
-        if(!reservation.getCheckInTime().equals(savedReservation.getCheckInTime())) {
-            tableService.canceledTimeSlots(savedReservation.getTable().getId(), savedReservation.getCheckInTime());
-        }
-
-        savedReservation.setReservationDateTime(LocalDateTime.now());
-        savedReservation.setCheckInTime(reservation.getCheckInTime());
-        savedReservation.setCheckOutTime(reservation.getCheckInTime().plusHours(2));
-        savedReservation.setPartySize(reservation.getPartySize());
-        savedReservation.setSpecialRequests(reservation.getSpecialRequests());
-        tableService.deleteTimeSlotsForReservation(reservation.getTable().getId(), reservation.getCheckInTime());
-
-        //moze da se vovede sistem za ako od 4ca doagjaat samo 2ca da se najde pomala masa po moznost ako ima u toj moment
-        //listaj samo slotovi za taa masa vo toj moment ili da ima da odbere od novo ama taka bolje nova rezevacij
-
-        Reservation updatedReservation = reservationService.makeReservationRest(savedReservation);
-        System.out.println("Saved reservation time: " + savedReservation.getCheckInTime());
+        // Fetch existing reservation
+        Reservation existingReservation = reservationService.findById(reservationId);
+        if (existingReservation == null) {
+            return ResponseEntity.notFound().build();
+        }
+
+        if (!reservation.getCheckInTime().equals(existingReservation.getCheckInTime())) {
+            tableService.canceledTimeSlots(existingReservation.getTable().getId(), existingReservation.getCheckInTime());
+
+            tableService.deleteTimeSlotsForReservation(reservation.getTable().getId(), reservation.getCheckInTime());
+        }
+
+        existingReservation.setReservationDateTime(LocalDateTime.now());
+        existingReservation.setCheckInTime(reservation.getCheckInTime());
+        existingReservation.setCheckOutTime(reservation.getCheckInTime().plusHours(2));
+        existingReservation.setPartySize(reservation.getPartySize());
+        existingReservation.setSpecialRequests(reservation.getSpecialRequests());
+
+        Reservation updatedReservation = reservationService.makeReservationRest(existingReservation, user);
+
+        System.out.println("Updated reservation time: " + updatedReservation.getCheckInTime());
         return ResponseEntity.ok(updatedReservation);
     }
+
 
     @DeleteMapping("/api/reservations/delete/{reservationId}")
@@ -196,4 +235,10 @@
     }
 
+    @GetMapping("/api/reservations/past/{email}")
+    public ResponseEntity<List<Restaurant.ReservationHistory>> pastReservations(@PathVariable String email) {
+        User user = userService.findByMail(email);
+        return null;
+    }
+
 //    TableEntity Calls
 
@@ -203,3 +248,11 @@
     }
 
+    // past reservation calls
+    @GetMapping("/api/past-reservations/{email}")
+    public ResponseEntity<List<Restaurant.ReservationHistory>> findPastReservationsByUser(@PathVariable String email) {
+        User user = userService.findByMail(email);
+        List<Restaurant.ReservationHistory> reservations = reservationHistoryService.findByUser(user);
+        return new ResponseEntity<>(reservations, HttpStatus.OK);
+    }
+
 }
Index: src/main/resources/application.properties
===================================================================
--- src/main/resources/application.properties	(revision db39d9efed86ed42d87bc8fef5803a0b89a39dd8)
+++ src/main/resources/application.properties	(revision 8ca35dc93473fb5be3777778a84fedee941c8790)
@@ -9,2 +9,4 @@
 spring.jpa.show-sql=true
 spring.main.allow-bean-definition-overriding=true
+
+server.port=8081
