Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/filter/JWTAuthenticationFilter.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/filter/JWTAuthenticationFilter.java	(revision ac41d70c5bb293177cc03cfec11da1fbd8c91ad8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/config/filter/JWTAuthenticationFilter.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -6,5 +6,5 @@
 import jakarta.servlet.http.HttpServletResponse;
 import lombok.NonNull;
-import mk.ukim.finki.it.reservengo.service.impl.JWTServiceImpl;
+import mk.ukim.finki.it.reservengo.service.intf.JWTService;
 import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
 import org.springframework.security.core.context.SecurityContextHolder;
@@ -20,8 +20,8 @@
 public class JWTAuthenticationFilter extends OncePerRequestFilter {
 
-    private final JWTServiceImpl jwtService;
+    private final JWTService jwtService;
     private final UserDetailsService userDetailsService;
 
-    public JWTAuthenticationFilter(JWTServiceImpl jwtService, UserDetailsService userDetailsService) {
+    public JWTAuthenticationFilter(JWTService jwtService, UserDetailsService userDetailsService) {
         this.jwtService = jwtService;
         this.userDetailsService = userDetailsService;
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/Local.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/Local.java	(revision ac41d70c5bb293177cc03cfec11da1fbd8c91ad8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/Local.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -26,4 +26,9 @@
         this.workers = workers;
     }
+
+    public Local(String name) {
+        this.name = name;
+    }
+
 
     public Local() {
@@ -68,8 +73,4 @@
     @OneToMany(mappedBy = "local")
     private List<LocalWorker> workers;
-
-    public Local(String name) {
-        this.name = name;
-    }
 
     public double calculateLocalAverageRating() {
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/AdminServiceImpl.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/AdminServiceImpl.java	(revision ac41d70c5bb293177cc03cfec11da1fbd8c91ad8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/AdminServiceImpl.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -1,8 +1,6 @@
 package mk.ukim.finki.it.reservengo.service.impl;
 
-import mk.ukim.finki.it.reservengo.model.Local;
-import mk.ukim.finki.it.reservengo.model.exceptions.LocalNotFoundException;
-import mk.ukim.finki.it.reservengo.repository.LocalRepository;
 import mk.ukim.finki.it.reservengo.service.intf.AdminService;
+import mk.ukim.finki.it.reservengo.service.intf.LocalService;
 import org.springframework.stereotype.Service;
 
@@ -10,20 +8,18 @@
 public class AdminServiceImpl implements AdminService {
 
-    private final LocalRepository localRepository;
+    private final LocalService localService;
 
-    public AdminServiceImpl(LocalRepository localRepository) {
-        this.localRepository = localRepository;
+    public AdminServiceImpl(LocalService localService) {
+        this.localService = localService;
     }
 
     @Override
     public void addLocal(String name) {
-        Local local = new Local(name);
-        localRepository.save(local);
+        localService.save(name);
     }
 
     @Override
     public void deleteLocal(Long id) {
-        Local local = localRepository.findById(id).orElseThrow(() -> new LocalNotFoundException(id));
-        localRepository.delete(local);
+        localService.delete(id);
     }
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/CustomerServiceImpl.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/CustomerServiceImpl.java	(revision ac41d70c5bb293177cc03cfec11da1fbd8c91ad8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/CustomerServiceImpl.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -1,12 +1,10 @@
 package mk.ukim.finki.it.reservengo.service.impl;
 
-import jakarta.transaction.Transactional;
 import mk.ukim.finki.it.reservengo.model.Customer;
 import mk.ukim.finki.it.reservengo.model.Local;
 import mk.ukim.finki.it.reservengo.model.exceptions.CustomerNotFoundException;
-import mk.ukim.finki.it.reservengo.model.exceptions.LocalNotFoundException;
 import mk.ukim.finki.it.reservengo.repository.CustomerRepository;
-import mk.ukim.finki.it.reservengo.repository.LocalRepository;
 import mk.ukim.finki.it.reservengo.service.intf.CustomerService;
+import mk.ukim.finki.it.reservengo.service.intf.LocalService;
 import org.springframework.stereotype.Service;
 
@@ -16,9 +14,9 @@
 public class CustomerServiceImpl implements CustomerService {
     private final CustomerRepository customerRepository;
-    private final LocalRepository localRepository;
+    private final LocalService localService;
 
-    public CustomerServiceImpl(CustomerRepository customerRepository, LocalRepository localRepository) {
+    public CustomerServiceImpl(CustomerRepository customerRepository, LocalService localService) {
         this.customerRepository = customerRepository;
-        this.localRepository = localRepository;
+        this.localService = localService;
     }
 
@@ -37,5 +35,5 @@
     public void addFavouriteLocal(Long userId, Long localId) {
         Customer customer = customerRepository.findById(userId).orElseThrow(() -> new CustomerNotFoundException(userId));
-        Local local = localRepository.findById(localId).orElseThrow(() -> new LocalNotFoundException(localId));
+        Local local = localService.getLocalById(localId);
 
         if (!customer.getFavouriteLocals().contains(local)) {
@@ -49,5 +47,5 @@
     public void removeFavouriteLocal(Long userId, Long localId) {
         Customer customer = customerRepository.findById(userId).orElseThrow(() -> new CustomerNotFoundException(userId));
-        Local local = localRepository.findById(localId).orElseThrow(() -> new LocalNotFoundException(localId));
+        Local local = localService.getLocalById(localId);
 
         customer.getFavouriteLocals().remove(local);
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/JWTServiceImpl.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/JWTServiceImpl.java	(revision ac41d70c5bb293177cc03cfec11da1fbd8c91ad8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/JWTServiceImpl.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -27,5 +27,6 @@
     @Override
     public Claims extractAllClaims(String token) {
-        return Jwts.parserBuilder()
+        return Jwts
+                .parserBuilder()
                 .setSigningKey(getSignInKey())
                 .build()
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/LocalServiceImpl.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/LocalServiceImpl.java	(revision ac41d70c5bb293177cc03cfec11da1fbd8c91ad8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/LocalServiceImpl.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -25,6 +25,17 @@
     @Override
     public Local getLocalById(Long id) {
-        return localRepository.findById(id)
-                .orElseThrow(() -> new LocalIdNotFoundException(id));
+        return localRepository.findById(id).orElseThrow(() -> new LocalIdNotFoundException(id));
+    }
+
+    @Override
+    public void save(String name) {
+        Local local = new Local(name);
+        localRepository.save(local);
+    }
+
+    @Override
+    public void delete(Long id) {
+        Local local = localRepository.findById(id).orElseThrow(() -> new LocalIdNotFoundException(id));
+        localRepository.delete(local);
     }
 
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/AuthService.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/AuthService.java	(revision ac41d70c5bb293177cc03cfec11da1fbd8c91ad8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/AuthService.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -5,5 +5,5 @@
 
 public interface AuthService {
-    JWTAuthenticationResponse registerCustomer(String firstName, String lastName, String email, String password, String phoneNumber) throws EmailNotFoundException;
+    JWTAuthenticationResponse registerCustomer(String firstName, String lastName, String email, String password, String phoneNumber);
 
     JWTAuthenticationResponse registerLocalWorker(String firstName, String lastName, String email, String password, String phoneNumber);
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/LocalService.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/LocalService.java	(revision ac41d70c5bb293177cc03cfec11da1fbd8c91ad8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/LocalService.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -9,3 +9,7 @@
 
     Local getLocalById(Long id);
+
+    void save(String name);
+
+    void delete(Long id);
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/AuthController.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/AuthController.java	(revision ac41d70c5bb293177cc03cfec11da1fbd8c91ad8)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/AuthController.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -1,4 +1,5 @@
 package mk.ukim.finki.it.reservengo.web;
 
+import jakarta.servlet.http.HttpServletRequest;
 import mk.ukim.finki.it.reservengo.model.JWTAuthenticationResponse;
 import mk.ukim.finki.it.reservengo.service.intf.AuthService;
@@ -6,4 +7,7 @@
 import org.springframework.http.MediaType;
 import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
 import org.springframework.web.bind.annotation.*;
 
@@ -45,7 +49,14 @@
 
     @PostMapping("/login")
-    public ResponseEntity<JWTAuthenticationResponse> login(@RequestParam String email,
-                                                           @RequestParam String password) {
-        return new ResponseEntity<>(authenticationService.login(email, password), HttpStatus.OK);
+    public ResponseEntity<?> login(@RequestParam String email,
+                                   @RequestParam String password) {
+        JWTAuthenticationResponse response = authenticationService.login(email, password);
+        return ResponseEntity.ok(response);
     }
+
+    @GetMapping("/logout")
+    public void logout(HttpServletRequest request) {
+        request.getSession().invalidate();
+    }
+
 }
Index: ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/GlobalExceptionHandler.java
===================================================================
--- ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/GlobalExceptionHandler.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
+++ ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/GlobalExceptionHandler.java	(revision 48e50b42834ee0fd75fae007839e678cd75ed6ca)
@@ -0,0 +1,30 @@
+package mk.ukim.finki.it.reservengo.web;
+
+import mk.ukim.finki.it.reservengo.model.exceptions.EmailNotFoundException;
+import org.springframework.http.HttpStatus;
+import org.springframework.http.ResponseEntity;
+import org.springframework.security.authentication.BadCredentialsException;
+import org.springframework.security.core.AuthenticationException;
+import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.web.bind.annotation.ExceptionHandler;
+import org.springframework.web.bind.annotation.RestControllerAdvice;
+
+@RestControllerAdvice
+public class GlobalExceptionHandler {
+
+    @ExceptionHandler(BadCredentialsException.class)
+    public ResponseEntity<String> handleBadCredentials(BadCredentialsException ex) {
+        return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body("Invalid email or password");
+    }
+
+    @ExceptionHandler(EmailNotFoundException.class)
+    public ResponseEntity<String> handleUserNotFound(EmailNotFoundException ex) {
+        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("User not found");
+    }
+
+    @ExceptionHandler(AuthenticationException.class)
+    public ResponseEntity<String> handleUserNotFound(AuthenticationException ex) {
+        return ResponseEntity.status(HttpStatus.NOT_FOUND).body("Authentication failed");
+    }
+}
+
