Changeset 3041023


Ignore:
Timestamp:
05/02/25 23:34:33 (13 hours ago)
Author:
Nikola Jordanoski <nikolaj_koko@…>
Branches:
master
Parents:
dd7a2b6
Message:

Code cleanup + total DTO conversion + total exception handling

Location:
ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo
Files:
5 added
20 edited

Legend:

Unmodified
Added
Removed
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/Local.java

    rdd7a2b6 r3041023  
    1717@NoArgsConstructor
    1818public class Local {
    19     public Local(String name, String description, String address, String workingHours, List<Service> availableServices, Map<Long, Integer> ratings, List<Event> events, List<String> localPhotos, String menuPhoto, String menuLink, Contact contact, List<Reservation> reservations, List<LocalWorker> workers) {
    20         this.name = name;
    21         this.description = description;
    22         this.address = address;
    23         this.workingHours = workingHours;
    24         this.availableServices = availableServices;
    25         this.ratings = ratings;
    26         this.events = events;
    27         this.localPhotos = localPhotos;
    28         this.menuPhoto = menuPhoto;
    29         this.menuLink = menuLink;
    30         this.contact = contact;
    31         this.reservations = reservations;
    32         this.workers = workers;
    33     }
    34 
    35     public Local(String name) {
    36         this.name = name;
    37     }
    38 
    39 
    4019    @Id
    4120    @GeneratedValue(strategy = GenerationType.IDENTITY)
     
    8059    private String logoUrl;
    8160
    82     public double calculateLocalAverageRating() {
    83         if (ratings == null || ratings.isEmpty()) {
    84             return 0.0;
    85         }
    86         double sum = 0.0;
    87         for (Integer rating : ratings.values()) {
    88             sum += rating;
    89         }
    90         return sum / ratings.size();
     61    public Local(String name, String description, String address, String workingHours, List<Service> availableServices, Map<Long, Integer> ratings, List<Event> events, List<String> localPhotos, String menuPhoto, String menuLink, Contact contact, List<Reservation> reservations, List<LocalWorker> workers) {
     62        this.name = name;
     63        this.description = description;
     64        this.address = address;
     65        this.workingHours = workingHours;
     66        this.availableServices = availableServices;
     67        this.ratings = ratings;
     68        this.events = events;
     69        this.localPhotos = localPhotos;
     70        this.menuPhoto = menuPhoto;
     71        this.menuLink = menuLink;
     72        this.contact = contact;
     73        this.reservations = reservations;
     74        this.workers = workers;
    9175    }
    9276
     77    public Local(String name) {
     78        this.name = name;
     79    }
     80
     81    public double getAverageRating() {
     82        if (ratings == null || ratings.isEmpty()) {
     83            return 0;
     84        }
     85
     86        return ratings.values().stream()
     87                .mapToInt(Integer::intValue)
     88                .average()
     89                .orElse(0.0);
     90    }
    9391}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/LocalManager.java

    rdd7a2b6 r3041023  
    22
    33import jakarta.persistence.Entity;
     4import jakarta.persistence.EnumType;
     5import jakarta.persistence.Enumerated;
     6import jakarta.persistence.ManyToOne;
     7import lombok.AllArgsConstructor;
    48import lombok.Data;
    59import lombok.EqualsAndHashCode;
    610import lombok.NoArgsConstructor;
     11import mk.ukim.finki.it.reservengo.model.enumerations.Position;
    712import mk.ukim.finki.it.reservengo.model.enumerations.Role;
    813
     
    1015@Entity
    1116@NoArgsConstructor
     17@AllArgsConstructor
    1218@Data
    13 public class LocalManager extends LocalWorker {
     19public class LocalManager extends User {
     20    @ManyToOne
     21    private Local local;
     22
     23    @Enumerated(EnumType.STRING)
     24    private Position position;
     25
    1426    public LocalManager(String firstName, String lastName, String email, String password, String phoneNumber, Role userRole) {
    1527        super(firstName, lastName, email, password, phoneNumber, userRole);
    1628    }
    17 
    1829}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/domain/LocalWorker.java

    rdd7a2b6 r3041023  
    2727        super(firstName, lastName, email, password, phoneNumber, userRole);
    2828    }
    29 
    3029}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/EmailNotFoundException.java

    rdd7a2b6 r3041023  
    33public class EmailNotFoundException extends RuntimeException {
    44    public EmailNotFoundException(String email) {
    5         super("User with email: " + email + " not found");
     5        super("User with email: " + email + " not found.");
    66    }
    77}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/ReservationIdNotFoundException.java

    rdd7a2b6 r3041023  
    33public class ReservationIdNotFoundException extends RuntimeException {
    44    public ReservationIdNotFoundException(Long id) {
    5         super("Reservation with id: " + id + " not found");
     5        super("Reservation with id: " + id + " not found.");
    66    }
    77}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/model/exceptions/UserEmailAlreadyExistsException.java

    rdd7a2b6 r3041023  
    33public class UserEmailAlreadyExistsException extends RuntimeException {
    44    public UserEmailAlreadyExistsException(String email) {
    5         super("User with email: " + email + " already exists");
     5        super("User with email: " + email + " already exists.");
    66    }
    77}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/AdminServiceImpl.java

    rdd7a2b6 r3041023  
    33import mk.ukim.finki.it.reservengo.dto.localDTO.CreateLocalDTO;
    44import mk.ukim.finki.it.reservengo.service.intf.AdminService;
     5import mk.ukim.finki.it.reservengo.service.intf.CustomerService;
    56import mk.ukim.finki.it.reservengo.service.intf.LocalService;
    67import org.springframework.stereotype.Service;
     
    1112    private final LocalService localService;
    1213
    13     public AdminServiceImpl(LocalService localService) {
     14    public AdminServiceImpl(LocalService localService, CustomerService customerService) {
    1415        this.localService = localService;
    1516    }
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/CustomerServiceImpl.java

    rdd7a2b6 r3041023  
    11package mk.ukim.finki.it.reservengo.service.impl;
    22
     3import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
    34import mk.ukim.finki.it.reservengo.model.domain.Customer;
    45import mk.ukim.finki.it.reservengo.model.domain.Local;
    56import mk.ukim.finki.it.reservengo.model.exceptions.CustomerIdNotFoundException;
     7import mk.ukim.finki.it.reservengo.model.exceptions.LocalAlreadyFavouredException;
     8import mk.ukim.finki.it.reservengo.model.exceptions.LocalAlreadyUnfavouredException;
    69import mk.ukim.finki.it.reservengo.model.exceptions.UserEmailAlreadyExistsException;
    710import mk.ukim.finki.it.reservengo.repository.CustomerRepository;
     
    2629
    2730    @Override
    28     public List<Local> listFavouriteLocals(Long id) {
     31    public List<DisplayLocalDTO> listFavouriteLocals(Long id) {
    2932        Customer customer = customerRepository.findById(id).orElseThrow(() -> new CustomerIdNotFoundException(id));
    30         return customer.getFavouriteLocals();
     33        return DisplayLocalDTO.fromLocals(customer.getFavouriteLocals());
    3134    }
    3235
     
    3639        Local local = localService.getLocalById(localId);
    3740
    38         if (!customer.getFavouriteLocals().contains(local)) {
    39             customer.getFavouriteLocals().add(local);
     41        if (customer.getFavouriteLocals().contains(local)) {
     42            throw new LocalAlreadyFavouredException(localId);
    4043        }
    4144
     45        customer.getFavouriteLocals().add(local);
    4246        customerRepository.save(customer);
    4347    }
     
    4852        Local local = localService.getLocalById(localId);
    4953
     54        if (!customer.getFavouriteLocals().contains(local)) {
     55            throw new LocalAlreadyUnfavouredException(localId);
     56        }
     57
    5058        customer.getFavouriteLocals().remove(local);
    51 
    5259        customerRepository.save(customer);
    5360    }
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/LocalServiceImpl.java

    rdd7a2b6 r3041023  
    3939        localRepository.delete(local);
    4040    }
    41 
    42 
    4341}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/ReservationServiceImpl.java

    rdd7a2b6 r3041023  
    11package mk.ukim.finki.it.reservengo.service.impl;
    22
    3 import mk.ukim.finki.it.reservengo.model.domain.Reservation;
    4 import mk.ukim.finki.it.reservengo.model.exceptions.ReservationIdNotFoundException;
    5 import mk.ukim.finki.it.reservengo.repository.ReservationRepository;
    63import mk.ukim.finki.it.reservengo.service.intf.ReservationService;
    74import org.springframework.stereotype.Service;
    8 
    9 import java.util.List;
    105
    116
    127@Service
    138public class ReservationServiceImpl implements ReservationService {
    14 
    15     private final ReservationRepository reservationRepository;
    16 
    17     public ReservationServiceImpl(ReservationRepository reservationRepository) {
    18         this.reservationRepository = reservationRepository;
    19     }
    20 
    21     @Override
    22     public Reservation getReservationById(Long id) {
    23         return this.reservationRepository.findById(id).orElseThrow(() -> new ReservationIdNotFoundException(id));
    24     }
    25 
    26     @Override
    27     public List<Reservation> getCustomerReservations(Long id) {
    28         return this.reservationRepository.findAllByCustomerId(id);
    29     }
    30 
    319}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/impl/UserServiceImpl.java

    rdd7a2b6 r3041023  
    5959
    6060    @Override
    61     public String changePassword(Long userId, EditUserPasswordDTO editUserPasswordDTO) {
     61    public void changePassword(Long userId, EditUserPasswordDTO editUserPasswordDTO) {
    6262        User user = userRepository.findById(userId).orElseThrow(() -> new UserIdNotFoundException(userId));
    6363
     
    6868        user.setPassword(passwordEncoder.encode(editUserPasswordDTO.newPassword()));
    6969        userRepository.save(user);
    70 
    71         return "Password updated successfully!";
    7270    }
    7371
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/CustomerService.java

    rdd7a2b6 r3041023  
    11package mk.ukim.finki.it.reservengo.service.intf;
    22
     3import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
    34import mk.ukim.finki.it.reservengo.model.domain.Customer;
    45import mk.ukim.finki.it.reservengo.model.domain.Local;
     
    89public interface CustomerService {
    910
    10     List<Local> listFavouriteLocals(Long id);
     11    List<DisplayLocalDTO> listFavouriteLocals(Long id);
    1112
    1213    void addFavouriteLocal(Long userId, Long localId);
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/ReservationService.java

    rdd7a2b6 r3041023  
    11package mk.ukim.finki.it.reservengo.service.intf;
    22
    3 import mk.ukim.finki.it.reservengo.model.domain.Reservation;
    4 
    5 import java.util.List;
    6 
    73public interface ReservationService {
    8     Reservation getReservationById(Long id);
    9     List<Reservation> getCustomerReservations(Long id);
    104}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/service/intf/UserService.java

    rdd7a2b6 r3041023  
    1515    DisplayUserEmailDTO changeEmail(Long userId, EditUserEmailDTO editUserEmailDTO);
    1616
    17     String changePassword(Long userId, EditUserPasswordDTO editUserPasswordDTO);
     17    void changePassword(Long userId, EditUserPasswordDTO editUserPasswordDTO);
    1818}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/advice/GlobalExceptionHandler.java

    rdd7a2b6 r3041023  
    6161        return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage());
    6262    }
     63
     64    @ExceptionHandler(LocalAlreadyFavouredException.class)
     65    public ResponseEntity<String> handleLocalAlreadyFavoured(LocalAlreadyFavouredException ex) {
     66        return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage());
     67    }
     68
     69    @ExceptionHandler(LocalAlreadyUnfavouredException.class)
     70    public ResponseEntity<String> handleLocalAlreadyUnfavoured(LocalAlreadyUnfavouredException ex) {
     71        return ResponseEntity.status(HttpStatus.CONFLICT).body(ex.getMessage());
     72    }
    6373}
    6474
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/AdminController.java

    rdd7a2b6 r3041023  
    2020
    2121    @PostMapping("/add")
    22     public ResponseEntity<?> addLocal(@RequestBody CreateLocalDTO localDTO) {
     22    public ResponseEntity<Void> addLocal(@RequestBody CreateLocalDTO localDTO) {
    2323        adminService.addLocal(localDTO);
    2424        return new ResponseEntity<>(HttpStatus.OK);
     
    2626
    2727    @DeleteMapping("/delete/{id}")
    28     public ResponseEntity<?> deleteLocal(@PathVariable Long id) {
     28    public ResponseEntity<Void> deleteLocal(@PathVariable Long id) {
    2929        adminService.deleteLocal(id);
    3030        return new ResponseEntity<>(HttpStatus.OK);
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/CustomerController.java

    rdd7a2b6 r3041023  
    11package mk.ukim.finki.it.reservengo.web.controller;
    22
    3 import mk.ukim.finki.it.reservengo.model.domain.Local;
    4 import mk.ukim.finki.it.reservengo.model.domain.Reservation;
     3import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
    54import mk.ukim.finki.it.reservengo.model.domain.User;
    65import mk.ukim.finki.it.reservengo.service.intf.CustomerService;
    7 import mk.ukim.finki.it.reservengo.service.intf.ReservationService;
    86import org.springframework.http.HttpStatus;
    97import org.springframework.http.ResponseEntity;
     
    2018
    2119    private final CustomerService customerService;
    22     private final ReservationService reservationService;
    2320
    24     public CustomerController(CustomerService customerService, ReservationService reservationService) {
     21    public CustomerController(CustomerService customerService) {
    2522        this.customerService = customerService;
    26         this.reservationService = reservationService;
    27     }
    28 
    29     @GetMapping("/reservations")
    30     public ResponseEntity<?> getCustomerReservations(@AuthenticationPrincipal User user) {
    31         List<Reservation> customerReservations = reservationService.getCustomerReservations(user.getId());
    32         return new ResponseEntity<>(customerReservations, HttpStatus.OK);
    3323    }
    3424
    3525    @GetMapping("/favourite-locals")
    36     public ResponseEntity<?> listFavouriteLocals(@AuthenticationPrincipal User user) {
    37         List<Local> favouriteLocals = customerService.listFavouriteLocals(user.getId());
    38         return new ResponseEntity<>(favouriteLocals, HttpStatus.OK);
     26    public ResponseEntity<List<DisplayLocalDTO>> listFavouriteLocals(@AuthenticationPrincipal User user) {
     27        return new ResponseEntity<>(customerService.listFavouriteLocals(user.getId()), HttpStatus.OK);
    3928    }
    4029
    4130    @PostMapping("/favourite-locals/add/{id}")
    42     public ResponseEntity<?> addFavouriteLocal(@AuthenticationPrincipal User user, @PathVariable Long id) {
     31    public ResponseEntity<Void> addFavouriteLocal(@AuthenticationPrincipal User user, @PathVariable Long id) {
    4332        customerService.addFavouriteLocal(user.getId(), id);
    4433        return new ResponseEntity<>(HttpStatus.OK);
     
    4635
    4736    @PostMapping("/favourite-locals/remove/{id}")
    48     public ResponseEntity<?> removeFavouriteLocal(@AuthenticationPrincipal User user, @PathVariable Long id) {
     37    public ResponseEntity<Void> removeFavouriteLocal(@AuthenticationPrincipal User user, @PathVariable Long id) {
    4938        customerService.removeFavouriteLocal(user.getId(), id);
    5039        return new ResponseEntity<>(HttpStatus.OK);
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/LocalController.java

    rdd7a2b6 r3041023  
    11package mk.ukim.finki.it.reservengo.web.controller;
    22
     3import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDTO;
     4import mk.ukim.finki.it.reservengo.dto.localDTO.DisplayLocalDetailsDTO;
    35import mk.ukim.finki.it.reservengo.model.domain.Local;
    46import mk.ukim.finki.it.reservengo.service.intf.LocalService;
     
    68import org.springframework.http.ResponseEntity;
    79import org.springframework.web.bind.annotation.*;
     10
     11import java.util.List;
    812
    913@RestController
     
    1822
    1923    @GetMapping
    20     public ResponseEntity<?> getLocals() {
    21         return new ResponseEntity<>(localService.listAll(), HttpStatus.OK);
     24    public ResponseEntity<List<DisplayLocalDTO>> getLocals() {
     25        List<DisplayLocalDTO> displayLocalDTOList = DisplayLocalDTO.fromLocals(localService.listAll());
     26        return new ResponseEntity<>(displayLocalDTOList, HttpStatus.OK);
    2227    }
    2328
    2429    @GetMapping("/{id}")
    25     public ResponseEntity<?> getLocalInformation(@PathVariable Long id) {
    26         Local local = localService.getLocalById(id);
     30    public ResponseEntity<DisplayLocalDetailsDTO> getLocalDetails(@PathVariable Long id) {
     31        DisplayLocalDetailsDTO local = DisplayLocalDetailsDTO.from(localService.getLocalById(id));
    2732        return new ResponseEntity<>(local, HttpStatus.OK);
    2833    }
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/ReservationController.java

    rdd7a2b6 r3041023  
    11package mk.ukim.finki.it.reservengo.web.controller;
    22
    3 import mk.ukim.finki.it.reservengo.model.domain.Reservation;
    4 import mk.ukim.finki.it.reservengo.model.enumerations.ReservationStatus;
    5 import mk.ukim.finki.it.reservengo.service.intf.ReservationService;
    6 import org.springframework.http.ResponseEntity;
    7 import org.springframework.web.bind.annotation.*;
     3import org.springframework.web.bind.annotation.RequestMapping;
     4import org.springframework.web.bind.annotation.RestController;
    85
    96@RestController
    107@RequestMapping("/api/reservations")
    118public class ReservationController {
    12     private final ReservationService reservationService;
    13 
    14     public ReservationController(ReservationService reservationService) {
    15         this.reservationService = reservationService;
    16     }
    17 
    18     //TODO RE-EVALUATE RESERVATIONS ARCHITECTURE
    19 
    20     @GetMapping("/{id}")
    21     public ResponseEntity<?> getReservationInformation(@PathVariable Long id) {
    22         Reservation reservation = reservationService.getReservationById(id);
    23         return ResponseEntity.ok(reservation);
    24     }
    25 
    26     @PostMapping("/{id}/status")
    27     public ResponseEntity<?> updateReservationStatus(@PathVariable Long id, @RequestParam ReservationStatus status) {
    28         Reservation reservation = reservationService.getReservationById(id);
    29         reservation.setStatus(status);
    30         return ResponseEntity.ok(reservation);
    31     }
    32 
    339}
  • ReserveNGo-backend/src/main/java/mk/ukim/finki/it/reservengo/web/controller/UserController.java

    rdd7a2b6 r3041023  
    3737
    3838    @PatchMapping("/change-password")
    39     public ResponseEntity<String> changePassword(@AuthenticationPrincipal User user, @RequestBody EditUserPasswordDTO editUserPasswordDTO) {
    40         return new ResponseEntity<>(userService.changePassword(user.getId(), editUserPasswordDTO), HttpStatus.OK);
     39    public ResponseEntity<Void> changePassword(@AuthenticationPrincipal User user, @RequestBody EditUserPasswordDTO editUserPasswordDTO) {
     40        userService.changePassword(user.getId(), editUserPasswordDTO);
     41        return new ResponseEntity<>(HttpStatus.OK);
    4142    }
    4243}
Note: See TracChangeset for help on using the changeset viewer.