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
14 changes: 7 additions & 7 deletions _PRA/PRA03.md
Original file line number Diff line number Diff line change
Expand Up @@ -20,13 +20,13 @@ Implement and test a `ManyToMany` relationship between `Menu` and `MenuItem` ent

Summary tasks:

- [ ] Design Entity Classes
- [ ] Implement JPA Repositories
- [ ] Create Service Layer
- [ ] Develop REST Controllers
- [ ] Configure H2 Database
- [ ] Write Unit Tests
- [ ] Test with Swagger API
- [X] Design Entity Classes
- [X] Implement JPA Repositories
- [X] Create Service Layer
- [X] Develop REST Controllers
- [X] Configure H2 Database
- [X] Write Unit Tests
- [X] Test with Swagger API

Tasks:

Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,81 @@
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.createMenuItem(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.updateMenuItem(id, menuItemDetails);
HttpHeaders headers = getCommonHeaders("Update a 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.deleteMenuItem(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.getMenuItemById(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("customer-count", String.valueOf(menuItemService.countMenuItems()));
headers.add("object", "customers");
return headers;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
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.getAllMenus();
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.createMenu(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.updateMenu(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.deleteMenu(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.getMenuById(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("menu-count", String.valueOf(menuRestaurantService.countMenus()));
headers.add("object", "customers");
return headers;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package dev.example.restaurantManager.model;

public enum CourseType {
STARTER,
MAIN,
DESSERT
}
91 changes: 91 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,91 @@
package dev.example.restaurantManager.model;

import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.annotations.GenericGenerator;

import java.awt.*;
import java.util.*;
import java.util.List;

@AllArgsConstructor
@Entity
@Data
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 boolean isSpicy;
private boolean hasGluten;
private boolean isAvailable;

@Enumerated(EnumType.STRING)
private CourseType courseType;

// @ManyToMany(mappedBy = "menuItems")
// private Set<Menu> menus = new HashSet<>();

// Many to many with
@JsonIgnore
@ManyToMany(mappedBy = "menuItems", fetch = FetchType.LAZY)
private List<MenuRestaurant> menuRestaurants;

// Create add method
public void addItem(MenuRestaurant menu){
this.menuRestaurants.add(menu);
menu.getMenuItems().add(this);

}
// Create remove method
public void removeItem(MenuRestaurant menu) {
this.menuRestaurants.remove(menu);
menu.getMenuItems().remove(this);
}

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

@Override
public String toString() {
return "MenuRestaurant{" +
"id='" + id + '\'' +
", name='" + name + '\'' +
", description=" + description +
", spicy=" + isSpicy + '\'' +
", hasGluten=" + hasGluten +
", available=" + isAvailable +
", courseType=" + courseType +
//", menus=" + menuRestaurants +
'}';
}
// Updated equals() method to compare all fields except 'menuRestaurants'
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (!(object instanceof MenuItem)) return false;
MenuItem that = (MenuItem) object;
return isAvailable == that.isAvailable &&
hasGluten == that.hasGluten &&
isSpicy == that.isSpicy &&
Objects.equals(id, that.id) &&
Objects.equals(name, that.name) &&
Objects.equals(description, that.description) &&
Objects.equals(courseType, that.courseType);
}

@Override
public int hashCode() {
return Objects.hash(id, name, description, isSpicy, hasGluten,isAvailable, courseType);
}


}

Original file line number Diff line number Diff line change
@@ -1,14 +1,13 @@
package dev.example.restaurantManager.model;

import jakarta.persistence.Entity;
import jakarta.persistence.FetchType;
import jakarta.persistence.Id;
import jakarta.persistence.ManyToMany;
import com.fasterxml.jackson.annotation.JsonIgnore;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;

@Data
@AllArgsConstructor
Expand All @@ -24,8 +23,34 @@ public class MenuRestaurant {
private boolean active;
private boolean water;

// Many to Many with Orders
@JsonIgnore
@ManyToMany(mappedBy = "menus", fetch = FetchType.LAZY)
private List<OrderRestaurant> orders = new ArrayList<>();
private List<OrderRestaurant> orders;

// Many to Many with MenuItems
@JsonIgnore
@ManyToMany(fetch = FetchType.LAZY, cascade =
{CascadeType.PERSIST, CascadeType.MERGE})
@JoinTable(
name = "menu_items",
joinColumns = @JoinColumn(name = "MENU_FK_ID"),
inverseJoinColumns = @JoinColumn(name = "ITEM_FK_ID")
)
private List<MenuItem> menuItems = new ArrayList<>();

// Create add method
public void addItem(MenuItem item){
this.menuItems.add(item);
item.getMenuRestaurants().add(this);

}
// Create remove method
public void removeItem(MenuItem item) {
this.menuItems.remove(item);
item.getMenuRestaurants().remove(this);

}

public MenuRestaurant(String id, String name, Double price, String content, boolean active, boolean water) {
this.id = id;
Expand All @@ -47,9 +72,29 @@ public String toString() {
", active=" + active +
", water=" + water +
", ordersCount=" + (orders != null ? orders.size() : 0) +
", orders=" + orders +
//", orders=" + orders +
", menuItems=" + menuItems +
'}';
}

// Updated equals() method to compare all fields except 'order'
@Override
public boolean equals(Object object) {
if (this == object) return true;
if (!(object instanceof MenuRestaurant)) return false;
MenuRestaurant that = (MenuRestaurant) object;
return active == that.active &&
water == that.water &&
Objects.equals(id, that.id) &&
Objects.equals(name, that.name) &&
Objects.equals(price, that.price) &&
Objects.equals(content, that.content);
}

@Override
public int hashCode() {
return Objects.hash(id, name, price, content, active, water);
}

}

Loading