diff --git a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java index fbcc2ac..1953fdb 100644 --- a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java +++ b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java @@ -1,6 +1,10 @@ package dev.example.restaurantManager.controller; +import dev.example.restaurantManager.model.Dessert; +import dev.example.restaurantManager.model.MainCourse; import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.repository.DessertRepository; +import dev.example.restaurantManager.repository.MainCourseRepository; import dev.example.restaurantManager.service.MenuItemService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; @@ -38,8 +42,8 @@ public ResponseEntity getMenuItemById(@PathVariable String id) { } @PutMapping("/{id}") - public ResponseEntity updateMenuItem(@PathVariable String id, @RequestBody MenuItem menuItemDetails) { - MenuItem updatedMenuItem = menuItemService.updateMenuItem(id, menuItemDetails); + public ResponseEntity updateMenuItem(@PathVariable String id, @RequestBody MenuItem menuItemDetails, Dessert dessertDetails, MainCourse mainCourseDetails) { + MenuItem updatedMenuItem = menuItemService.updateMenuItem(id, menuItemDetails, dessertDetails, mainCourseDetails); if (updatedMenuItem != null) { return new ResponseEntity<>(updatedMenuItem, HttpStatus.OK); } diff --git a/src/main/java/dev/example/restaurantManager/model/Dessert.java b/src/main/java/dev/example/restaurantManager/model/Dessert.java new file mode 100644 index 0000000..fbec778 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/Dessert.java @@ -0,0 +1,26 @@ +package dev.example.restaurantManager.model; + +import jakarta.persistence.Entity; +import lombok.Data; + + +@Data +@Entity +public class Dessert extends MenuItem { + + private boolean lactoseFree; + private boolean glutenFree; + + // Empty constructor for testing via Swagger + public Dessert() { + } + + public Dessert(String name, String description, double price, boolean lactoseFree, boolean glutenFree) { + // Call to constructor from superclass + super(name, description, price); + // Constructor from subclass + this.lactoseFree = lactoseFree; + this.glutenFree = glutenFree; + } + +} diff --git a/src/main/java/dev/example/restaurantManager/model/IMenuItem.java b/src/main/java/dev/example/restaurantManager/model/IMenuItem.java new file mode 100644 index 0000000..a9fa9f8 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/IMenuItem.java @@ -0,0 +1,9 @@ +package dev.example.restaurantManager.model; + + +public interface IMenuItem { + String getName(); + double getPrice(); + // Other common methods +} + diff --git a/src/main/java/dev/example/restaurantManager/model/MainCourse.java b/src/main/java/dev/example/restaurantManager/model/MainCourse.java new file mode 100644 index 0000000..0792dc9 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/MainCourse.java @@ -0,0 +1,28 @@ +package dev.example.restaurantManager.model; + +import jakarta.persistence.Entity; +import jakarta.persistence.GeneratedValue; +import jakarta.persistence.Id; +import lombok.Data; +import org.hibernate.annotations.GenericGenerator; + +@Data +@Entity +public class MainCourse extends MenuItem { + + private boolean vegan; + private boolean glutenFree; + + // Empty constructor for testing via Swagger + public MainCourse() { + } + + public MainCourse(String name, String description, double price, boolean vegan, boolean glutenFree) { + // Call to constructor from superclass + super(name, description, price); + // Constructor from subclass + this.vegan = vegan; + this.glutenFree = glutenFree; + } + +} diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java index d1ba851..c99939d 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -1,28 +1,49 @@ package dev.example.restaurantManager.model; +import com.fasterxml.jackson.annotation.JsonIgnore; +import com.fasterxml.jackson.annotation.JsonSubTypes; +import com.fasterxml.jackson.annotation.JsonTypeInfo; import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.GenericGenerator; + import java.util.List; @Data @AllArgsConstructor @NoArgsConstructor @Entity -public class MenuItem { +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) +// Generating object via Swagger it will be needed the field type "dessert" or "mainCourse" for instance each subclass +@JsonTypeInfo( + use = JsonTypeInfo.Id.NAME, + include = JsonTypeInfo.As.PROPERTY, + property = "type" +) +@JsonSubTypes({ + @JsonSubTypes.Type(value = Dessert.class, name = "dessert"), + @JsonSubTypes.Type(value = MainCourse.class, name = "mainCourse") +}) + + +public abstract class MenuItem implements IMenuItem { @Id + @GeneratedValue(generator = "UUID") + @GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator") private String id; private String name; private String description; private double price; + // Ignoring the List wrapper to focus solely on subclass instances when retrieving all objects via Swagger + @JsonIgnore @ManyToMany(mappedBy = "menuItems") private List menus; - public MenuItem(String id, String name, String description, double price) { - this.id = id; + public MenuItem(String name, String description, double price) { this.name = name; this.description = description; this.price = price; diff --git a/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java new file mode 100644 index 0000000..f452073 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java @@ -0,0 +1,9 @@ +package dev.example.restaurantManager.repository; + +import dev.example.restaurantManager.model.Dessert; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface DessertRepository extends JpaRepository { + + +} diff --git a/src/main/java/dev/example/restaurantManager/repository/MainCourseRepository.java b/src/main/java/dev/example/restaurantManager/repository/MainCourseRepository.java new file mode 100644 index 0000000..3e7f265 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/repository/MainCourseRepository.java @@ -0,0 +1,7 @@ +package dev.example.restaurantManager.repository; + +import dev.example.restaurantManager.model.MainCourse; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MainCourseRepository extends JpaRepository { +} diff --git a/src/main/java/dev/example/restaurantManager/service/DessertService.java b/src/main/java/dev/example/restaurantManager/service/DessertService.java new file mode 100644 index 0000000..4c04fde --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/DessertService.java @@ -0,0 +1,13 @@ +package dev.example.restaurantManager.service; + +import dev.example.restaurantManager.model.Dessert; +import java.util.List; + +public interface DessertService { + List getAllDesserts(); + Dessert createDessert(Dessert dessert); + Dessert getDessertById(String id); + Dessert updateDessert(String id, Dessert dessertDetails); + boolean deleteDessert(String id); + long countDesserts(); +} diff --git a/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java new file mode 100644 index 0000000..0238be7 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java @@ -0,0 +1,4 @@ +package dev.example.restaurantManager.service; + +public class DessertServiceImpl { +} diff --git a/src/main/java/dev/example/restaurantManager/service/MainCourseService.java b/src/main/java/dev/example/restaurantManager/service/MainCourseService.java new file mode 100644 index 0000000..01d7394 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/MainCourseService.java @@ -0,0 +1,15 @@ +package dev.example.restaurantManager.service; + +import dev.example.restaurantManager.model.MainCourse; +import java.util.List; + +public interface MainCourseService { + List getAllMainCourses(); + MainCourse createMainCourse(MainCourse mainCourse); + MainCourse getMainCourseById(String id); + MainCourse updateMainCourse(String id, MainCourse MainCourseDetails); + boolean deleteMainCourse(String id); + long countMainCourses(); +} + + diff --git a/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java new file mode 100644 index 0000000..3d57b0c --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java @@ -0,0 +1,4 @@ +package dev.example.restaurantManager.service; + +public class MainCourseServiceImpl { +} diff --git a/src/main/java/dev/example/restaurantManager/service/MenuItemService.java b/src/main/java/dev/example/restaurantManager/service/MenuItemService.java index b45c30f..23fa4a7 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuItemService.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuItemService.java @@ -1,5 +1,7 @@ package dev.example.restaurantManager.service; +import dev.example.restaurantManager.model.Dessert; +import dev.example.restaurantManager.model.MainCourse; import dev.example.restaurantManager.model.MenuItem; import java.util.List; @@ -7,7 +9,7 @@ public interface MenuItemService { List getAllMenuItems(); MenuItem createMenuItem(MenuItem menuItem); MenuItem getMenuItemById(String id); - MenuItem updateMenuItem(String id, MenuItem menuItemDetails); + MenuItem updateMenuItem(String id, MenuItem menuItemDetails, Dessert dessertDetails, MainCourse mainCourseDetails); boolean deleteMenuItem(String id); long countMenuItems(); } \ No newline at end of file diff --git a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java index ccce3d3..4de1620 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java @@ -1,50 +1,89 @@ package dev.example.restaurantManager.service; +import dev.example.restaurantManager.model.Dessert; +import dev.example.restaurantManager.model.MainCourse; import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.repository.DessertRepository; +import dev.example.restaurantManager.repository.MainCourseRepository; import dev.example.restaurantManager.repository.MenuItemRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; + +import java.util.ArrayList; import java.util.List; -import java.util.UUID; @Service public class MenuItemServiceImpl implements MenuItemService { @Autowired - private MenuItemRepository menuItemRepository; + MenuItemRepository menuItemRepository; + @Autowired + DessertRepository dessertRepository; + @Autowired + MainCourseRepository mainCourseRepository; + // Checking both repositories and put the results in a list @Override public List getAllMenuItems() { - return menuItemRepository.findAll(); + List menuItems = new ArrayList<>(); + menuItems.addAll(dessertRepository.findAll()); + menuItems.addAll(mainCourseRepository.findAll()); + return menuItems; } + // Save each instance in its own repository @Override public MenuItem createMenuItem(MenuItem menuItem) { - menuItem.setId(UUID.randomUUID().toString()); - return menuItemRepository.save(menuItem); + if (menuItem instanceof Dessert) { + return dessertRepository.save((Dessert) menuItem); + } else if (menuItem instanceof MainCourse) { + return mainCourseRepository.save((MainCourse) menuItem); + } + throw new IllegalArgumentException("Unsupported menu item type"); } @Override public MenuItem getMenuItemById(String id) { - return menuItemRepository.findById(id).orElse(null); + MenuItem menuItem = dessertRepository.findById(id).orElse(null); + if (menuItem == null) { + menuItem = mainCourseRepository.findById(id).orElse(null); + } + return menuItem; } @Override - public MenuItem updateMenuItem(String id, MenuItem menuItemDetails) { - MenuItem menuItem = menuItemRepository.findById(id).orElse(null); - if (menuItem != null) { - menuItem.setName(menuItemDetails.getName()); - menuItem.setDescription(menuItemDetails.getDescription()); - menuItem.setPrice(menuItemDetails.getPrice()); - return menuItemRepository.save(menuItem); + public MenuItem updateMenuItem(String id, MenuItem menuItemDetails, Dessert dessertDetails, MainCourse mainCourseDetails) { + if (dessertRepository.existsById(id)) { + Dessert dessert = dessertRepository.findById(id).orElse(null); + if (dessert != null) { + dessert.setName(dessertDetails.getName()); + dessert.setDescription(dessertDetails.getDescription()); + dessert.setPrice(dessertDetails.getPrice()); + dessert.setGlutenFree(dessertDetails.isGlutenFree()); + dessert.setGlutenFree(dessertDetails.isLactoseFree()); + return dessertRepository.save(dessert); + } + } else if (mainCourseRepository.existsById(id)) { + MainCourse mainCourse = mainCourseRepository.findById(id).orElse(null); + if (mainCourse != null) { + mainCourse.setName(mainCourseDetails.getName()); + mainCourse.setDescription(mainCourseDetails.getDescription()); + mainCourse.setPrice(mainCourseDetails.getPrice()); + mainCourse.setVegan(mainCourseDetails.isVegan()); + mainCourse.setGlutenFree(mainCourseDetails.isGlutenFree()); + return mainCourseRepository.save(mainCourse); + } } return null; } @Override public boolean deleteMenuItem(String id) { - if (menuItemRepository.existsById(id)) { - menuItemRepository.deleteById(id); + if (dessertRepository.existsById(id)) { + dessertRepository.deleteById(id); + return true; + } else if (mainCourseRepository.existsById(id)) { + mainCourseRepository.deleteById(id); return true; } return false; @@ -52,6 +91,6 @@ public boolean deleteMenuItem(String id) { @Override public long countMenuItems() { - return menuItemRepository.count(); + return dessertRepository.count() + mainCourseRepository.count(); } } \ No newline at end of file diff --git a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java index 760cf2a..25dbed0 100644 --- a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java +++ b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java @@ -6,7 +6,6 @@ import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component; -import java.time.LocalDate; import java.util.*; import java.util.concurrent.TimeUnit; @@ -44,7 +43,8 @@ public void loadAllData() { // then create relationships between them createCustomers(); createTables(); - createMenuItems(); + createMenuDessert(); + createMenuMainCourse(); // create and assign menu items createMenusAndAssignMenuItems(); @@ -94,17 +94,33 @@ private void createTables() { } } - // we are going to create 25 menu items + // we are going to create 10 Dessert // and save them in the H2 local database - private void createMenuItems() { - for (int i = 0; i < 25; i++) { - MenuItem menuItem = new MenuItem( + private void createMenuDessert() { + for (int i = 0; i < 10; i++) { + MenuItem menuDessert = new Dessert( UUID.randomUUID().toString(), faker.food().dish(), - faker.food().ingredient() + " " + faker.food().ingredient() , - faker.number().randomDouble(2, 5, 30) + faker.number().randomDouble(2, 5, 30), + faker.random().nextBoolean(), + faker.random().nextBoolean() + ); + menuItemRepository.save(menuDessert); + } + } + + // we are going to create 5 MainCourses + + private void createMenuMainCourse() { + for (int i = 0; i < 5; i++) { + MenuItem menuMainCourse = new MainCourse( + UUID.randomUUID().toString(), + faker.food().dish(), + faker.number().randomDouble(2, 5, 30), + faker.random().nextBoolean(), + faker.random().nextBoolean() ); - menuItemRepository.save(menuItem); + menuItemRepository.save(menuMainCourse); } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index cfb2150..0329d93 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -1,7 +1,7 @@ spring.application.name=restaurantManager # application.properties -spring.profiles.active=local +spring.profiles.active=memory @@ -28,4 +28,6 @@ endpoint.url.customers=/api/v1/customers/ # Enable debug logging #logging.level.org.springframework=DEBUG -#logging.level.dev.example.restaurantManager=DEBUG \ No newline at end of file +#logging.level.dev.example.restaurantManager=DEBUG + +server.port=8081 \ No newline at end of file diff --git a/src/test/java/dev/example/restaurantManager/BookingTableManyToManyTest.java b/src/test/java/dev/example/restaurantManager/Booking/BookingTableManyToManyTest.java similarity index 99% rename from src/test/java/dev/example/restaurantManager/BookingTableManyToManyTest.java rename to src/test/java/dev/example/restaurantManager/Booking/BookingTableManyToManyTest.java index e9bebaa..6df486b 100644 --- a/src/test/java/dev/example/restaurantManager/BookingTableManyToManyTest.java +++ b/src/test/java/dev/example/restaurantManager/Booking/BookingTableManyToManyTest.java @@ -1,4 +1,4 @@ -package dev.example.restaurantManager; +package dev.example.restaurantManager.Booking; import dev.example.restaurantManager.model.Booking; import dev.example.restaurantManager.model.Customer; diff --git a/src/test/java/dev/example/restaurantManager/CustomerControllerTest.java b/src/test/java/dev/example/restaurantManager/Customer/CustomerControllerTest.java similarity index 98% rename from src/test/java/dev/example/restaurantManager/CustomerControllerTest.java rename to src/test/java/dev/example/restaurantManager/Customer/CustomerControllerTest.java index 2a2b32d..8678c31 100644 --- a/src/test/java/dev/example/restaurantManager/CustomerControllerTest.java +++ b/src/test/java/dev/example/restaurantManager/Customer/CustomerControllerTest.java @@ -1,4 +1,4 @@ -package dev.example.restaurantManager; +package dev.example.restaurantManager.Customer; import dev.example.restaurantManager.controller.CustomerController; import dev.example.restaurantManager.model.Customer; diff --git a/src/test/java/dev/example/restaurantManager/CustomerRepositoryTest.java b/src/test/java/dev/example/restaurantManager/Customer/CustomerRepositoryTest.java similarity index 100% rename from src/test/java/dev/example/restaurantManager/CustomerRepositoryTest.java rename to src/test/java/dev/example/restaurantManager/Customer/CustomerRepositoryTest.java diff --git a/src/test/java/dev/example/restaurantManager/CustomerServiceTest.java b/src/test/java/dev/example/restaurantManager/Customer/CustomerServiceTest.java similarity index 100% rename from src/test/java/dev/example/restaurantManager/CustomerServiceTest.java rename to src/test/java/dev/example/restaurantManager/Customer/CustomerServiceTest.java diff --git a/src/test/java/dev/example/restaurantManager/MenuItem/MenuItemSuperclass.java b/src/test/java/dev/example/restaurantManager/MenuItem/MenuItemSuperclass.java new file mode 100644 index 0000000..07962db --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/MenuItem/MenuItemSuperclass.java @@ -0,0 +1,45 @@ +package dev.example.restaurantManager.MenuItem; + +import dev.example.restaurantManager.model.Dessert; +import dev.example.restaurantManager.model.MainCourse; +import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.repository.DessertRepository; +import dev.example.restaurantManager.repository.MainCourseRepository; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import static org.assertj.core.api.Assertions.*; + +import java.awt.*; + +@SpringBootTest +public class MenuItemSuperclass { + + @Autowired + DessertRepository dessertRepository; + @Autowired + MainCourseRepository mainCourseRepository; + + @Test + void testMethodsFromSuperclass(){ + // Create objects + Dessert dessert1 = new Dessert("Ice-cream", "2 balls with cream", 4.5, false, false); + MainCourse mainCourse1 = new MainCourse("Steak", "Meat with french fries", 18.50, false, true); + // Saving objects in their repositories + dessertRepository.save(dessert1); + mainCourseRepository.save(mainCourse1); + + String name = dessert1.getName(); + double price = mainCourse1.getPrice(); + + // Checking if name and price are ok using methods from MenuItem's interface + assertThat(dessert1.getName()).isEqualTo("Ice-cream"); + assertThat(mainCourse1.getPrice()).isEqualTo(18.50); + + // Printing result + System.out.println("The name from dessert is: " + name); + System.out.println("The price from the main course is: " + price); + + } + +}