Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -38,8 +42,8 @@ public ResponseEntity<MenuItem> getMenuItemById(@PathVariable String id) {
}

@PutMapping("/{id}")
public ResponseEntity<MenuItem> updateMenuItem(@PathVariable String id, @RequestBody MenuItem menuItemDetails) {
MenuItem updatedMenuItem = menuItemService.updateMenuItem(id, menuItemDetails);
public ResponseEntity<MenuItem> 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);
}
Expand Down
26 changes: 26 additions & 0 deletions src/main/java/dev/example/restaurantManager/model/Dessert.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package dev.example.restaurantManager.model;


public interface IMenuItem {
String getName();
double getPrice();
// Other common methods
}

28 changes: 28 additions & 0 deletions src/main/java/dev/example/restaurantManager/model/MainCourse.java
Original file line number Diff line number Diff line change
@@ -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;
}

}
27 changes: 24 additions & 3 deletions src/main/java/dev/example/restaurantManager/model/MenuItem.java
Original file line number Diff line number Diff line change
@@ -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<MenuRestaurant> 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;
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Dessert, String> {


}
Original file line number Diff line number Diff line change
@@ -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<MainCourse, String> {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package dev.example.restaurantManager.service;

import dev.example.restaurantManager.model.Dessert;
import java.util.List;

public interface DessertService {
List<Dessert> getAllDesserts();
Dessert createDessert(Dessert dessert);
Dessert getDessertById(String id);
Dessert updateDessert(String id, Dessert dessertDetails);
boolean deleteDessert(String id);
long countDesserts();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package dev.example.restaurantManager.service;

public class DessertServiceImpl {
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
package dev.example.restaurantManager.service;

import dev.example.restaurantManager.model.MainCourse;
import java.util.List;

public interface MainCourseService {
List<MainCourse> getAllMainCourses();
MainCourse createMainCourse(MainCourse mainCourse);
MainCourse getMainCourseById(String id);
MainCourse updateMainCourse(String id, MainCourse MainCourseDetails);
boolean deleteMainCourse(String id);
long countMainCourses();
}


Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
package dev.example.restaurantManager.service;

public class MainCourseServiceImpl {
}
Original file line number Diff line number Diff line change
@@ -1,13 +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 java.util.List;

public interface MenuItemService {
List<MenuItem> 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();
}
Original file line number Diff line number Diff line change
@@ -1,57 +1,96 @@
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<MenuItem> getAllMenuItems() {
return menuItemRepository.findAll();
List<MenuItem> 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;
}

@Override
public long countMenuItems() {
return menuItemRepository.count();
return dessertRepository.count() + mainCourseRepository.count();
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -44,7 +43,8 @@ public void loadAllData() {
// then create relationships between them
createCustomers();
createTables();
createMenuItems();
createMenuDessert();
createMenuMainCourse();

// create and assign menu items
createMenusAndAssignMenuItems();
Expand Down Expand Up @@ -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);
}
}

Expand Down
Loading