Changeset fa26ba9


Ignore:
Timestamp:
04/30/25 15:09:39 (3 days ago)
Author:
Nikola Jordanoski <nikolaj_koko@…>
Branches:
master
Children:
0391097, ae61ea4
Parents:
b77dbe8
Message:

Full security implementation with exceptions and fallbacks + services decoupling

Location:
ReserveNGo-backend
Files:
1 added
13 edited

Legend:

Unmodified
Added
Removed
  • ReserveNGo-backend/pom.xml

    rb77dbe8 rfa26ba9  
    77        <artifactId>spring-boot-starter-parent</artifactId>
    88        <version>3.4.3</version>
    9         <relativePath/> <!-- lookup parent from repository -->
     9        <relativePath/>
    1010    </parent>
    1111    <groupId>mk.ukim.finki.it</groupId>
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/EmailNotFoundException.java

    rb77dbe8 rfa26ba9  
    22
    33public class EmailNotFoundException extends RuntimeException {
    4     public EmailNotFoundException(String username) {
    5         super("User with email: " + username + " not found");
     4    public EmailNotFoundException(String email) {
     5        super("User with email: " + email + " not found");
    66    }
    77}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/AuthServiceImpl.java

    rb77dbe8 rfa26ba9  
    88import mk.ukim.finki.it.reservengo.model.domain.LocalWorker;
    99import mk.ukim.finki.it.reservengo.model.domain.User;
    10 import mk.ukim.finki.it.reservengo.model.enumerations.Role;
    1110import mk.ukim.finki.it.reservengo.model.exceptions.EmailNotFoundException;
    12 import mk.ukim.finki.it.reservengo.repository.CustomerRepository;
    13 import mk.ukim.finki.it.reservengo.repository.LocalManagerRepository;
    14 import mk.ukim.finki.it.reservengo.repository.LocalWorkerRepository;
    1511import mk.ukim.finki.it.reservengo.repository.UserRepository;
    16 import mk.ukim.finki.it.reservengo.service.intf.AuthService;
    17 import mk.ukim.finki.it.reservengo.service.intf.JWTService;
     12import mk.ukim.finki.it.reservengo.service.intf.*;
    1813import org.springframework.security.authentication.AuthenticationManager;
    1914import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
     
    2318@Service
    2419public class AuthServiceImpl implements AuthService {
    25     private final CustomerRepository customerRepository;
    26     private final LocalWorkerRepository localWorkerRepository;
    27     private final LocalManagerRepository localManagerRepository;
     20    private final CustomerService customerService;
     21    private final LocalWorkerService localWorkerService;
     22    private final LocalManagerService localManagerService;
    2823    private final JWTService jwtService;
    2924    private final PasswordEncoder passwordEncoder;
     
    3126    private final UserRepository userRepository;
    3227
    33     public AuthServiceImpl(CustomerRepository customerRepository, LocalWorkerRepository localWorkerRepository, LocalManagerRepository localManagerRepository, JWTService jwtService, PasswordEncoder passwordEncoder, AuthenticationManager authenticationManager, UserRepository userRepository) {
    34         this.customerRepository = customerRepository;
    35         this.localWorkerRepository = localWorkerRepository;
    36         this.localManagerRepository = localManagerRepository;
     28    public AuthServiceImpl(CustomerService customerService, LocalWorkerService localWorkerService, LocalManagerService localManagerService, JWTService jwtService, PasswordEncoder passwordEncoder, AuthenticationManager authenticationManager, UserRepository userRepository) {
     29        this.customerService = customerService;
     30        this.localWorkerService = localWorkerService;
     31        this.localManagerService = localManagerService;
    3732        this.jwtService = jwtService;
    3833        this.passwordEncoder = passwordEncoder;
     
    4540        Customer customer = jwtAuthenticationRequestDTO.toCustomer(passwordEncoder.encode(jwtAuthenticationRequestDTO.password()));
    4641
    47         customerRepository.save(customer);
     42        customerService.save(customer);
    4843        String jwt = jwtService.generateToken(customer);
    4944
     
    5550        LocalWorker localWorker = jwtAuthenticationRequestDTO.toLocalWorker(passwordEncoder.encode(jwtAuthenticationRequestDTO.password()));
    5651
    57         localWorkerRepository.save(localWorker);
     52        localWorkerService.save(localWorker);
    5853        String jwt = jwtService.generateToken(localWorker);
    5954
     
    6560        LocalManager localManager = jwtAuthenticationRequestDTO.toLocalManager(passwordEncoder.encode(jwtAuthenticationRequestDTO.password()));
    6661
    67         localManagerRepository.save(localManager);
     62        localManagerService.save(localManager);
    6863        String jwt = jwtService.generateToken(localManager);
    6964
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/CustomerServiceImpl.java

    rb77dbe8 rfa26ba9  
    44import mk.ukim.finki.it.reservengo.model.domain.Local;
    55import mk.ukim.finki.it.reservengo.model.exceptions.CustomerIdNotFoundException;
     6import mk.ukim.finki.it.reservengo.model.exceptions.UserEmailAlreadyExistsException;
    67import mk.ukim.finki.it.reservengo.repository.CustomerRepository;
    78import mk.ukim.finki.it.reservengo.service.intf.CustomerService;
    89import mk.ukim.finki.it.reservengo.service.intf.LocalService;
     10import mk.ukim.finki.it.reservengo.service.intf.UserService;
    911import org.springframework.stereotype.Service;
    1012
     
    1517    private final CustomerRepository customerRepository;
    1618    private final LocalService localService;
     19    private final UserService userService;
    1720
    18     public CustomerServiceImpl(CustomerRepository customerRepository, LocalService localService) {
     21    public CustomerServiceImpl(CustomerRepository customerRepository, LocalService localService, UserService userService) {
    1922        this.customerRepository = customerRepository;
    2023        this.localService = localService;
     24        this.userService = userService;
    2125    }
    2226
     
    4852        customerRepository.save(customer);
    4953    }
     54
     55    @Override
     56    public void save(Customer customer) {
     57        if (userService.emailExists(customer.getEmail())) {
     58            throw new UserEmailAlreadyExistsException(customer.getEmail());
     59        }
     60        customerRepository.save(customer);
     61    }
    5062}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/LocalManagerServiceImpl.java

    rb77dbe8 rfa26ba9  
    22
    33import mk.ukim.finki.it.reservengo.model.domain.Local;
     4import mk.ukim.finki.it.reservengo.model.domain.LocalManager;
    45import mk.ukim.finki.it.reservengo.model.exceptions.LocalIdNotFoundException;
     6import mk.ukim.finki.it.reservengo.model.exceptions.UserEmailAlreadyExistsException;
     7import mk.ukim.finki.it.reservengo.repository.LocalManagerRepository;
    58import mk.ukim.finki.it.reservengo.repository.LocalRepository;
    69import mk.ukim.finki.it.reservengo.service.intf.FileStorageService;
    710import mk.ukim.finki.it.reservengo.service.intf.LocalManagerService;
     11import mk.ukim.finki.it.reservengo.service.intf.UserService;
    812import org.springframework.stereotype.Service;
    913import org.springframework.web.multipart.MultipartFile;
     
    1317
    1418    private final LocalRepository localRepository;
     19    private final LocalManagerRepository localManagerRepository;
    1520    private final FileStorageService fileStorageService;
     21    private final UserService userService;
    1622
    17     public LocalManagerServiceImpl(LocalRepository localRepository, FileStorageService fileStorageService) {
     23    public LocalManagerServiceImpl(LocalRepository localRepository, LocalManagerRepository localManagerRepository, FileStorageService fileStorageService, UserService userService) {
    1824        this.localRepository = localRepository;
     25        this.localManagerRepository = localManagerRepository;
    1926        this.fileStorageService = fileStorageService;
     27        this.userService = userService;
    2028    }
    2129
     
    2937        localRepository.save(local);
    3038    }
     39
     40    @Override
     41    public void save(LocalManager localManager) {
     42        if (userService.emailExists(localManager.getEmail())) {
     43            throw new UserEmailAlreadyExistsException(localManager.getEmail());
     44        }
     45        localManagerRepository.save(localManager);
     46    }
    3147}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/LocalWorkerServiceImpl.java

    rb77dbe8 rfa26ba9  
    11package mk.ukim.finki.it.reservengo.service.impl;
    22
     3import mk.ukim.finki.it.reservengo.model.domain.LocalWorker;
     4import mk.ukim.finki.it.reservengo.model.exceptions.UserEmailAlreadyExistsException;
     5import mk.ukim.finki.it.reservengo.repository.LocalWorkerRepository;
    36import mk.ukim.finki.it.reservengo.service.intf.LocalWorkerService;
     7import mk.ukim.finki.it.reservengo.service.intf.UserService;
    48import org.springframework.stereotype.Service;
    59
    610@Service
    711public class LocalWorkerServiceImpl implements LocalWorkerService {
     12    private final LocalWorkerRepository localWorkerRepository;
     13    private final UserService userService;
     14
     15    public LocalWorkerServiceImpl(LocalWorkerRepository localWorkerRepository, UserService userService) {
     16        this.localWorkerRepository = localWorkerRepository;
     17        this.userService = userService;
     18    }
     19
     20    @Override
     21    public void save(LocalWorker localWorker) {
     22        if (userService.emailExists(localWorker.getEmail())) {
     23            throw new UserEmailAlreadyExistsException(localWorker.getEmail());
     24        }
     25        localWorkerRepository.save(localWorker);
     26    }
    827}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/UserServiceImpl.java

    rb77dbe8 rfa26ba9  
    33import mk.ukim.finki.it.reservengo.dto.userDTO.CreateUserDTO;
    44import mk.ukim.finki.it.reservengo.model.domain.User;
     5import mk.ukim.finki.it.reservengo.model.exceptions.EmailNotFoundException;
    56import mk.ukim.finki.it.reservengo.model.exceptions.UserIdNotFoundException;
    67import mk.ukim.finki.it.reservengo.repository.UserRepository;
     
    2122
    2223    @Override
    23     public User findUser(Long userId) {
     24    public User getUserById(Long userId) {
    2425        return userRepository.findById(userId).orElseThrow(() -> new UserIdNotFoundException(userId));
    2526    }
    2627
    2728    @Override
    28     public User editUserInfo(Long userId, CreateUserDTO createUserDTO) {
     29    public User getUserByEmail(String email) {
     30        return userRepository.findByEmail(email).orElseThrow(() -> new EmailNotFoundException(email));
     31    }
     32
     33    @Override
     34    public boolean emailExists(String email) {
     35        return userRepository.findByEmail(email).isPresent();
     36    }
     37
     38    @Override
     39    public User editUserProfile(Long userId, CreateUserDTO createUserDTO) {
    2940        User user = userRepository.findById(userId).orElseThrow(() -> new UserIdNotFoundException(userId));
    3041        updateUserFromDto(user, createUserDTO);
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/CustomerService.java

    rb77dbe8 rfa26ba9  
    11package mk.ukim.finki.it.reservengo.service.intf;
    22
     3import mk.ukim.finki.it.reservengo.model.domain.Customer;
    34import mk.ukim.finki.it.reservengo.model.domain.Local;
    45
     
    67
    78public interface CustomerService {
     9
    810    List<Local> listFavouriteLocals(Long id);
    911
     
    1113
    1214    void removeFavouriteLocal(Long userId, Long localId);
     15
     16    void save(Customer customer);
    1317}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/LocalManagerService.java

    rb77dbe8 rfa26ba9  
    11package mk.ukim.finki.it.reservengo.service.intf;
    22
     3import mk.ukim.finki.it.reservengo.model.domain.LocalManager;
    34import org.springframework.web.multipart.MultipartFile;
    45
    56public interface LocalManagerService {
    67    void uploadLogo(Long localId, MultipartFile logoFile);
     8
     9    void save(LocalManager localManager);
    710}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/LocalWorkerService.java

    rb77dbe8 rfa26ba9  
    11package mk.ukim.finki.it.reservengo.service.intf;
    22
     3import mk.ukim.finki.it.reservengo.model.domain.LocalWorker;
     4
    35public interface LocalWorkerService {
     6    void save(LocalWorker localWorker);
    47}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/UserService.java

    rb77dbe8 rfa26ba9  
    55
    66public interface UserService {
    7     User findUser(Long userId);
     7    User getUserById(Long userId);
    88
    9     User editUserInfo(Long userId, CreateUserDTO createUserDTO);
     9    User editUserProfile(Long userId, CreateUserDTO createUserDTO);
     10
     11    User getUserByEmail(String email);
     12
     13    boolean emailExists(String email);
    1014}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/advice/GlobalExceptionHandler.java

    rb77dbe8 rfa26ba9  
    4646        return ResponseEntity.status(HttpStatus.NOT_FOUND).body(ex.getMessage());
    4747    }
     48
     49    @ExceptionHandler(UserEmailAlreadyExistsException.class)
     50    public ResponseEntity<String> handleUserEmailAlreadyExists(UserEmailAlreadyExistsException ex) {
     51        return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage());
     52    }
    4853}
    4954
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/UserController.java

    rb77dbe8 rfa26ba9  
    2121    @GetMapping("/profile")
    2222    public ResponseEntity<?> getProfile(@AuthenticationPrincipal User user) {
    23         User u = userService.findUser(user.getId());
     23        User u = userService.getUserById(user.getId());
    2424        return ResponseEntity.ok(u);
    2525    }
     
    2727    @PutMapping("/edit")
    2828    public ResponseEntity<?> editProfile(@AuthenticationPrincipal User user, @RequestBody CreateUserDTO createUserDTO) {
    29         return ResponseEntity.ok(userService.editUserInfo(user.getId(), createUserDTO));
     29        return ResponseEntity.ok(userService.editUserProfile(user.getId(), createUserDTO));
    3030    }
    3131}
Note: See TracChangeset for help on using the changeset viewer.