From e71b76e8528f8d4af06e6b132913b79bb66a28fc Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Wed, 6 Nov 2024 09:01:04 +0100 Subject: [PATCH 1/7] Adding new subclasses, interface for MenuItem, and JPA repositories. --- .../restaurantManager/model/Dessert.java | 7 ++++++ .../restaurantManager/model/IMenuItem.java | 9 +++++++ .../restaurantManager/model/MainCourse.java | 9 +++++++ .../restaurantManager/model/MenuItem.java | 3 ++- .../repository/DessertRepository.java | 7 ++++++ .../repository/MainCourseRepository.java | 7 ++++++ .../utilities/DataLoader.java | 24 +++++++++---------- 7 files changed, 53 insertions(+), 13 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/model/Dessert.java create mode 100644 src/main/java/dev/example/restaurantManager/model/IMenuItem.java create mode 100644 src/main/java/dev/example/restaurantManager/model/MainCourse.java create mode 100644 src/main/java/dev/example/restaurantManager/repository/DessertRepository.java create mode 100644 src/main/java/dev/example/restaurantManager/repository/MainCourseRepository.java 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..5cc7d4b --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/Dessert.java @@ -0,0 +1,7 @@ +package dev.example.restaurantManager.model; + +import jakarta.persistence.Entity; + +@Entity +public class Dessert extends MenuItem { +} 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..9b04aa1 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/MainCourse.java @@ -0,0 +1,9 @@ +package dev.example.restaurantManager.model; + +import jakarta.persistence.Entity; + +@Entity +public class MainCourse extends MenuItem { + + +} diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java index d1ba851..b38bf2e 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -10,7 +10,8 @@ @AllArgsConstructor @NoArgsConstructor @Entity -public class MenuItem { +@Inheritance(strategy = InheritanceType.TABLE_PER_CLASS) +public abstract class MenuItem implements IMenuItem { @Id private String id; 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..9dbe9f9 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java @@ -0,0 +1,7 @@ +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/utilities/DataLoader.java b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java index 760cf2a..099d834 100644 --- a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java +++ b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java @@ -44,7 +44,7 @@ public void loadAllData() { // then create relationships between them createCustomers(); createTables(); - createMenuItems(); + //createMenuItems(); // create and assign menu items createMenusAndAssignMenuItems(); @@ -96,17 +96,17 @@ private void createTables() { // we are going to create 25 menu items // and save them in the H2 local database - private void createMenuItems() { - for (int i = 0; i < 25; i++) { - MenuItem menuItem = new MenuItem( - UUID.randomUUID().toString(), - faker.food().dish(), - faker.food().ingredient() + " " + faker.food().ingredient() , - faker.number().randomDouble(2, 5, 30) - ); - menuItemRepository.save(menuItem); - } - } +// private void createMenuItems() { +// for (int i = 0; i < 25; i++) { +// MenuItem menuItem = new MenuItem( +// UUID.randomUUID().toString(), +// faker.food().dish(), +// faker.food().ingredient() + " " + faker.food().ingredient() , +// faker.number().randomDouble(2, 5, 30) +// ); +// menuItemRepository.save(menuItem); +// } +// } // we are going to create 15 menus // and assign 5 to 10 menu items to each menu From 4c2b33b11e336e355fdeb53d6e1e2a06055427f4 Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Wed, 6 Nov 2024 20:05:14 +0100 Subject: [PATCH 2/7] Adding attributes. --- .../dev/example/restaurantManager/model/Dessert.java | 10 ++++++++++ .../example/restaurantManager/model/MainCourse.java | 9 +++++++++ .../dev/example/restaurantManager/model/MenuItem.java | 7 +++++-- 3 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/example/restaurantManager/model/Dessert.java b/src/main/java/dev/example/restaurantManager/model/Dessert.java index 5cc7d4b..18d9ddf 100644 --- a/src/main/java/dev/example/restaurantManager/model/Dessert.java +++ b/src/main/java/dev/example/restaurantManager/model/Dessert.java @@ -1,7 +1,17 @@ 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 Dessert extends MenuItem { + + private boolean lactoseFree; + private boolean glutenFree; + + } diff --git a/src/main/java/dev/example/restaurantManager/model/MainCourse.java b/src/main/java/dev/example/restaurantManager/model/MainCourse.java index 9b04aa1..b1dedea 100644 --- a/src/main/java/dev/example/restaurantManager/model/MainCourse.java +++ b/src/main/java/dev/example/restaurantManager/model/MainCourse.java @@ -1,9 +1,18 @@ 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; + + } diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java index b38bf2e..5416f18 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -4,6 +4,8 @@ import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.hibernate.annotations.GenericGenerator; + import java.util.List; @Data @@ -14,6 +16,8 @@ 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; @@ -22,8 +26,7 @@ public abstract class MenuItem implements IMenuItem { @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; From b57279f338a86507771c00c005f8249285de241b Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Thu, 7 Nov 2024 08:54:08 +0100 Subject: [PATCH 3/7] Refactoring tests in their own package. First steps in test for superclass and subclasses. --- .../BookingTableManyToManyTest.java | 2 +- .../CustomerControllerTest.java | 2 +- .../CustomerRepositoryTest.java | 0 .../{ => Customer}/CustomerServiceTest.java | 0 .../MenuItem/MenuItemSuperclass.java | 23 +++++++++++++++++++ 5 files changed, 25 insertions(+), 2 deletions(-) rename src/test/java/dev/example/restaurantManager/{ => Booking}/BookingTableManyToManyTest.java (99%) rename src/test/java/dev/example/restaurantManager/{ => Customer}/CustomerControllerTest.java (98%) rename src/test/java/dev/example/restaurantManager/{ => Customer}/CustomerRepositoryTest.java (100%) rename src/test/java/dev/example/restaurantManager/{ => Customer}/CustomerServiceTest.java (100%) create mode 100644 src/test/java/dev/example/restaurantManager/MenuItem/MenuItemSuperclass.java 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..71f9fe0 --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/MenuItem/MenuItemSuperclass.java @@ -0,0 +1,23 @@ +package dev.example.restaurantManager.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; + +@SpringBootTest +public class MenuItemSuperclass { + + @Autowired + DessertRepository dessertRepository; + @Autowired + MainCourseRepository mainCourseRepository; + + @Test + void testMethodsFromSuperclass(){ + + + } + +} From 622fdeb9817049016c7a995439de82f234436c5b Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Thu, 7 Nov 2024 11:51:35 +0100 Subject: [PATCH 4/7] application.properties in memory. Adding new services. MenuItemSuperclass test: Passed! --- .../restaurantManager/model/Dessert.java | 11 +++++++--- .../restaurantManager/model/MainCourse.java | 8 ++++++- .../repository/DessertRepository.java | 2 ++ .../service/DessertService.java | 13 +++++++++++ .../service/DessertServiceImpl.java | 4 ++++ .../service/MainCourseService.java | 15 +++++++++++++ .../service/MainCourseServiceImpl.java | 4 ++++ src/main/resources/application.properties | 2 +- .../MenuItem/MenuItemSuperclass.java | 22 +++++++++++++++++++ 9 files changed, 76 insertions(+), 5 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/service/DessertService.java create mode 100644 src/main/java/dev/example/restaurantManager/service/DessertServiceImpl.java create mode 100644 src/main/java/dev/example/restaurantManager/service/MainCourseService.java create mode 100644 src/main/java/dev/example/restaurantManager/service/MainCourseServiceImpl.java diff --git a/src/main/java/dev/example/restaurantManager/model/Dessert.java b/src/main/java/dev/example/restaurantManager/model/Dessert.java index 18d9ddf..9f26c58 100644 --- a/src/main/java/dev/example/restaurantManager/model/Dessert.java +++ b/src/main/java/dev/example/restaurantManager/model/Dessert.java @@ -1,10 +1,8 @@ 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 @@ -13,5 +11,12 @@ public class Dessert extends MenuItem { private boolean lactoseFree; private boolean glutenFree; + 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/MainCourse.java b/src/main/java/dev/example/restaurantManager/model/MainCourse.java index b1dedea..cdb899c 100644 --- a/src/main/java/dev/example/restaurantManager/model/MainCourse.java +++ b/src/main/java/dev/example/restaurantManager/model/MainCourse.java @@ -13,6 +13,12 @@ public class MainCourse extends MenuItem { private boolean vegan; private boolean glutenFree; - + 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/repository/DessertRepository.java b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java index 9dbe9f9..f452073 100644 --- a/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java +++ b/src/main/java/dev/example/restaurantManager/repository/DessertRepository.java @@ -4,4 +4,6 @@ import org.springframework.data.jpa.repository.JpaRepository; public interface DessertRepository 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/resources/application.properties b/src/main/resources/application.properties index cfb2150..56fa3b7 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 diff --git a/src/test/java/dev/example/restaurantManager/MenuItem/MenuItemSuperclass.java b/src/test/java/dev/example/restaurantManager/MenuItem/MenuItemSuperclass.java index 71f9fe0..07962db 100644 --- a/src/test/java/dev/example/restaurantManager/MenuItem/MenuItemSuperclass.java +++ b/src/test/java/dev/example/restaurantManager/MenuItem/MenuItemSuperclass.java @@ -1,10 +1,16 @@ 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 { @@ -16,7 +22,23 @@ public class MenuItemSuperclass { @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); } From 0dc71290711d49fa91b9bd7a12b09dd2dab11979 Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Thu, 7 Nov 2024 13:07:45 +0100 Subject: [PATCH 5/7] Changes in MenuItem controller and serviceimpl. --- .../controller/MenuItemController.java | 2 + .../service/MenuItemServiceImpl.java | 64 +++++++++++++++---- 2 files changed, 52 insertions(+), 14 deletions(-) diff --git a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java index fbcc2ac..64ffad1 100644 --- a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java +++ b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java @@ -1,6 +1,8 @@ package dev.example.restaurantManager.controller; 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; diff --git a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java index ccce3d3..57502ca 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java @@ -1,9 +1,15 @@ 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; @@ -11,40 +17,70 @@ 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); + if (dessertRepository.existsById(id)) { + Dessert dessert = dessertRepository.findById(id).orElse(null); + if (dessert != null) { + dessert.setName(menuItemDetails.getName()); + dessert.setDescription(menuItemDetails.getDescription()); + dessert.setPrice(menuItemDetails.getPrice()); + return dessertRepository.save(dessert); + } + } else if (mainCourseRepository.existsById(id)) { + MainCourse mainCourse = mainCourseRepository.findById(id).orElse(null); + if (mainCourse != null) { + mainCourse.setName(menuItemDetails.getName()); + mainCourse.setDescription(menuItemDetails.getDescription()); + mainCourse.setPrice(menuItemDetails.getPrice()); + 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 +88,6 @@ public boolean deleteMenuItem(String id) { @Override public long countMenuItems() { - return menuItemRepository.count(); + return dessertRepository.count() + mainCourseRepository.count(); } } \ No newline at end of file From 2697a68073b61491fbb046652354ffd23270842c Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Fri, 8 Nov 2024 09:05:38 +0100 Subject: [PATCH 6/7] Changes in updateMenuItem. Pending to test. --- .../controller/MenuItemController.java | 6 ++++-- .../service/MenuItemService.java | 4 +++- .../service/MenuItemServiceImpl.java | 19 +++++++++++-------- 3 files changed, 18 insertions(+), 11 deletions(-) diff --git a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java index 64ffad1..1953fdb 100644 --- a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java +++ b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java @@ -1,5 +1,7 @@ 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; @@ -40,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/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 57502ca..4de1620 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java @@ -11,7 +11,6 @@ import java.util.ArrayList; import java.util.List; -import java.util.UUID; @Service public class MenuItemServiceImpl implements MenuItemService { @@ -53,21 +52,25 @@ public MenuItem getMenuItemById(String id) { } @Override - public MenuItem updateMenuItem(String id, MenuItem menuItemDetails) { + 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(menuItemDetails.getName()); - dessert.setDescription(menuItemDetails.getDescription()); - dessert.setPrice(menuItemDetails.getPrice()); + 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(menuItemDetails.getName()); - mainCourse.setDescription(menuItemDetails.getDescription()); - mainCourse.setPrice(menuItemDetails.getPrice()); + mainCourse.setName(mainCourseDetails.getName()); + mainCourse.setDescription(mainCourseDetails.getDescription()); + mainCourse.setPrice(mainCourseDetails.getPrice()); + mainCourse.setVegan(mainCourseDetails.isVegan()); + mainCourse.setGlutenFree(mainCourseDetails.isGlutenFree()); return mainCourseRepository.save(mainCourse); } } From bc3a99e1733f392fc895bb6c4f73026dc9f3e93d Mon Sep 17 00:00:00 2001 From: AlberteMB Date: Sun, 10 Nov 2024 12:45:17 +0100 Subject: [PATCH 7/7] - application.properties new port 8081. - DataLoader adding new faker for each subclass Dessert and MainCourse. - Adding empty constructor in MainCourse and Dessert for testing via Swagger. - Adding JsonIgnore in superclass MenuItem to focus only in subclasses via Swagger. - Adding JsonTypeInfo and JsonSubTypes to decide which subclass is been generated via Swagger (Type="dessert" or Type="mainCourse" needed) --- .../restaurantManager/model/Dessert.java | 4 ++ .../restaurantManager/model/MainCourse.java | 4 ++ .../restaurantManager/model/MenuItem.java | 17 +++++++ .../utilities/DataLoader.java | 44 +++++++++++++------ src/main/resources/application.properties | 4 +- 5 files changed, 58 insertions(+), 15 deletions(-) diff --git a/src/main/java/dev/example/restaurantManager/model/Dessert.java b/src/main/java/dev/example/restaurantManager/model/Dessert.java index 9f26c58..fbec778 100644 --- a/src/main/java/dev/example/restaurantManager/model/Dessert.java +++ b/src/main/java/dev/example/restaurantManager/model/Dessert.java @@ -11,6 +11,10 @@ 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); diff --git a/src/main/java/dev/example/restaurantManager/model/MainCourse.java b/src/main/java/dev/example/restaurantManager/model/MainCourse.java index cdb899c..0792dc9 100644 --- a/src/main/java/dev/example/restaurantManager/model/MainCourse.java +++ b/src/main/java/dev/example/restaurantManager/model/MainCourse.java @@ -13,6 +13,10 @@ 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); diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java index 5416f18..c99939d 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -1,5 +1,8 @@ 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; @@ -13,6 +16,18 @@ @NoArgsConstructor @Entity @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 @@ -23,6 +38,8 @@ public abstract class MenuItem implements IMenuItem { 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; diff --git a/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java b/src/main/java/dev/example/restaurantManager/utilities/DataLoader.java index 099d834..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,19 +94,35 @@ 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( -// UUID.randomUUID().toString(), -// faker.food().dish(), -// faker.food().ingredient() + " " + faker.food().ingredient() , -// faker.number().randomDouble(2, 5, 30) -// ); -// menuItemRepository.save(menuItem); -// } -// } + private void createMenuDessert() { + for (int i = 0; i < 10; i++) { + MenuItem menuDessert = new Dessert( + UUID.randomUUID().toString(), + faker.food().dish(), + 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(menuMainCourse); + } + } // we are going to create 15 menus // and assign 5 to 10 menu items to each menu diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 56fa3b7..0329d93 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -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