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
@@ -0,0 +1,80 @@
package dev.example.restaurantManager.controller;

import dev.example.restaurantManager.model.MenuItem;
import dev.example.restaurantManager.service.MenuItemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

@RequestMapping("/api/v1/menuItems")
@RestController
public class MenuItemController {

@Autowired
private MenuItemService menuItemService;

@GetMapping("/allMenuItems")
public ResponseEntity<List<MenuItem>> getAllMenuItems() {
List<MenuItem> menuItems = menuItemService.getAllMenuItems();
HttpHeaders headers = getCommonHeaders("Get all menu items");
return menuItems != null && !menuItems.isEmpty()
? new ResponseEntity<>(menuItems, headers, HttpStatus.OK)
: new ResponseEntity<>(headers, HttpStatus.NOT_FOUND);

}

@PostMapping("/addMenuItem")
public ResponseEntity<MenuItem> createMenuItem(@RequestBody MenuItem menuItem) {
MenuItem createdMenuItem = menuItemService.createMenuItems(menuItem);
HttpHeaders headers = getCommonHeaders("Create a new menu item");
return createdMenuItem != null
? new ResponseEntity<>(createdMenuItem, headers, HttpStatus.CREATED)
: new ResponseEntity<>(headers, HttpStatus.BAD_REQUEST);
}

@PutMapping("/updateMenuItem/{id}")
public ResponseEntity<MenuItem> updateMenuItem(@PathVariable String id, @RequestBody MenuItem menuItemDetails) {
MenuItem updatedMenuItem = menuItemService.updateMenuItems(id, menuItemDetails);
HttpHeaders headers = getCommonHeaders("Update menu item");
return updatedMenuItem != null
? new ResponseEntity<>(updatedMenuItem, headers, HttpStatus.OK)
: new ResponseEntity<>(headers, HttpStatus.NOT_FOUND);
}

@DeleteMapping("/deleteMenuItem/{id}")
public ResponseEntity<Void> deleteMenuItem(@PathVariable String id) {
boolean deleted = menuItemService.deleteMenuItems(id);
HttpHeaders headers = getCommonHeaders("Delete a menu item");
headers.add("deleted", String.valueOf(deleted));
return deleted
? new ResponseEntity<>(headers, HttpStatus.NO_CONTENT)
: new ResponseEntity<>(headers, HttpStatus.NOT_FOUND);
}

@GetMapping("/getMenuItem/{id}")
public ResponseEntity<MenuItem> getMenuItemById(@PathVariable String id) {
MenuItem menuItem = menuItemService.getMenuItemsById(id);
HttpHeaders headers = getCommonHeaders("Get a menu item by Id");
return menuItem != null
? new ResponseEntity<>(menuItem, headers, HttpStatus.OK)
: new ResponseEntity<>(headers, HttpStatus.NOT_FOUND);
}


private HttpHeaders getCommonHeaders(String description) {
HttpHeaders headers = new HttpHeaders();
headers.add("desc", description);
headers.add("content-type", "application/json");
headers.add("date", new Date().toString());
headers.add("server", "H2 Database");
headers.add("version", "1.0.0");
headers.add("menuItems-count", String.valueOf(menuItemService.countMenuItems()));
headers.add("object", "customers");
return headers;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,82 @@
package dev.example.restaurantManager.controller;

import dev.example.restaurantManager.model.MenuRestaurant;
import dev.example.restaurantManager.service.MenuRestaurantService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.Date;
import java.util.List;

@RequestMapping("/api/v1/menu")
@RestController
public class MenuRestaurantController {

@Autowired
private MenuRestaurantService menuRestaurantService;

@GetMapping("/allMenus")
public ResponseEntity<List<MenuRestaurant>> getAllMenus( ) {
List<MenuRestaurant> menuRestaurants = menuRestaurantService.getAllMenuRestaurants();
HttpHeaders headers = getCommonHeaders("Get all menus");

return menuRestaurants != null && !menuRestaurants.isEmpty()
? new ResponseEntity<>(menuRestaurants, headers, HttpStatus.OK)
: new ResponseEntity<>(headers, HttpStatus.NOT_FOUND);
}

@PostMapping("/add")
public ResponseEntity<MenuRestaurant> createMenu(@RequestBody MenuRestaurant menuRestaurant) {
MenuRestaurant createdMenu = menuRestaurantService.createMenuRestaurants(menuRestaurant);
HttpHeaders headers = getCommonHeaders("Create a new menu");

return createdMenu != null
? new ResponseEntity<>(createdMenu, headers, HttpStatus.CREATED)
: new ResponseEntity<>(headers, HttpStatus.BAD_REQUEST);
}
@PutMapping("/update/{id}")
public ResponseEntity<MenuRestaurant> updateMenu(@PathVariable String id, @RequestBody MenuRestaurant menuRestaurantDetails) {
MenuRestaurant updatedMenu = menuRestaurantService.updateMenuRestaurants(id, menuRestaurantDetails);
HttpHeaders headers = getCommonHeaders("Update a menu");

return updatedMenu != null
? new ResponseEntity<>(updatedMenu, headers, HttpStatus.OK)
: new ResponseEntity<>(headers, HttpStatus.NOT_FOUND);
}

@DeleteMapping("/delete/{id}")
public ResponseEntity<Void> deleteMenu(@PathVariable String id) {
boolean deleted = menuRestaurantService.deleteMenuRestaurants(id);
HttpHeaders headers = getCommonHeaders("Delete a menu");
headers.add("deleted", String.valueOf(deleted));

return deleted
? new ResponseEntity<>(headers, HttpStatus.NO_CONTENT)
: new ResponseEntity<>(headers, HttpStatus.NOT_FOUND);
}

@GetMapping("/get/{id}")
public ResponseEntity<MenuRestaurant> getMenuById(@PathVariable String id) {
MenuRestaurant menu = menuRestaurantService.getMenuRestaurantsById(id);
HttpHeaders headers = getCommonHeaders("Get a menu");

return menu != null
? new ResponseEntity<>(menu, headers, HttpStatus.OK)
: new ResponseEntity<>(headers, HttpStatus.NOT_FOUND);
}

private HttpHeaders getCommonHeaders(String description) {
HttpHeaders headers = new HttpHeaders();
headers.add("desc", description);
headers.add("content-type", "application/json");
headers.add("date", new Date().toString());
headers.add("server", "H2 Database");
headers.add("version", "1.0.0");
headers.add("menuRestaurant-count", String.valueOf(menuRestaurantService.countMenuRestaurant()));
headers.add("object", "customers");
return headers;
}
}
48 changes: 48 additions & 0 deletions src/main/java/dev/example/restaurantManager/model/MenuItem.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package dev.example.restaurantManager.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import dev.example.restaurantManager.model.enums.CourseType;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.GenericGenerator;

import java.util.ArrayList;
import java.util.List;
import java.util.UUID;

@Data
@Getter
@Setter
@AllArgsConstructor
@Entity
public class MenuItem {
@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
private String name;
private String description;
private double price;

@Enumerated(EnumType.STRING)
private CourseType courseType;

//using manytomany bidirectional way and remove recursion issue.
@JsonIgnore
@ManyToMany(mappedBy = "menuItems", fetch = FetchType.EAGER)
private List<MenuRestaurant> menus = new ArrayList<>();

// Default constructor
public MenuItem() {
this.id = UUID.randomUUID().toString();
}

// Constructors, getters, and setters

public MenuItem(String name, String description, double price) {
this.id = UUID.randomUUID().toString();
this.name = name;
this.description = description;
this.price = price;
}
}
Original file line number Diff line number Diff line change
@@ -1,22 +1,24 @@
package dev.example.restaurantManager.model;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToMany;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.GenericGenerator;

import java.util.ArrayList;
import java.util.List;

@Data
@Getter
@Setter
@AllArgsConstructor
@NoArgsConstructor
@Entity
public class MenuRestaurant {

@Id
@GeneratedValue(generator = "UUID")
@GenericGenerator(name = "UUID", strategy = "org.hibernate.id.UUIDGenerator")
private String id;
private String name;
private Double price;
Expand All @@ -27,6 +29,16 @@ public class MenuRestaurant {
@ManyToMany(mappedBy = "menus", fetch = FetchType.LAZY)
private List<OrderRestaurant> orders = new ArrayList<>();

//using bidirectional manytomany
@JsonIgnore
@ManyToMany(fetch = FetchType.EAGER
, cascade = {CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "menu_item_restaurant",
joinColumns = @JoinColumn(name = "menu_id"),
inverseJoinColumns = @JoinColumn(name = "menu_item_id"))
private List<MenuItem> menuItems = new ArrayList<>();

public MenuRestaurant(String id, String name, Double price, String content, boolean active, boolean water) {
this.id = id;
this.name = name;
Expand All @@ -36,6 +48,16 @@ public MenuRestaurant(String id, String name, Double price, String content, bool
this.water = water;
}

public void addMenuItem(MenuItem menuItem) {
this.menuItems.add(menuItem);
if (menuItem.getMenus() == null) {
menuItem.setMenus(new ArrayList<>());
}
if (!menuItem.getMenus().contains(this)) {
menuItem.getMenus().add(this);
}
}

//We might want to exclude 'orders' from toString() to avoid circular references
@Override
public String toString() {
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package dev.example.restaurantManager.model.enums;

public enum CourseType {
STARTER,
MAIN,
DESSERT
}
Original file line number Diff line number Diff line change
@@ -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<MenuItem,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.MenuItem;
import java.util.List;

public interface MenuItemService {
List<MenuItem> getAllMenuItems();
MenuItem createMenuItems(MenuItem menuItem);
MenuItem getMenuItemsById(String id);
MenuItem updateMenuItems(String id, MenuItem menuItemDetails);
boolean deleteMenuItems(String id);
long countMenuItems();
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package dev.example.restaurantManager.service;

import dev.example.restaurantManager.model.MenuItem;
import dev.example.restaurantManager.model.MenuRestaurant;
import dev.example.restaurantManager.repository.MenuItemRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.lang.reflect.Field;
import java.util.List;
import java.util.Optional;

@Service
public class MenuItemServiceImpl implements MenuItemService {

@Autowired
MenuItemRepository menuItemRepository;

@Override
public List<MenuItem> getAllMenuItems() {
return menuItemRepository.findAll();
}

@Override
public MenuItem createMenuItems(MenuItem menuItem) {
return menuItemRepository.save(menuItem);
}

@Override
public MenuItem getMenuItemsById(String id) {
return menuItemRepository.findById(id).orElse(null);
}

@Override
public MenuItem updateMenuItems(String id, MenuItem menuItemDetails) {
boolean isTrue = false;
MenuItem menuItemElement = menuItemRepository.findById(id).orElse(null);
if(menuItemElement != null){
Field[] fields = menuItemRepository.getClass().getDeclaredFields();
for (Field field : fields) {
try {
field.setAccessible(true);
if(field.get(menuItemElement) != field.get(menuItemDetails)){
isTrue = true;
field.set(menuItemElement,field.get(menuItemDetails));
}
} catch (IllegalAccessException e) {
throw new RuntimeException(e);
}
}
menuItemRepository.save(menuItemElement);
}

return isTrue ? menuItemElement : menuItemDetails;
}

@Override
public boolean deleteMenuItems(String id) {
Optional<MenuItem> menuItemElement = menuItemRepository.findById(id);
if(menuItemElement != null){
menuItemRepository.deleteById(id);
return true;
}
return false;
}

@Override
public long countMenuItems() {
return menuItemRepository.count();
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package dev.example.restaurantManager.service;

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

public interface MenuRestaurantService {
List<MenuRestaurant> getAllMenuRestaurants();
MenuRestaurant createMenuRestaurants(MenuRestaurant menuRestaurant);
MenuRestaurant getMenuRestaurantsById(String id);
MenuRestaurant updateMenuRestaurants(String id, MenuRestaurant menuRestaurantDetails);
boolean deleteMenuRestaurants(String id);
long countMenuRestaurant();
}
Loading