From b2193f1aa959d364c4c2306c6067a25cc6fc011c Mon Sep 17 00:00:00 2001 From: Emma Alonso Date: Tue, 22 Oct 2024 13:54:24 +0200 Subject: [PATCH 1/8] create entities and annotations --- .../restaurantManager/model/CourseType.java | 7 +++ .../restaurantManager/model/MenuItem.java | 58 +++++++++++++++++++ .../model/MenuRestaurant.java | 14 +++-- 3 files changed, 75 insertions(+), 4 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/model/CourseType.java create mode 100644 src/main/java/dev/example/restaurantManager/model/MenuItem.java diff --git a/src/main/java/dev/example/restaurantManager/model/CourseType.java b/src/main/java/dev/example/restaurantManager/model/CourseType.java new file mode 100644 index 0000000..4f21359 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/CourseType.java @@ -0,0 +1,7 @@ +package dev.example.restaurantManager.model; + +public enum CourseType { + STARTER, + MAIN, + DESSERT +} diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java new file mode 100644 index 0000000..c9d077c --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -0,0 +1,58 @@ +package dev.example.restaurantManager.model; + +import jakarta.persistence.*; +import org.hibernate.annotations.GenericGenerator; + +import java.awt.*; +import java.util.ArrayList; +import java.util.List; +import java.util.HashSet; +import java.util.Set; +import java.util.UUID; + +@Entity +public class MenuItem { + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Long id; + + private String name; + private String description; + private boolean isSpicy; + private boolean hasGluten; + private boolean isAvailable; + + @Enumerated(EnumType.STRING) + private CourseType courseType; + + @ManyToMany(mappedBy = "menuItems", fetch = FetchType.LAZY) + private List menus = new ArrayList<>(); + + // Constructor + public MenuItem(String name, String description, boolean isSpicy, boolean hasGluten, boolean isAvailable, CourseType courseType) { + this.name = name; + this.description = description; + this.isSpicy = isSpicy; + this.hasGluten = hasGluten; + this.isAvailable = isAvailable; + this.courseType = courseType; + } + + + // Constructors, getters, and setters + @Override + public String toString() { + return "MenuItem{" + + "id=" + id + + ", name='" + name + '\'' + + ", description='" + description + '\'' + + ", isSpicy=" + isSpicy + + ", hasGluten=" + hasGluten + + ", isAvailable=" + isAvailable + + ", courseType=" + courseType + + ", menus=" + menus + + '}'; + } + +} + diff --git a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java index 1d2d819..f9bca6f 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java @@ -1,9 +1,6 @@ package dev.example.restaurantManager.model; -import jakarta.persistence.Entity; -import jakarta.persistence.FetchType; -import jakarta.persistence.Id; -import jakarta.persistence.ManyToMany; +import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; @@ -27,6 +24,14 @@ public class MenuRestaurant { @ManyToMany(mappedBy = "menus", fetch = FetchType.LAZY) private List orders = new ArrayList<>(); + @ManyToMany(fetch = FetchType.LAZY) + @JoinTable( + name = "menu_restaurant_menu_item", + joinColumns = @JoinColumn(name = "menu_restaurant_id"), + inverseJoinColumns = @JoinColumn(name = "menu_item_id") + ) + private List menuItems = new ArrayList<>(); + public MenuRestaurant(String id, String name, Double price, String content, boolean active, boolean water) { this.id = id; this.name = name; @@ -48,6 +53,7 @@ public String toString() { ", water=" + water + ", ordersCount=" + (orders != null ? orders.size() : 0) + ", orders=" + orders + + ", menu items=" + menuItems + '}'; } From 83e31d92053b74cca689f4ce457d3659ee91fa14 Mon Sep 17 00:00:00 2001 From: Emma Alonso Date: Wed, 23 Oct 2024 13:55:56 +0200 Subject: [PATCH 2/8] Create MenuItemRepository, refactor MenuRestaurant and MenuItem. Create RelationshipsMenuToMenuItemsTest --- .../restaurantManager/model/MenuItem.java | 4 +- .../model/MenuRestaurant.java | 23 +++- .../repository/MenuItemRepository.java | 7 + .../RelationshipsMenuToMenuItemsTest.java | 126 ++++++++++++++++++ 4 files changed, 152 insertions(+), 8 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java create mode 100644 src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java index c9d077c..a186fbb 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -1,6 +1,8 @@ package dev.example.restaurantManager.model; import jakarta.persistence.*; +import lombok.Data; +import lombok.Getter; import org.hibernate.annotations.GenericGenerator; import java.awt.*; @@ -11,6 +13,7 @@ import java.util.UUID; @Entity +@Data public class MenuItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -53,6 +56,5 @@ public String toString() { ", menus=" + menus + '}'; } - } diff --git a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java index f9bca6f..ef16d73 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java @@ -3,15 +3,17 @@ import jakarta.persistence.*; import lombok.AllArgsConstructor; import lombok.Data; +import lombok.Getter; import lombok.NoArgsConstructor; + import java.util.ArrayList; import java.util.List; @Data -@AllArgsConstructor @NoArgsConstructor +@AllArgsConstructor @Entity -public class MenuRestaurant { +public class MenuRestaurant { @Id private String id; @@ -24,6 +26,7 @@ public class MenuRestaurant { @ManyToMany(mappedBy = "menus", fetch = FetchType.LAZY) private List orders = new ArrayList<>(); + @Getter @ManyToMany(fetch = FetchType.LAZY) @JoinTable( name = "menu_restaurant_menu_item", @@ -39,9 +42,16 @@ public MenuRestaurant(String id, String name, Double price, String content, bool this.content = content; this.active = active; this.water = water; + this.orders = new ArrayList<>(); + this.menuItems = new ArrayList<>(); } - //We might want to exclude 'orders' from toString() to avoid circular references + public void addMenuItem(MenuItem menuItem) { + this.menuItems.add(menuItem); + menuItem.getMenus().add(this); + } + + // We might want to exclude 'orders' from toString() to avoid circular references @Override public String toString() { return "MenuRestaurant{" + @@ -52,10 +62,9 @@ public String toString() { ", active=" + active + ", water=" + water + ", ordersCount=" + (orders != null ? orders.size() : 0) + - ", orders=" + orders + - ", menu items=" + menuItems + + ", orders=" + orders + '\'' + + ", menuItemsCount=" + menuItems.size() + + ", menuItems=" + menuItems + '}'; } - } - diff --git a/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java b/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java new file mode 100644 index 0000000..e683303 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/repository/MenuItemRepository.java @@ -0,0 +1,7 @@ +package dev.example.restaurantManager.repository; + +import dev.example.restaurantManager.model.MenuItem; +import org.springframework.data.jpa.repository.JpaRepository; + +public interface MenuItemRepository extends JpaRepository { +} diff --git a/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java b/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java new file mode 100644 index 0000000..1975091 --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java @@ -0,0 +1,126 @@ +package dev.example.restaurantManager; + +import dev.example.restaurantManager.model.*; +import dev.example.restaurantManager.repository.*; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; +import java.util.ArrayList; +import java.util.Arrays; + +import static org.assertj.core.api.Assertions.assertThat; + +@DataJpaTest +public class RelationshipsMenuToMenuItemsTest { + + @Autowired + private MenuRestaurantRepository menuRestaurantRepository; + @Autowired + private MenuItemRepository menuItemRepository; + + @Test + public void TestCreateMenu() { + // Create sample menus + MenuRestaurant menuRestaurant1 = new MenuRestaurant("M01", "Burger Menu", 10.99, "Burger, fries, and drink", true, true); + MenuRestaurant menuRestaurant2 = new MenuRestaurant("M02", "Pizza Menu", 12.99, "Pizza and salad", true, false); + MenuRestaurant menuRestaurant3 = new MenuRestaurant("M03", "Salad Menu", 8.99, "Mixed salad and dressing", true, true); + // Save sample menus + menuRestaurantRepository.save(menuRestaurant1); + menuRestaurantRepository.save(menuRestaurant2); + menuRestaurantRepository.save(menuRestaurant3); + // Create a list of all menus + ArrayList menus = new ArrayList<>(); + menus.addAll(Arrays.asList(menuRestaurant1, menuRestaurant2, menuRestaurant3)); + + // Print the number of menus + System.out.println("Menus"); + System.out.println("Total number of menus: " + menus.size() + " menus."); + System.out.println("--------------------"); + // Print all menus + for (MenuRestaurant menu : menus) { + System.out.println("Menu ID: " + menu.getId()); + System.out.println(menu); + System.out.println("--------------------"); + } + } + + @Test + public void TestCreateMenuItems() { + //Create menu items + MenuItem item1 = new MenuItem("Burger", "A tasty beef burger", false, true, true, CourseType.MAIN); + MenuItem item2 = new MenuItem("Fries", "Dulce de leche ice cream", false, true, true, CourseType.DESSERT); + MenuItem item3 = new MenuItem("Pizza", "Delicious margherita pizza", false, true, true, CourseType.MAIN); + MenuItem item4 = new MenuItem("Salad", "Fresh mixed salad", false, false, true, CourseType.STARTER); + //Save menu items + menuItemRepository.save(item1); + menuItemRepository.save(item2); + menuItemRepository.save(item3); + menuItemRepository.save(item4); + + // Create a list of all menu items + ArrayList items = new ArrayList<>(); + items.addAll(Arrays.asList(item1, item2, item3, item4)); + + // Print the number of menu items + System.out.println("Menu items"); + System.out.println("Total number of menu items: " + items.size() + " items."); + System.out.println("--------------------"); + // Print all menu items + for (MenuItem item : items) { + System.out.println("Item ID: " + item.getId()); + System.out.println(item); + System.out.println("--------------------"); + } + } + + @Test + public void TestAssignMenuItemToMenu() { + + //Create menu items + MenuItem item1 = new MenuItem("Burger", "A tasty beef burger", false, true, true, CourseType.MAIN); + MenuItem item2 = new MenuItem("Fries", "Dulce de leche ice cream", false, true, true, CourseType.DESSERT); + MenuItem item3 = new MenuItem("Pizza", "Delicious margherita pizza", false, true, true, CourseType.MAIN); + MenuItem item4 = new MenuItem("Salad", "Fresh mixed salad", false, false, true, CourseType.STARTER); + //Save menu items + menuItemRepository.save(item1); + menuItemRepository.save(item2); + menuItemRepository.save(item3); + menuItemRepository.save(item4); + // Create sample menus + MenuRestaurant menuRestaurant1 = new MenuRestaurant("M01", "Burger Menu", 10.99, "Burger, fries, and drink", true, true); + MenuRestaurant menuRestaurant2 = new MenuRestaurant("M02", "Pizza Menu", 12.99, "Pizza and salad", true, false); + MenuRestaurant menuRestaurant3 = new MenuRestaurant("M03", "Salad Menu", 8.99, "Mixed salad and dressing", true, true); + // Save sample menus + menuRestaurantRepository.save(menuRestaurant1); + menuRestaurantRepository.save(menuRestaurant2); + menuRestaurantRepository.save(menuRestaurant3); + + //Add items + menuRestaurant1.addMenuItem(item1); + menuRestaurant1.addMenuItem(item2); + menuRestaurant1.addMenuItem(item3); + menuRestaurant1.addMenuItem(item4); + + menuRestaurantRepository.saveAll(Arrays.asList(menuRestaurant1, menuRestaurant2, menuRestaurant3)); + + // Create a list of all menus + ArrayList menus = new ArrayList<>(); + menus.addAll(Arrays.asList(menuRestaurant1, menuRestaurant2, menuRestaurant3)); + + // Print the number of menus + System.out.println("Menus"); + System.out.println("Total number of menus: " + menus.size() + " menus."); + System.out.println("--------------------"); + // Print all menus + for (MenuRestaurant menu : menus) { + System.out.println("Menu ID: " + menu.getId()); + System.out.println(menu); + System.out.println("--------------------"); + } + } + + // Create and save menu items to menu + + + //check if the item is in the menu +} \ No newline at end of file From 00c7cfde30e1bfd6b7ab8470b53ee22d1ed3f7f7 Mon Sep 17 00:00:00 2001 From: emsmccoy <65463392+emsmccoy@users.noreply.github.com> Date: Wed, 23 Oct 2024 19:12:55 +0200 Subject: [PATCH 3/8] Pass TestAssignMenuItemToMenu in RelationshipsMenuToMenuItemsTest --- .../restaurantManager/model/MenuItem.java | 2 +- .../model/MenuRestaurant.java | 4 ++-- .../RelationshipsMenuToMenuItemsTest.java | 20 +++++++++++++++++-- 3 files changed, 21 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java index a186fbb..1e0aa79 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -53,7 +53,7 @@ public String toString() { ", hasGluten=" + hasGluten + ", isAvailable=" + isAvailable + ", courseType=" + courseType + - ", menus=" + menus + + // ", menus=" + menus + '}'; } } diff --git a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java index ef16d73..ee358e2 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java @@ -63,8 +63,8 @@ public String toString() { ", water=" + water + ", ordersCount=" + (orders != null ? orders.size() : 0) + ", orders=" + orders + '\'' + - ", menuItemsCount=" + menuItems.size() + - ", menuItems=" + menuItems + + ", menuItemsCount=" + + (menuItems != null ? menuItems.size() : 0) + + // ", menuItems=" + menuItems + '}'; } } diff --git a/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java b/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java index 1975091..157d935 100644 --- a/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java +++ b/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java @@ -7,6 +7,7 @@ import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest; import java.util.ArrayList; import java.util.Arrays; +import java.util.Optional; import static org.assertj.core.api.Assertions.assertThat; @@ -98,8 +99,8 @@ public void TestAssignMenuItemToMenu() { //Add items menuRestaurant1.addMenuItem(item1); menuRestaurant1.addMenuItem(item2); - menuRestaurant1.addMenuItem(item3); - menuRestaurant1.addMenuItem(item4); + menuRestaurant2.addMenuItem(item3); + menuRestaurant3.addMenuItem(item4); menuRestaurantRepository.saveAll(Arrays.asList(menuRestaurant1, menuRestaurant2, menuRestaurant3)); @@ -117,6 +118,21 @@ public void TestAssignMenuItemToMenu() { System.out.println(menu); System.out.println("--------------------"); } + + //when + Optional menuFound = menuRestaurantRepository.findById("M01"); + System.out.println("--------------------"); + System.out.println("Menu ID: " + menuFound.get().getId()); + + Optional menuItemFound = menuItemRepository.findById(String.valueOf(item1.getId())); + System.out.println("--------------------"); + System.out.println("Menu Item ID: " + menuItemFound.get().getId()); + + // then + assertThat(menuFound).isPresent(); + assertThat(menuFound.get().getMenuItems().get(0).getName().equals(menuRestaurant1.getName())); + assertThat(menuFound.get().getMenuItems().get(1).getName().equals(menuRestaurant1.getName())); + } // Create and save menu items to menu From 3acd71a749ddeae125ecb86a085829dabe5e95af Mon Sep 17 00:00:00 2001 From: emsmccoy <65463392+emsmccoy@users.noreply.github.com> Date: Wed, 23 Oct 2024 19:34:16 +0200 Subject: [PATCH 4/8] Improve TestAssignMenuItemToMenu in RelationshipsMenuToMenuItemsTest --- .../RelationshipsMenuToMenuItemsTest.java | 17 +++++++++++++---- .../RelationshipsOrderRestaurantTest.java | 12 ++++++------ 2 files changed, 19 insertions(+), 10 deletions(-) diff --git a/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java b/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java index 157d935..000e7e8 100644 --- a/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java +++ b/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java @@ -124,14 +124,23 @@ public void TestAssignMenuItemToMenu() { System.out.println("--------------------"); System.out.println("Menu ID: " + menuFound.get().getId()); - Optional menuItemFound = menuItemRepository.findById(String.valueOf(item1.getId())); + Optional menuItemOneFound = menuItemRepository.findById(String.valueOf(item1.getId())); System.out.println("--------------------"); - System.out.println("Menu Item ID: " + menuItemFound.get().getId()); + System.out.println("Menu Item ID: " + menuItemOneFound.get().getId()); + System.out.println("Menu Item Name: " + menuItemOneFound.get().getName()); + + + Optional menuItemTwoFound = menuItemRepository.findById(String.valueOf(item2.getId())); + System.out.println("--------------------"); + System.out.println("Menu Item ID: " + menuItemTwoFound.get().getId()); + System.out.println("Menu Item Name: " + menuItemTwoFound.get().getName()); + // then assertThat(menuFound).isPresent(); - assertThat(menuFound.get().getMenuItems().get(0).getName().equals(menuRestaurant1.getName())); - assertThat(menuFound.get().getMenuItems().get(1).getName().equals(menuRestaurant1.getName())); + assertThat(menuFound.get().getMenuItems().size()).isEqualTo(2); + assertThat(menuFound.get().getMenuItems().get(0).getName()).isEqualTo(item1.getName()); + assertThat(menuFound.get().getMenuItems().get(1).getName()).isEqualTo(item2.getName()); } diff --git a/src/test/java/dev/example/restaurantManager/RelationshipsOrderRestaurantTest.java b/src/test/java/dev/example/restaurantManager/RelationshipsOrderRestaurantTest.java index a3c8f84..f9d9d59 100644 --- a/src/test/java/dev/example/restaurantManager/RelationshipsOrderRestaurantTest.java +++ b/src/test/java/dev/example/restaurantManager/RelationshipsOrderRestaurantTest.java @@ -29,9 +29,9 @@ public class RelationshipsOrderRestaurantTest { @Test public void TestCreateOrder() { // Create sample menus - MenuRestaurant menuRestaurant1 = new MenuRestaurant("M01", "Burger Menu", 10.99, "Burger, fries, and drink", true, true, null); - MenuRestaurant menuRestaurant2 = new MenuRestaurant("M02","Pizza Menu", 12.99, "Pizza and salad", true, false, null); - MenuRestaurant menuRestaurant3 = new MenuRestaurant("M03","Salad Menu", 8.99, "Mixed salad and dressing", true, true, null); + MenuRestaurant menuRestaurant1 = new MenuRestaurant("M01", "Burger Menu", 10.99, "Burger, fries, and drink", true, true); + MenuRestaurant menuRestaurant2 = new MenuRestaurant("M02","Pizza Menu", 12.99, "Pizza and salad", true, false); + MenuRestaurant menuRestaurant3 = new MenuRestaurant("M03","Salad Menu", 8.99, "Mixed salad and dressing", true, true); // Save sample menus menuRestaurantRepository.save(menuRestaurant1); menuRestaurantRepository.save(menuRestaurant2); @@ -115,9 +115,9 @@ public void TestCreateOrder() { @Test public void TestCreateOrderMenu () { - MenuRestaurant menuRestaurant1 = new MenuRestaurant("M01", "Burger Menu", 10.99, "Burger, fries, and drink", true, true, null); - MenuRestaurant menuRestaurant2 = new MenuRestaurant("M02","Pizza Menu", 12.99, "Pizza and salad", true, false, null); - MenuRestaurant menuRestaurant3 = new MenuRestaurant("M03","Salad Menu", 8.99, "Mixed salad and dressing", true, true, null); + MenuRestaurant menuRestaurant1 = new MenuRestaurant("M01", "Burger Menu", 10.99, "Burger, fries, and drink", true, true); + MenuRestaurant menuRestaurant2 = new MenuRestaurant("M02","Pizza Menu", 12.99, "Pizza and salad", true, false); + MenuRestaurant menuRestaurant3 = new MenuRestaurant("M03","Salad Menu", 8.99, "Mixed salad and dressing", true, true); // Save sample menus menuRestaurantRepository.save(menuRestaurant1); menuRestaurantRepository.save(menuRestaurant2); From 412052d34d3a7b411fbb94334b896a28d07ec9e7 Mon Sep 17 00:00:00 2001 From: emsmccoy <65463392+emsmccoy@users.noreply.github.com> Date: Wed, 23 Oct 2024 19:50:48 +0200 Subject: [PATCH 5/8] Created service layer for MenuItem and MenuRestaurant --- .../service/MenuItemService.java | 18 +++++ .../service/MenuItemServiceImpl.java | 43 ++++++++++++ .../service/MenuRestaurantService.java | 23 +++++++ .../service/MenuRestaurantServiceImpl.java | 65 +++++++++++++++++++ .../RelationshipsMenuToMenuItemsTest.java | 3 - 5 files changed, 149 insertions(+), 3 deletions(-) create mode 100644 src/main/java/dev/example/restaurantManager/service/MenuItemService.java create mode 100644 src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java create mode 100644 src/main/java/dev/example/restaurantManager/service/MenuRestaurantService.java create mode 100644 src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java diff --git a/src/main/java/dev/example/restaurantManager/service/MenuItemService.java b/src/main/java/dev/example/restaurantManager/service/MenuItemService.java new file mode 100644 index 0000000..a31eab9 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/MenuItemService.java @@ -0,0 +1,18 @@ +package dev.example.restaurantManager.service; + +import dev.example.restaurantManager.model.MenuItem; + +import java.util.List; +import java.util.Optional; + +public interface MenuItemService { + MenuItem createMenuItem(MenuItem menuItem); + + Optional getMenuItemById(String id); + + List getAllMenuItems(); + + MenuItem updateMenuItem(MenuItem menuItem); + + void deleteMenuItem(String id); +} diff --git a/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java new file mode 100644 index 0000000..d8822d9 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/MenuItemServiceImpl.java @@ -0,0 +1,43 @@ +package dev.example.restaurantManager.service.impl; + +import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.repository.MenuItemRepository; +import dev.example.restaurantManager.service.MenuItemService; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class MenuItemServiceImpl implements MenuItemService { + + @Autowired + private MenuItemRepository menuItemRepository; + + @Override + public MenuItem createMenuItem(MenuItem menuItem) { + return menuItemRepository.save(menuItem); + } + + @Override + public Optional getMenuItemById(String id) { + return menuItemRepository.findById(id); + } + + @Override + public List getAllMenuItems() { + return menuItemRepository.findAll(); + } + + @Override + public MenuItem updateMenuItem(MenuItem menuItem) { + return menuItemRepository.save(menuItem); + } + + @Override + public void deleteMenuItem(String id) { + menuItemRepository.deleteById(id); + } +} diff --git a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantService.java b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantService.java new file mode 100644 index 0000000..5f098d0 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantService.java @@ -0,0 +1,23 @@ +package dev.example.restaurantManager.service; + +import dev.example.restaurantManager.model.MenuRestaurant; +import dev.example.restaurantManager.model.MenuItem; + +import java.util.List; +import java.util.Optional; + +public interface MenuRestaurantService { + MenuRestaurant createMenu(MenuRestaurant menuRestaurant); + + Optional getMenuById(String id); + + List getAllMenus(); + + MenuRestaurant updateMenu(MenuRestaurant menuRestaurant); + + void deleteMenu(String id); + + void addMenuItemToMenu(String menuId, MenuItem menuItem); + + List getMenuItems(String menuId); +} diff --git a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java new file mode 100644 index 0000000..d8d5857 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantServiceImpl.java @@ -0,0 +1,65 @@ +package dev.example.restaurantManager.service; + +import dev.example.restaurantManager.model.MenuRestaurant; +import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.repository.MenuRestaurantRepository; +import dev.example.restaurantManager.repository.MenuItemRepository; +import dev.example.restaurantManager.service.MenuRestaurantService; + +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; + +import java.util.List; +import java.util.Optional; + +@Service +public class MenuRestaurantServiceImpl implements MenuRestaurantService { + + @Autowired + private MenuRestaurantRepository menuRestaurantRepository; + + @Autowired + private MenuItemRepository menuItemRepository; + + @Override + public MenuRestaurant createMenu(MenuRestaurant menuRestaurant) { + return menuRestaurantRepository.save(menuRestaurant); + } + + @Override + public Optional getMenuById(String id) { + return menuRestaurantRepository.findById(id); + } + + @Override + public List getAllMenus() { + return menuRestaurantRepository.findAll(); + } + + @Override + public MenuRestaurant updateMenu(MenuRestaurant menuRestaurant) { + return menuRestaurantRepository.save(menuRestaurant); + } + + @Override + public void deleteMenu(String id) { + menuRestaurantRepository.deleteById(id); + } + + @Override + public void addMenuItemToMenu(String menuId, MenuItem menuItem) { + Optional menuRestaurantOpt = menuRestaurantRepository.findById(menuId); + if (menuRestaurantOpt.isPresent()) { + MenuRestaurant menuRestaurant = menuRestaurantOpt.get(); + menuRestaurant.addMenuItem(menuItem); + menuRestaurantRepository.save(menuRestaurant); + } + } + + @Override + public List getMenuItems(String menuId) { + Optional menuRestaurantOpt = menuRestaurantRepository.findById(menuId); + return menuRestaurantOpt.map(MenuRestaurant::getMenuItems).orElse(null); + } +} + diff --git a/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java b/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java index 000e7e8..a7cf9cb 100644 --- a/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java +++ b/src/test/java/dev/example/restaurantManager/RelationshipsMenuToMenuItemsTest.java @@ -144,8 +144,5 @@ public void TestAssignMenuItemToMenu() { } - // Create and save menu items to menu - - //check if the item is in the menu } \ No newline at end of file From d004f43e6875d697376cfa58b096ed1492c1775f Mon Sep 17 00:00:00 2001 From: Emma Alonso Date: Fri, 25 Oct 2024 13:52:06 +0200 Subject: [PATCH 6/8] Create MenuAndMenuItemServiceLayerTest --- .../MenuAndMenuItemServiceLayerTest.java | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceLayerTest.java diff --git a/src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceLayerTest.java b/src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceLayerTest.java new file mode 100644 index 0000000..4f01064 --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceLayerTest.java @@ -0,0 +1,37 @@ +package dev.example.restaurantManager; + +import dev.example.restaurantManager.model.CourseType; +import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.model.MenuRestaurant; +import dev.example.restaurantManager.service.MenuItemService; +import dev.example.restaurantManager.service.MenuRestaurantService; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; + +import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; + +@SpringBootTest +public class MenuAndMenuItemServiceLayerTest { + + @Autowired + private MenuRestaurantService menuRestaurantService; + @Autowired + private MenuItemService menuItemService; + + @Test + public void testAddMenuItemToMenu() { + MenuRestaurant menu = new MenuRestaurant("M04", "Vegan Menu", 15.99, "Salad and juice", true, true); + MenuItem item = new MenuItem("Juice", "Freshly squeezed juice", false, true, true, CourseType.STARTER); + + menuRestaurantService.createMenu(menu); + menuItemService.createMenuItem(item); + menuRestaurantService.addMenuItemToMenu("M04", item); + + List items = menuRestaurantService.getMenuItems("M04"); + assertThat(items).isNotEmpty(); + } + +} From ad5941244937e4449d773d3f10350342703de9ce Mon Sep 17 00:00:00 2001 From: emsmccoy <65463392+emsmccoy@users.noreply.github.com> Date: Sun, 27 Oct 2024 19:39:19 +0100 Subject: [PATCH 7/8] Develop test for MenuService and MenuItemService. Include equals() method in MenuItem and MenuRestaurant to avoid assertion error --- .../restaurantManager/model/MenuItem.java | 28 +++++- .../model/MenuRestaurant.java | 19 +++- .../service/MenuRestaurantService.java | 1 + .../MenuAndMenuItemServiceLayerTest.java | 37 ------- .../MenuAndMenuItemServiceTest.java | 99 +++++++++++++++++++ 5 files changed, 142 insertions(+), 42 deletions(-) delete mode 100644 src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceLayerTest.java create mode 100644 src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceTest.java diff --git a/src/main/java/dev/example/restaurantManager/model/MenuItem.java b/src/main/java/dev/example/restaurantManager/model/MenuItem.java index 1e0aa79..572519a 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuItem.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuItem.java @@ -1,19 +1,20 @@ package dev.example.restaurantManager.model; import jakarta.persistence.*; +import lombok.AllArgsConstructor; import lombok.Data; import lombok.Getter; +import lombok.NoArgsConstructor; import org.hibernate.annotations.GenericGenerator; import java.awt.*; -import java.util.ArrayList; +import java.util.*; import java.util.List; -import java.util.HashSet; -import java.util.Set; -import java.util.UUID; @Entity @Data +@NoArgsConstructor +@AllArgsConstructor public class MenuItem { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @@ -56,5 +57,24 @@ public String toString() { // ", menus=" + menus + '}'; } + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MenuItem menuItem = (MenuItem) o; + return isSpicy == menuItem.isSpicy && + hasGluten == menuItem.hasGluten && + isAvailable == menuItem.isAvailable && + Objects.equals(id, menuItem.id) && + Objects.equals(name, menuItem.name) && + Objects.equals(description, menuItem.description) && + courseType == menuItem.courseType; + } + + @Override + public int hashCode() { + return Objects.hash(id, name, description, isSpicy, hasGluten, isAvailable, courseType); + } + } diff --git a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java index ee358e2..a122ea1 100644 --- a/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java +++ b/src/main/java/dev/example/restaurantManager/model/MenuRestaurant.java @@ -8,6 +8,7 @@ import java.util.ArrayList; import java.util.List; +import java.util.Objects; @Data @NoArgsConstructor @@ -27,7 +28,7 @@ public class MenuRestaurant { private List orders = new ArrayList<>(); @Getter - @ManyToMany(fetch = FetchType.LAZY) + @ManyToMany(fetch = FetchType.EAGER) @JoinTable( name = "menu_restaurant_menu_item", joinColumns = @JoinColumn(name = "menu_restaurant_id"), @@ -51,6 +52,21 @@ public void addMenuItem(MenuItem menuItem) { menuItem.getMenus().add(this); } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + MenuRestaurant that = (MenuRestaurant) o; + return Objects.equals(id, that.id) && + Objects.equals(name, that.name); + } + + @Override + public int hashCode() { + return Objects.hash(id, name); + } + // We might want to exclude 'orders' from toString() to avoid circular references @Override public String toString() { @@ -67,4 +83,5 @@ public String toString() { // ", menuItems=" + menuItems + '}'; } + } diff --git a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantService.java b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantService.java index 5f098d0..7ece340 100644 --- a/src/main/java/dev/example/restaurantManager/service/MenuRestaurantService.java +++ b/src/main/java/dev/example/restaurantManager/service/MenuRestaurantService.java @@ -20,4 +20,5 @@ public interface MenuRestaurantService { void addMenuItemToMenu(String menuId, MenuItem menuItem); List getMenuItems(String menuId); + } diff --git a/src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceLayerTest.java b/src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceLayerTest.java deleted file mode 100644 index 4f01064..0000000 --- a/src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceLayerTest.java +++ /dev/null @@ -1,37 +0,0 @@ -package dev.example.restaurantManager; - -import dev.example.restaurantManager.model.CourseType; -import dev.example.restaurantManager.model.MenuItem; -import dev.example.restaurantManager.model.MenuRestaurant; -import dev.example.restaurantManager.service.MenuItemService; -import dev.example.restaurantManager.service.MenuRestaurantService; -import org.junit.jupiter.api.Test; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.boot.test.context.SpringBootTest; - -import java.util.List; - -import static org.assertj.core.api.AssertionsForInterfaceTypes.assertThat; - -@SpringBootTest -public class MenuAndMenuItemServiceLayerTest { - - @Autowired - private MenuRestaurantService menuRestaurantService; - @Autowired - private MenuItemService menuItemService; - - @Test - public void testAddMenuItemToMenu() { - MenuRestaurant menu = new MenuRestaurant("M04", "Vegan Menu", 15.99, "Salad and juice", true, true); - MenuItem item = new MenuItem("Juice", "Freshly squeezed juice", false, true, true, CourseType.STARTER); - - menuRestaurantService.createMenu(menu); - menuItemService.createMenuItem(item); - menuRestaurantService.addMenuItemToMenu("M04", item); - - List items = menuRestaurantService.getMenuItems("M04"); - assertThat(items).isNotEmpty(); - } - -} diff --git a/src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceTest.java b/src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceTest.java new file mode 100644 index 0000000..b27f9be --- /dev/null +++ b/src/test/java/dev/example/restaurantManager/MenuAndMenuItemServiceTest.java @@ -0,0 +1,99 @@ +package dev.example.restaurantManager; + +import dev.example.restaurantManager.model.CourseType; +import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.model.MenuRestaurant; +import dev.example.restaurantManager.repository.MenuItemRepository; +import dev.example.restaurantManager.repository.MenuRestaurantRepository; +import dev.example.restaurantManager.service.MenuItemService; +import dev.example.restaurantManager.service.MenuRestaurantService; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; + +import java.util.List; +import java.util.Optional; + +import static org.assertj.core.api.Assertions.assertThat; + +@SpringBootTest +public class MenuAndMenuItemServiceTest { + + @Autowired + private MenuRestaurantService menuRestaurantService; + + @Autowired + private MenuItemService menuItemService; + + @Autowired + private MenuRestaurantRepository menuRestaurantRepository; + + @Autowired + private MenuItemRepository menuItemRepository; + + private MenuRestaurant testMenu; + private MenuRestaurant testMenu2; + private MenuItem testItem; + + @BeforeEach + public void setup() { + testMenu = new MenuRestaurant("1", "Lunch Menu", 19.99, "Main course and dessert", true, false); + testMenu2 = new MenuRestaurant("2", "Dinner Menu", 19.99, "Main course and dessert", true, false); + testItem = new MenuItem("Burger", "Beef burger with cheese", false, true, true, CourseType.MAIN); + } + + @Test + public void createMenuRestaurantTest() { + MenuRestaurant createdMenu = menuRestaurantService.createMenu(testMenu); + + assertThat(createdMenu).isNotNull(); + assertThat(createdMenu.getId()).isNotNull(); + assertThat(createdMenu.getName()).isEqualTo(testMenu.getName()); + } + + @Test + public void createMenuItemTest() { + MenuItem createdItem = menuItemService.createMenuItem(testItem); + + assertThat(createdItem).isNotNull(); + assertThat(createdItem.getId()).isNotNull(); + assertThat(createdItem.getName()).isEqualTo(testItem.getName()); + } + + @Test + public void getAllMenusTest() { + menuRestaurantService.createMenu(testMenu); + menuRestaurantService.createMenu(testMenu2); + + List allMenus = menuRestaurantService.getAllMenus(); + assertThat(allMenus).isNotEmpty(); + assertThat(allMenus).extracting(MenuRestaurant::getName).contains("Lunch Menu", "Dinner Menu"); + } + + @Test + public void addMenuItemToMenuTest() { + MenuRestaurant savedMenu = menuRestaurantService.createMenu(testMenu); + MenuItem savedItem = menuItemService.createMenuItem(testItem); + + menuRestaurantService.addMenuItemToMenu(savedMenu.getId(), savedItem); + + Optional updatedMenu = menuRestaurantService.getMenuById(savedMenu.getId()); + assertThat(updatedMenu.get().getMenuItems()).contains(savedItem); + } + + @Test + public void getMenuItemsFromMenuTest() { + MenuRestaurant savedMenu = menuRestaurantService.createMenu(testMenu); + MenuItem savedItem1 = menuItemService.createMenuItem(new MenuItem("Pasta", "Spaghetti with tomato sauce", false, false, true, CourseType.MAIN)); + MenuItem savedItem2 = menuItemService.createMenuItem(new MenuItem("Ice Cream", "Vanilla ice cream", false, false, true, CourseType.DESSERT)); + + menuRestaurantService.addMenuItemToMenu(savedMenu.getId(), savedItem1); + menuRestaurantService.addMenuItemToMenu(savedMenu.getId(), savedItem2); + + List menuItems = menuRestaurantService.getMenuItems(savedMenu.getId()); + assertThat(menuItems).contains(savedItem1, savedItem2); + } + + +} From 9be7f115d455465bcd5d6b125b5fdfe86db9ce1b Mon Sep 17 00:00:00 2001 From: emsmccoy <65463392+emsmccoy@users.noreply.github.com> Date: Sun, 27 Oct 2024 19:53:47 +0100 Subject: [PATCH 8/8] Create controllers for MenuItem and MenuRestaurant --- .../controller/MenuItemController.java | 51 +++++++++++++++ .../controller/MenuRestaurantController.java | 64 +++++++++++++++++++ 2 files changed, 115 insertions(+) create mode 100644 src/main/java/dev/example/restaurantManager/controller/MenuItemController.java create mode 100644 src/main/java/dev/example/restaurantManager/controller/MenuRestaurantController.java diff --git a/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java new file mode 100644 index 0000000..c0331a7 --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/controller/MenuItemController.java @@ -0,0 +1,51 @@ +package dev.example.restaurantManager.controller; + +import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.service.MenuItemService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/menu-items") +public class MenuItemController { + private final MenuItemService menuItemService; + + public MenuItemController(MenuItemService menuItemService) { + this.menuItemService = menuItemService; + } + + @PostMapping + public ResponseEntity createMenuItem(@RequestBody MenuItem menuItem) { + MenuItem created = menuItemService.createMenuItem(menuItem); + return new ResponseEntity<>(created, HttpStatus.CREATED); + } + + @GetMapping("/{id}") + public ResponseEntity getMenuItem(@PathVariable String id) { + return menuItemService.getMenuItemById(id) + .map(item -> new ResponseEntity<>(item, HttpStatus.OK)) + .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); + } + + @GetMapping + public ResponseEntity> getAllMenuItems() { + List items = menuItemService.getAllMenuItems(); + return new ResponseEntity<>(items, HttpStatus.OK); + } + + @PutMapping("/{id}") + public ResponseEntity updateMenuItem(@PathVariable String id, @RequestBody MenuItem menuItem) { + menuItem.setId(Long.valueOf(id)); + MenuItem updated = menuItemService.updateMenuItem(menuItem); + return new ResponseEntity<>(updated, HttpStatus.OK); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteMenuItem(@PathVariable String id) { + menuItemService.deleteMenuItem(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } +} diff --git a/src/main/java/dev/example/restaurantManager/controller/MenuRestaurantController.java b/src/main/java/dev/example/restaurantManager/controller/MenuRestaurantController.java new file mode 100644 index 0000000..5c8465a --- /dev/null +++ b/src/main/java/dev/example/restaurantManager/controller/MenuRestaurantController.java @@ -0,0 +1,64 @@ +package dev.example.restaurantManager.controller; + +import dev.example.restaurantManager.model.MenuRestaurant; +import dev.example.restaurantManager.model.MenuItem; +import dev.example.restaurantManager.service.MenuRestaurantService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.*; + +import java.util.List; + +@RestController +@RequestMapping("/api/menus-restaurant") +public class MenuRestaurantController { + private final MenuRestaurantService menuRestaurantService; + + public MenuRestaurantController(MenuRestaurantService menuRestaurantService) { + this.menuRestaurantService = menuRestaurantService; + } + + @PostMapping + public ResponseEntity createMenu(@RequestBody MenuRestaurant menuRestaurant) { + MenuRestaurant created = menuRestaurantService.createMenu(menuRestaurant); + return new ResponseEntity<>(created, HttpStatus.CREATED); + } + + @GetMapping("/{id}") + public ResponseEntity getMenu(@PathVariable String id) { + return menuRestaurantService.getMenuById(id) + .map(menu -> new ResponseEntity<>(menu, HttpStatus.OK)) + .orElse(new ResponseEntity<>(HttpStatus.NOT_FOUND)); + } + + @GetMapping + public ResponseEntity> getAllMenus() { + List menus = menuRestaurantService.getAllMenus(); + return new ResponseEntity<>(menus, HttpStatus.OK); + } + + @PutMapping("/{id}") + public ResponseEntity updateMenu(@PathVariable String id, @RequestBody MenuRestaurant menuRestaurant) { + menuRestaurant.setId(id); + MenuRestaurant updated = menuRestaurantService.updateMenu(menuRestaurant); + return new ResponseEntity<>(updated, HttpStatus.OK); + } + + @DeleteMapping("/{id}") + public ResponseEntity deleteMenu(@PathVariable String id) { + menuRestaurantService.deleteMenu(id); + return new ResponseEntity<>(HttpStatus.NO_CONTENT); + } + + @PostMapping("/{menuId}/items") + public ResponseEntity addMenuItemToMenu(@PathVariable String menuId, @RequestBody MenuItem menuItem) { + menuRestaurantService.addMenuItemToMenu(menuId, menuItem); + return new ResponseEntity<>(HttpStatus.CREATED); + } + + @GetMapping("/{menuId}/items") + public ResponseEntity> getMenuItems(@PathVariable String menuId) { + List items = menuRestaurantService.getMenuItems(menuId); + return new ResponseEntity<>(items, HttpStatus.OK); + } +}