From 6f11415a448570cabb53185717ff4ab7128769a8 Mon Sep 17 00:00:00 2001 From: Student Date: Thu, 13 Nov 2025 08:30:36 -0800 Subject: [PATCH 01/13] Notes, item descriptions in web page --- files/menus/Appetizers.csv | 2 +- src/TODO | 1 + .../controller/API/Cart/CartController.java | 15 +++++-- .../controller/API/Menu/MenuController.java | 8 +--- .../controller/API/Order/OrderController.java | 22 ++++++++--- .../controller/screens/Menu/mainScreen.java | 1 - src/main/java/com/SushiAPI/SushiAPI/main.java | 16 ++++---- .../com/SushiAPI/SushiAPI/models/Item.java | 8 ++-- .../models/appetizers/appetizers.java | 12 +++--- .../SushiAPI/models/drinks/Drink.java | 10 ++--- .../SushiAPI/SushiAPI/models/extra/Extra.java | 16 +------- .../SushiAPI/models/nigiri/nigiri.java | 2 +- .../SushiAPI/SushiAPI/models/rolls/Roll.java | 2 +- .../SushiAPI/SushiAPI/utils/CartService.java | 9 +++-- .../com/SushiAPI/SushiAPI/utils/menu.java | 8 ++-- src/main/resources/templates/index.html | 39 ++++++++++++++----- 16 files changed, 97 insertions(+), 74 deletions(-) create mode 100644 src/TODO diff --git a/files/menus/Appetizers.csv b/files/menus/Appetizers.csv index 1096435..572f1af 100644 --- a/files/menus/Appetizers.csv +++ b/files/menus/Appetizers.csv @@ -1,4 +1,4 @@ -name|price|description|hot +name|price|ingredients|hot Edamame|3.95|steamed Japanese soy bean W/ salt|false Harumaki (4pcs)|3.95|Deep-fried japanese spring rolls|true Gyoza (6pcs)|3.95|Pan fried Japanese dumpling|true \ No newline at end of file diff --git a/src/TODO b/src/TODO new file mode 100644 index 0000000..db0d61b --- /dev/null +++ b/src/TODO @@ -0,0 +1 @@ +work on receipt \ No newline at end of file diff --git a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Cart/CartController.java b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Cart/CartController.java index e08ed69..caf71dc 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Cart/CartController.java +++ b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Cart/CartController.java @@ -32,7 +32,6 @@ public ResponseEntity getMenu() { return ResponseEntity.ok() .contentType(MediaType.APPLICATION_JSON) .body(CartService.allItemsAsJson().toString()); - } @PostMapping("/api/cart/add") @@ -43,13 +42,13 @@ public boolean addItem(@RequestBody String addItem) { JSONArray extras = jsonObject.getJSONArray("extras"); if(jsonObject.getString("category").equalsIgnoreCase("roll")) { - item = new Roll(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), jsonObject.getBoolean("isAppetizer"), jsonObject.getBoolean("isRaw"), null, extras); + item = new Roll(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), jsonObject.getBoolean("isAppetizer"), jsonObject.getBoolean("isRaw"), null, extras); } else if(jsonObject.getString("category").equalsIgnoreCase("drink")) { - item = new Drink(jsonObject.getString("name"), jsonObject.getDouble("price"), jsonObject.getBoolean("isHot"), jsonObject.getString("description")); + item = new Drink(jsonObject.getString("name"), jsonObject.getDouble("price"), jsonObject.getBoolean("isHot"), null); } else if (jsonObject.getString("category").equalsIgnoreCase("nigiri")) { item = new nigiri(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), jsonObject.getBoolean("isAppetizer"), jsonObject.getBoolean("isRaw"), null, extras); } else if (jsonObject.getString("category").equalsIgnoreCase("appetizer")) { - item = new appetizers(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), true, jsonObject.getBoolean("isRaw"), null, extras); + item = new appetizers(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), true, jsonObject.getBoolean("isRaw") , null, extras); } CartService.addItem(item); return true; @@ -72,6 +71,14 @@ public boolean removeItem(@RequestBody String removeItem) { return true; } + + @PostMapping("/api/cart/delete") + public boolean deleteAllItems() { + CartService.deleteAllItems(); + return true; + } + + @GetMapping("/api/cart/search") public ResponseEntity> searchCart(@RequestBody String searchItem) { JSONObject jsonObject = new JSONObject(searchItem); diff --git a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java index 82e505a..7219d5e 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java +++ b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java @@ -1,26 +1,20 @@ package com.SushiAPI.SushiAPI.controller.API.Menu; import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.utils.CartService; import com.SushiAPI.SushiAPI.utils.MenuServices; -import org.json.JSONArray; -import org.json.JSONObject; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.HashMap; -import java.util.List; -import java.util.Map; @RestController public class MenuController { - @GetMapping("/api/menu") + @GetMapping("/api/menu") // grab data from CSV public ResponseEntity>> getMenu() { HashMap> items = MenuServices.getMenuItems(); return new ResponseEntity>>(items, HttpStatus.OK); diff --git a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Order/OrderController.java b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Order/OrderController.java index 4e02e1d..fc3cea1 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Order/OrderController.java +++ b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Order/OrderController.java @@ -7,21 +7,33 @@ import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import java.util.List; @RestController public class OrderController { - @PostMapping("/api/order/pay") + @PostMapping("/api/order/pay") // pay order public ResponseEntity payOrder() { boolean paidOrder = CartService.pay(); return new ResponseEntity(paidOrder, HttpStatus.OK); } - @GetMapping("/api/order/totalAmount") - public ResponseEntity totalAmountDue() { - return new ResponseEntity(CartService.totalAmount() - , HttpStatus.OK); + @GetMapping("/api/order/totalAmount") // ?tip=24 not required + public ResponseEntity totalAmountDue(@RequestParam(required = false, name = "tip") String tip) { + if(!tip.isEmpty()) { + try{ + return new ResponseEntity(CartService.totalAmount(Double.parseDouble(tip)) + , HttpStatus.OK); + }catch (Exception e) { // just return empty + return new ResponseEntity(CartService.totalAmount() + , HttpStatus.OK); + } + + } else { + return new ResponseEntity(CartService.totalAmount() + , HttpStatus.OK); + } } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/controller/screens/Menu/mainScreen.java b/src/main/java/com/SushiAPI/SushiAPI/controller/screens/Menu/mainScreen.java index ba7f29b..12d0587 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/controller/screens/Menu/mainScreen.java +++ b/src/main/java/com/SushiAPI/SushiAPI/controller/screens/Menu/mainScreen.java @@ -8,7 +8,6 @@ import org.springframework.web.bind.annotation.RequestBody; @Controller - public class mainScreen { @GetMapping("/") public String ShowIndex(Model model) { diff --git a/src/main/java/com/SushiAPI/SushiAPI/main.java b/src/main/java/com/SushiAPI/SushiAPI/main.java index 5dccc96..13ee383 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/main.java +++ b/src/main/java/com/SushiAPI/SushiAPI/main.java @@ -7,19 +7,19 @@ import java.util.ArrayList; public class main { - public static boolean init = false; - public static final ArrayList items = new ArrayList<>(); - public static final ArrayList Cart = new ArrayList<>(); - public static final ArrayList ReceiptItems = new ArrayList<>(); + public static boolean init = false; // Safety check; Make sures no duplicates. + public static final ArrayList items = new ArrayList<>(); // Load in active cache for Menu + public static final ArrayList Cart = new ArrayList<>(); // Load items from users cart using REST API + public static final ArrayList ReceiptItems = new ArrayList<>(); // Generate Receipt from CART - public static void initialize() { + public static void initialize() { // Loads CSV FILES if(!init) { menu.loadMenu(); } init = true; } - static void main() { - initialize(); - SushiApiApplication.start(); + static void main() { // Main Application + initialize(); // run Function + SushiApiApplication.start(); // Start Server } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Item.java b/src/main/java/com/SushiAPI/SushiAPI/models/Item.java index af8c53e..7b7cd1b 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Item.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Item.java @@ -9,6 +9,7 @@ public abstract class Item { protected String name; + protected String ingredients; private double price; private boolean isDrink; private boolean isHot; @@ -18,17 +19,18 @@ public abstract class Item { // private List extras; // allows users to add extra spicy mayo, side of white rice, gluten-free soysauce private JSONArray extras; // Constructor - protected Item(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw) { + protected Item(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String ingredients) { this.name = name; this.price = price; this.isDrink = isDrink; this.isHot = isHot; this.isAppetizer = isAppetizer; this.isRaw = isRaw; + this.ingredients = ingredients; } - public Item(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, JSONArray extras) { - this(name, price, isDrink, isHot, isAppetizer, isRaw); + public Item(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String ingredients, JSONArray extras) { + this(name, price, isDrink, isHot, isAppetizer, isRaw, ingredients); this.extras = extras; } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/appetizers/appetizers.java b/src/main/java/com/SushiAPI/SushiAPI/models/appetizers/appetizers.java index d82f00d..decb275 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/appetizers/appetizers.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/appetizers/appetizers.java @@ -7,19 +7,17 @@ import java.util.List; public class appetizers extends Item { - private String description; - - public appetizers(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String description, JSONArray extras) { - super(name, price, isDrink, isHot, isAppetizer, isRaw, extras); - this.description = description; + public appetizers(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String ingredients, JSONArray extras) { + super(name, price, isDrink, isHot, isAppetizer, isRaw, ingredients, extras); + this.ingredients = ingredients; } public String getDescription() { - return description; + return ingredients; } public void setDescription(String description) { - this.description = description; + this.ingredients = description; } @Override diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/drinks/Drink.java b/src/main/java/com/SushiAPI/SushiAPI/models/drinks/Drink.java index 721445a..741d6ab 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/drinks/Drink.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/drinks/Drink.java @@ -3,19 +3,17 @@ import com.SushiAPI.SushiAPI.models.Item; public class Drink extends Item { - private String description; - public Drink(String name, double price, boolean isHot, String description) { - super(name, price, true, isHot, false, false); - this.description = description; + public Drink(String name, double price, boolean isHot, String ingredients) { + super(name, price, true, isHot, false, false, ingredients); } public String getDescription() { - return description; + return ingredients; } public void setDescription(String description) { - this.description = description; + this.ingredients = description; } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/extra/Extra.java b/src/main/java/com/SushiAPI/SushiAPI/models/extra/Extra.java index f902867..56ab6ea 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/extra/Extra.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/extra/Extra.java @@ -1,19 +1,10 @@ package com.SushiAPI.SushiAPI.models.extra; -import com.SushiAPI.SushiAPI.models.Item; -import com.google.gson.JsonArray; - -import java.util.ArrayList; -import java.util.List; - public class Extra{ - private String name; public Extra( String name) { -// if(!VALID_CHOICES.contains(name.toLowerCase())) { -// throw new IllegalArgumentException("Invalid Extra" + name); -// } + this.name = name.toLowerCase(); } @@ -22,13 +13,10 @@ public String getName() { } public void setName(String name) { -// if(!VALID_CHOICES.contains(name.toLowerCase())) { -// throw new IllegalArgumentException("Invalid Extra" + name); -// } this.name = name.toLowerCase(); } - // + // to String @Override public String toString() { return "Extra{" + diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/nigiri/nigiri.java b/src/main/java/com/SushiAPI/SushiAPI/models/nigiri/nigiri.java index 5402b72..e8f3c93 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/nigiri/nigiri.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/nigiri/nigiri.java @@ -10,7 +10,7 @@ public class nigiri extends Item { private String description; public nigiri(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String description, JSONArray extras) { - super(name, price, isDrink, isHot, isAppetizer, isRaw, extras); + super(name, price, isDrink, isHot, isAppetizer, isRaw, description, extras); this.description = description; } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/rolls/Roll.java b/src/main/java/com/SushiAPI/SushiAPI/models/rolls/Roll.java index 38ec3c3..f5e13e4 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/rolls/Roll.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/rolls/Roll.java @@ -10,7 +10,7 @@ public class Roll extends Item { private String description; public Roll(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String description, JSONArray extras) { - super(name, price, isDrink, isHot, isAppetizer, isRaw, extras); + super(name, price, isDrink, isHot, isAppetizer, isRaw, description, extras); this.description = description; } diff --git a/src/main/java/com/SushiAPI/SushiAPI/utils/CartService.java b/src/main/java/com/SushiAPI/SushiAPI/utils/CartService.java index 7985f10..fbd01e9 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/utils/CartService.java +++ b/src/main/java/com/SushiAPI/SushiAPI/utils/CartService.java @@ -42,8 +42,7 @@ public static JSONArray allItemsAsJson() { return array; } - - public static double totalAmount() { + public static double totalAmount() { // get Total Amount double totalAmount = 0; for (int i = 0; i < main.Cart.size(); i++) { totalAmount += main.Cart.get(i).getPrice(); @@ -51,7 +50,7 @@ public static double totalAmount() { return totalAmount; } - public double totalAmount(double tip) { + public static double totalAmount(double tip) { // get total Amount Plus TIP double totalAmount = 0; for (int i = 0; i < main.Cart.size(); i++) { totalAmount += main.Cart.get(i).getPrice(); @@ -84,4 +83,8 @@ public static ArrayList searchItems(String searchQuery) { } return resultList; } + + public static void deleteAllItems() { + main.Cart.clear(); + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/utils/menu.java b/src/main/java/com/SushiAPI/SushiAPI/utils/menu.java index 6007fbb..4a99e73 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/utils/menu.java +++ b/src/main/java/com/SushiAPI/SushiAPI/utils/menu.java @@ -35,11 +35,12 @@ public static void loadMenu() { String[] fields = line.split("\\|"); String name = fields[0].trim(); double price = Double.parseDouble(fields[1].trim()); + String ingredients = fields[3].trim(); boolean raw = Boolean.parseBoolean(fields[4].trim()); - main.items.add(new Roll(name, price, false, false, false, raw, null, null)); + main.items.add(new Roll(name, price, false, false, false, raw, ingredients, null)); } // load appetizers - // name|price|description|hot + // name|price|ingredients|hot String resultAppetizersString = resultAppetizers.toString(); String[] AppetizersLines = resultAppetizersString.split("\n"); for(String line : AppetizersLines) { @@ -47,8 +48,9 @@ public static void loadMenu() { String[] fields = line.split("\\|"); String name = fields[0].trim(); double price = Double.parseDouble(fields[1].trim()); + String ingredients = fields[2].trim(); boolean hot = Boolean.parseBoolean(fields[3].trim()); - main.items.add(new appetizers(name, price, false, hot, true, false, null, null)); + main.items.add(new appetizers(name, price, false, hot, true, false, ingredients, null)); } } } diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 42c0bba..7130a6d 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -601,7 +601,7 @@
- +
-

Fresh Japanese Cuisine

-

Experience authentic flavors with our carefully crafted sushi selection, made fresh daily with premium ingredients

+

Japanese Cuisine

+

Experience the best food, you've ever tasted in your life.

@@ -648,6 +648,12 @@

Your Order

+
+ +
+ @@ -897,8 +903,6 @@

${item.name}

}; fetch('http://localhost:8080/api/cart/add', options) - .then(response => response.json()) - .then(response => console.log(response)) .catch(err => console.error(err)); updateCart(); @@ -923,7 +927,7 @@

${item.name}

console.log(itemId.name) let body = { "name": itemId.name, - "price": "", + "price": itemId.price, "isDrink": false, "isHot": false, "isAppetizer": false, @@ -1009,7 +1013,8 @@

${item.name}

cart = []; updateCart(); toggleCart(); - + + //TODO: fix this const data = { items: [ { itemName: "California Roll", itemPrice: 10.99 }, @@ -1052,6 +1057,20 @@

${item.name}

document.body.removeChild(form); } + function deleteCheckOut() { + cart.length = 0; + cart.forEach(item => { + removeFromCart(item.id) + }) + const options = {method: 'POST', headers: {'User-Agent': 'insomnia/12.0.0'}}; + + fetch('http://localhost:8080/api/cart/delete', options) + .then(response => response.json()) + .then(response => console.log(response)) + .catch(err => console.error(err)); + renderMenu() + } + // Initialize renderMenu(); From 3520b2f1b0b6c8e945ec1084592567fec01a0fd9 Mon Sep 17 00:00:00 2001 From: Student Date: Thu, 13 Nov 2025 10:47:37 -0800 Subject: [PATCH 02/13] Notes, item descriptions in web page, redo on OOP --- Intro.md | 2 + README.md | 3 +- files/menus/Appetizers.csv | 8 +- files/menus/Drinks.csv | 12 +- files/menus/Nigiri.csv | 11 ++ files/menus/Rolls.csv | 8 +- img_1.png | Bin 0 -> 86096 bytes .../SushiAPI/SushiApiApplication.java | 2 - .../controller/API/Cart/CartController.java | 56 +-------- .../controller/API/Menu/MenuController.java | 17 +-- .../controller/API/Order/OrderController.java | 25 +--- .../API/Receipt/ReceiptController.java | 14 +-- .../screens/Receipt/ReceiptScreen.java | 11 -- src/main/java/com/SushiAPI/SushiAPI/main.java | 9 +- .../SushiAPI/models/Appetizer/Appetizer.java | 32 +++++ .../SushiAPI/models/Appetizer/Seafoods.java | 52 ++++++++ .../models/Appetizer/Traditional.java | 52 ++++++++ .../SushiAPI/models/Drinks/Alcohol.java | 57 +++++++++ .../SushiAPI/models/Drinks/Drinks.java | 37 ++++++ .../SushiAPI/SushiAPI/models/Drinks/Soda.java | 57 +++++++++ .../com/SushiAPI/SushiAPI/models/Item.java | 71 ----------- .../SushiAPI/SushiAPI/models/MenuItem.java | 19 +++ .../SushiAPI/models/Receipt/Receipt.java | 20 ---- .../SushiAPI/models/Receipt/item.java | 17 --- .../SushiAPI/models/Sushi/Nigiri.java | 52 ++++++++ .../SushiAPI/SushiAPI/models/Sushi/Roll.java | 44 +++++++ .../SushiAPI/SushiAPI/models/Sushi/Sushi.java | 32 +++++ .../models/appetizers/appetizers.java | 27 ----- .../SushiAPI/models/drinks/Drink.java | 24 ---- .../SushiAPI/SushiAPI/models/extra/Extra.java | 26 ---- .../com/SushiAPI/SushiAPI/models/menu.java | 7 -- .../SushiAPI/models/nigiri/nigiri.java | 29 ----- .../SushiAPI/SushiAPI/models/rolls/Roll.java | 29 ----- .../com/SushiAPI/SushiAPI/models/test.java | 22 ++++ .../SushiAPI/SushiAPI/models/totalAmount.java | 6 - .../SushiAPI/SushiAPI/utils/CartService.java | 90 -------------- .../SushiAPI/SushiAPI/utils/MenuServices.java | 51 -------- .../SushiAPI/utils/Services/CartService.java | 5 + .../utils/{ => Services}/ReceiptService.java | 20 +--- .../com/SushiAPI/SushiAPI/utils/menu.java | 113 +++++++++++++----- .../SushiAPI/SushiApiApplicationTests.java | 5 +- 41 files changed, 599 insertions(+), 575 deletions(-) create mode 100644 Intro.md create mode 100644 files/menus/Nigiri.csv create mode 100644 img_1.png create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Appetizer.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Drinks.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Item.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/MenuItem.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Receipt/Receipt.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Receipt/item.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/appetizers/appetizers.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/drinks/Drink.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/extra/Extra.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/menu.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/nigiri/nigiri.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/rolls/Roll.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/test.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/models/totalAmount.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/utils/CartService.java delete mode 100644 src/main/java/com/SushiAPI/SushiAPI/utils/MenuServices.java create mode 100644 src/main/java/com/SushiAPI/SushiAPI/utils/Services/CartService.java rename src/main/java/com/SushiAPI/SushiAPI/utils/{ => Services}/ReceiptService.java (75%) diff --git a/Intro.md b/Intro.md new file mode 100644 index 0000000..7177d31 --- /dev/null +++ b/Intro.md @@ -0,0 +1,2 @@ +My project called Super Sushi demostrates the usage of OOP within Java. +by creating an ``Item Class`` with two interferes, menu and totalAmount diff --git a/README.md b/README.md index ff3d45d..5054c88 100644 --- a/README.md +++ b/README.md @@ -61,4 +61,5 @@ The following code snippet demonstrates a mechanism for **dynamically adjusting ``` ----- - +## 🌐 FrontEnd Images: Home page +![img_1.png](img_1.png) diff --git a/files/menus/Appetizers.csv b/files/menus/Appetizers.csv index 572f1af..1c9df58 100644 --- a/files/menus/Appetizers.csv +++ b/files/menus/Appetizers.csv @@ -1,4 +1,4 @@ -name|price|ingredients|hot -Edamame|3.95|steamed Japanese soy bean W/ salt|false -Harumaki (4pcs)|3.95|Deep-fried japanese spring rolls|true -Gyoza (6pcs)|3.95|Pan fried Japanese dumpling|true \ No newline at end of file +name|price|ingredients|hot|type +Edamame|3.95|steamed Japanese soy bean W/ salt|false|0 +Harumaki (4pcs)|3.95|Deep-fried japanese spring rolls|true|0 +Gyoza (6pcs)|3.95|Pan fried Japanese dumpling|true|0 \ No newline at end of file diff --git a/files/menus/Drinks.csv b/files/menus/Drinks.csv index 26d2ea0..8b810c7 100644 --- a/files/menus/Drinks.csv +++ b/files/menus/Drinks.csv @@ -1,6 +1,6 @@ -name|price|qty|hot -Ramune Soda|2.95|5|false -Soda|2.95|5|false -Sparking Soda|2.95|5|false -Orange Juice|2.95|5|false -Apple Juice|2.95|5|false +name|price|size|hot|alcohol +Ramune Soda|14|5|false|false +Soda|2.95|12|false|false +Sparking Soda|14|5|false|false +Orange Juice|12|5|false|false +Apple Juice|12|5|false|false diff --git a/files/menus/Nigiri.csv b/files/menus/Nigiri.csv new file mode 100644 index 0000000..18f54e4 --- /dev/null +++ b/files/menus/Nigiri.csv @@ -0,0 +1,11 @@ +name|price|SpiceLevel|ingredients|raw|extra +Salmon Nigiri|4.50|1|Salmon, Sushi Rice, Wasabi|TRUE|Soy Sauce +Tuna Nigiri|4.75|1|Tuna, Sushi Rice, Wasabi|TRUE|Soy Sauce +Eel Nigiri|5.00|2|Grilled Eel, Sushi Rice, Sweet Soy Sauce|FALSE|Eel Sauce +Shrimp Nigiri|4.25|1|Boiled Shrimp, Sushi Rice, Wasabi|FALSE|Lemon Slice +Octopus Nigiri|4.00|1|Octopus, Sushi Rice, Wasabi|FALSE|Ponzu Sauce +Yellowtail Nigiri|4.75|2|Yellowtail, Sushi Rice, Wasabi|TRUE|Scallions +Scallop Nigiri|5.25|1|Scallop, Sushi Rice, Wasabi|TRUE|Yuzu Sauce +Tamago Nigiri|3.50|0|Sweet Egg Omelet, Sushi Rice, Nori|FALSE|Sesame Seeds +Ikura Nigiri|5.50|1|Salmon Roe, Sushi Rice, Nori|TRUE|Cucumber Slice +Uni Nigiri|6.00|1|Sea Urchin, Sushi Rice, Wasabi|TRUE|Shiso Leaf diff --git a/files/menus/Rolls.csv b/files/menus/Rolls.csv index 119f429..d4856f2 100644 --- a/files/menus/Rolls.csv +++ b/files/menus/Rolls.csv @@ -1,4 +1,4 @@ -name|price|available|ingredients|raw|extra -Crystal Roll|7|true|spicy scallop, crunchy, masago, tempura shrimp, asparagus, rolled in soy wrap, w/house special creamy sauce, eel sauce, bonito flake|true|null -Hulk Roll|7|true|salmon, yellowtail, jalapeno, topped w/yellowtail, avocado, wasabi tobiko, honey wasabi mayo|true|null -Fuji Roll|7|true|Spicy tuna, crunchy topped w/salmon, avocado, tobikko arare, spicy mayo|true|null \ No newline at end of file +name|price|SpiceLevel|ingredients|raw|extra +Crystal Roll|7|0|spicy scallop, crunchy, masago, tempura shrimp, asparagus, rolled in soy wrap, w/house special creamy sauce, eel sauce, bonito flake|true|null +Hulk Roll|7|0|salmon, yellowtail, jalapeno, topped w/yellowtail, avocado, wasabi tobiko, honey wasabi mayo|true|null +Fuji Roll|7|0|Spicy tuna, crunchy topped w/salmon, avocado, tobikko arare, spicy mayo|true|null \ No newline at end of file diff --git a/img_1.png b/img_1.png new file mode 100644 index 0000000000000000000000000000000000000000..66d4736e5f4406dc9190a2942748369ff5b57a84 GIT binary patch literal 86096 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

q*~I&iEEl9TPrDZkpLTnoZ4 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 getMenu() { - return ResponseEntity.ok() - .contentType(MediaType.APPLICATION_JSON) - .body(CartService.allItemsAsJson().toString()); + public void getMenu() { + return; } @PostMapping("/api/cart/add") public boolean addItem(@RequestBody String addItem) { JSONObject jsonObject = new JSONObject(addItem); - Item item = null; - - JSONArray extras = jsonObject.getJSONArray("extras"); - - if(jsonObject.getString("category").equalsIgnoreCase("roll")) { - item = new Roll(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), jsonObject.getBoolean("isAppetizer"), jsonObject.getBoolean("isRaw"), null, extras); - } else if(jsonObject.getString("category").equalsIgnoreCase("drink")) { - item = new Drink(jsonObject.getString("name"), jsonObject.getDouble("price"), jsonObject.getBoolean("isHot"), null); - } else if (jsonObject.getString("category").equalsIgnoreCase("nigiri")) { - item = new nigiri(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), jsonObject.getBoolean("isAppetizer"), jsonObject.getBoolean("isRaw"), null, extras); - } else if (jsonObject.getString("category").equalsIgnoreCase("appetizer")) { - item = new appetizers(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), true, jsonObject.getBoolean("isRaw") , null, extras); - } - CartService.addItem(item); return true; } @PostMapping("/api/cart/remove") public boolean removeItem(@RequestBody String removeItem) { - JSONObject jsonObject = new JSONObject(removeItem); - Item item = null; - if(jsonObject.getString("category").equalsIgnoreCase("roll")) { - JSONArray myExtras = new JSONArray(); - item = new Roll(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), jsonObject.getBoolean("isAppetizer"), jsonObject.getBoolean("isRaw"), "Eel + avocado", myExtras); - } else if(jsonObject.getString("category").equalsIgnoreCase("drink")) { - item = new Drink(jsonObject.getString("name"), jsonObject.getDouble("price"), jsonObject.getBoolean("isHot"), jsonObject.getString("description")); - } else if (jsonObject.getString("category").equalsIgnoreCase("nigiri")) { - JSONArray myExtras = new JSONArray(); - item = new nigiri(jsonObject.getString("name"), jsonObject.getDouble("price"), false, jsonObject.getBoolean("isHot"), jsonObject.getBoolean("isAppetizer"), jsonObject.getBoolean("isRaw"), "Eel + avocado", myExtras); - } - CartService.removeItem(item); return true; } @PostMapping("/api/cart/delete") public boolean deleteAllItems() { - CartService.deleteAllItems(); return true; } @GetMapping("/api/cart/search") - public ResponseEntity> searchCart(@RequestBody String searchItem) { - JSONObject jsonObject = new JSONObject(searchItem); - List items = CartService.searchItems(jsonObject.getString("query")); - return new ResponseEntity>(items, HttpStatus.OK); + public void searchCart(@RequestBody String searchItem) { } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java index 7219d5e..6f5cb6b 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java +++ b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java @@ -1,28 +1,19 @@ package com.SushiAPI.SushiAPI.controller.API.Menu; -import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.utils.MenuServices; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; -import java.util.HashMap; - @RestController public class MenuController { @GetMapping("/api/menu") // grab data from CSV - public ResponseEntity>> getMenu() { - HashMap> items = MenuServices.getMenuItems(); - return new ResponseEntity>>(items, HttpStatus.OK); + public void getMenu() { + return; } @GetMapping("/api/menu/filter/") // api/menu/filter?search - public boolean searchItem(@RequestParam(required=true, defaultValue="") String searchQuery) { -// List items = MenuServices.getMenuItems(jsonObject.getString("query")); - return true; + public void searchItem(@RequestParam(required=true, defaultValue="") String searchQuery) { + return; } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Order/OrderController.java b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Order/OrderController.java index fc3cea1..a02e264 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Order/OrderController.java +++ b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Order/OrderController.java @@ -1,39 +1,18 @@ package com.SushiAPI.SushiAPI.controller.API.Order; -import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.utils.CartService; -import com.SushiAPI.SushiAPI.utils.MenuServices; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import java.util.List; - @RestController public class OrderController { @PostMapping("/api/order/pay") // pay order - public ResponseEntity payOrder() { - boolean paidOrder = CartService.pay(); - return new ResponseEntity(paidOrder, HttpStatus.OK); + public void payOrder() { } @GetMapping("/api/order/totalAmount") // ?tip=24 not required - public ResponseEntity totalAmountDue(@RequestParam(required = false, name = "tip") String tip) { - if(!tip.isEmpty()) { - try{ - return new ResponseEntity(CartService.totalAmount(Double.parseDouble(tip)) - , HttpStatus.OK); - }catch (Exception e) { // just return empty - return new ResponseEntity(CartService.totalAmount() - , HttpStatus.OK); - } + public void totalAmountDue(@RequestParam(required = false, name = "tip") String tip) { - } else { - return new ResponseEntity(CartService.totalAmount() - , HttpStatus.OK); - } } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Receipt/ReceiptController.java b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Receipt/ReceiptController.java index cac160b..a852b85 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Receipt/ReceiptController.java +++ b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Receipt/ReceiptController.java @@ -1,22 +1,12 @@ package com.SushiAPI.SushiAPI.controller.API.Receipt; -import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.utils.CartService; -import com.SushiAPI.SushiAPI.utils.ReceiptService; -import org.springframework.http.HttpStatus; -import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RestController; -import java.util.ArrayList; -import java.util.HashMap; - @RestController public class ReceiptController { @GetMapping("/api/receipt/generate") - public ResponseEntity>> generateReceipt() { - ArrayList> paidOrder = ReceiptService.generateReceipt(); - return new ResponseEntity>>(paidOrder, HttpStatus.OK); + public void generateReceipt() { + return; } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/controller/screens/Receipt/ReceiptScreen.java b/src/main/java/com/SushiAPI/SushiAPI/controller/screens/Receipt/ReceiptScreen.java index 6a76c94..b6ae6e9 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/controller/screens/Receipt/ReceiptScreen.java +++ b/src/main/java/com/SushiAPI/SushiAPI/controller/screens/Receipt/ReceiptScreen.java @@ -1,24 +1,13 @@ package com.SushiAPI.SushiAPI.controller.screens.Receipt; -import com.SushiAPI.SushiAPI.main; -import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.models.appetizers.appetizers; -import com.SushiAPI.SushiAPI.models.drinks.Drink; -import com.SushiAPI.SushiAPI.models.extra.Extra; -import com.SushiAPI.SushiAPI.models.nigiri.nigiri; -import com.SushiAPI.SushiAPI.models.rolls.Roll; -import com.google.gson.JsonArray; import org.json.JSONArray; import org.json.JSONObject; import org.springframework.stereotype.Controller; import org.springframework.ui.Model; import org.springframework.web.bind.annotation.GetMapping; -import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestBody; -import java.util.List; - @Controller public class ReceiptScreen { @GetMapping("/receipt") diff --git a/src/main/java/com/SushiAPI/SushiAPI/main.java b/src/main/java/com/SushiAPI/SushiAPI/main.java index 13ee383..13d99e4 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/main.java +++ b/src/main/java/com/SushiAPI/SushiAPI/main.java @@ -1,16 +1,15 @@ package com.SushiAPI.SushiAPI; -import com.SushiAPI.SushiAPI.models.Item; +import com.SushiAPI.SushiAPI.models.MenuItem; import com.SushiAPI.SushiAPI.utils.menu; -import java.lang.reflect.Array; import java.util.ArrayList; public class main { public static boolean init = false; // Safety check; Make sures no duplicates. - public static final ArrayList items = new ArrayList<>(); // Load in active cache for Menu - public static final ArrayList Cart = new ArrayList<>(); // Load items from users cart using REST API - public static final ArrayList ReceiptItems = new ArrayList<>(); // Generate Receipt from CART + public static final ArrayList items = new ArrayList<>(); // Load in active cache for Menu + public static final ArrayList Cart = new ArrayList<>(); // Load items from users cart using REST API + public static final ArrayList ReceiptItems = new ArrayList<>(); // Generate Receipt from CART public static void initialize() { // Loads CSV FILES if(!init) { diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Appetizer.java b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Appetizer.java new file mode 100644 index 0000000..962e44a --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Appetizer.java @@ -0,0 +1,32 @@ +package com.SushiAPI.SushiAPI.models.Appetizer; + +import com.SushiAPI.SushiAPI.models.MenuItem; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Appetizer implements MenuItem { + private String name; + private double price; + private int spiceLevel; + private List ingredients = new ArrayList<>(); + private List extras = new ArrayList<>(); + private String category; + + public Appetizer(String name, double price, int spiceLevel, String category, List ingredients, List extras) { + this.name = name; + this.price = price; + this.spiceLevel = spiceLevel; + this.category = category; + this.ingredients = ingredients; + this.extras = extras; + } + + @Override public String getName() { return this.name; } + @Override public List getIngredients() { return this.ingredients;} + @Override public double getPrice() { return this.price; } + @Override public int getSpiceLevel() { return this.spiceLevel; } + @Override public List getExtras() { return this.extras; } + @Override public boolean isDrink() {return false;} + +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java new file mode 100644 index 0000000..e80f5c0 --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java @@ -0,0 +1,52 @@ +package com.SushiAPI.SushiAPI.models.Appetizer; + +import java.util.List; + +public class Seafoods extends Appetizer{ + private String name; + private double price; + private List ingredients; + private List extras; + + public Seafoods(String name, double price, int spiceLevel, List ingredients, List extras) { + super(name + " Seafood Appetizer", price, spiceLevel, "Appetizer", ingredients, extras); + this.name = name; + this.price = price; + this.ingredients = ingredients; + this.extras = extras; + } + + public List getExtras() { + return extras; + } + + @Override + public String getName() { + return name; + } + + @Override + public List getIngredients() { + return ingredients; + } + + @Override + public double getPrice() { + return price; + } + + @Override + public String getCategory() { + return "Seafood Appetizer"; + } + + @Override + public boolean getCold() { + return false; + } + + @Override + public boolean isAlcohol() { + return false; + } +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java new file mode 100644 index 0000000..d19944e --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java @@ -0,0 +1,52 @@ +package com.SushiAPI.SushiAPI.models.Appetizer; + +import java.util.List; + +public class Traditional extends Appetizer{ + private String name; + private double price; + private List ingredients; + private List extras; + + public Traditional(String name, double price, int spiceLevel, List ingredients, List extras) { + super(name + " Traditional Appetizer", price, spiceLevel, "Appetizer", ingredients, extras); + this.name = name; + this.price = price; + this.ingredients = ingredients; + this.extras = extras; + } + + public List getExtras() { + return extras; + } + + @Override + public String getName() { + return name; + } + + @Override + public List getIngredients() { + return ingredients; + } + + @Override + public double getPrice() { + return price; + } + + @Override + public String getCategory() { + return "Traditional Appetizer"; + } + + @Override + public boolean getCold() { + return false; + } + + @Override + public boolean isAlcohol() { + return false; + } +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java new file mode 100644 index 0000000..f39634f --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java @@ -0,0 +1,57 @@ +package com.SushiAPI.SushiAPI.models.Drinks; + +import java.util.List; + +public class Alcohol extends Drinks{ + private String name; + private double price; + private List ingredients; + private List extras; + + public Alcohol(String name, double price, boolean isCold, boolean isAlcohol, List ingredients, List extras) { + super(name + " Alcohol", price, isCold, true, "Alcohol", ingredients, extras); + this.name = name; + this.price = price; + this.ingredients = ingredients; + this.extras = extras; + } + + @Override + public int getSpiceLevel() { + return 0; + } + + @Override + public String getCategory() { + return "Alcohol"; + } + + public List getExtras() { + return extras; + } + + @Override + public String getName() { + return name; + } + + @Override + public List getIngredients() { + return ingredients; + } + + @Override + public double getPrice() { + return price; + } + + @Override + public boolean getCold() { + return false; + } + + @Override + public boolean isAlcohol() { + return false; + } +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Drinks.java b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Drinks.java new file mode 100644 index 0000000..eceef90 --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Drinks.java @@ -0,0 +1,37 @@ +package com.SushiAPI.SushiAPI.models.Drinks; + +import com.SushiAPI.SushiAPI.models.MenuItem; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Drinks implements MenuItem { + private String name; + private double price; + private boolean isCold; + private List ingredients = new ArrayList<>(); + private List extras = new ArrayList<>(); + private String category; + private boolean isAlcohol; + + public Drinks(String name, double price, boolean isCold, boolean isAlcohol, String category, List ingredients, List extras) { + this.name = name; + this.price = price; + this.isCold = isCold; + this.category = category; + this.ingredients = ingredients; + this.extras = extras; + this.isAlcohol = isAlcohol; + } + + @Override public String getName() { return this.name; } + @Override public List getIngredients() { return this.ingredients;} + @Override public double getPrice() { return this.price; } + @Override public boolean getCold() { return this.isCold; } + @Override public List getExtras() { return this.extras; } + @Override public boolean isDrink() {return true;} + @Override + public boolean isAlcohol() { + return isAlcohol; + } +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java new file mode 100644 index 0000000..8c5e233 --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java @@ -0,0 +1,57 @@ +package com.SushiAPI.SushiAPI.models.Drinks; + +import java.util.List; + +public class Soda extends Drinks{ + private String name; + private double price; + private List ingredients; + private List extras; + + public Soda(String name, double price, boolean isCold, boolean isAlcohol, List ingredients, List extras) { + super(name + " Soda", price, isCold, false, "Soda", ingredients, extras); + this.name = name; + this.price = price; + this.ingredients = ingredients; + this.extras = extras; + } + + @Override + public int getSpiceLevel() { + return 0; + } + + @Override + public String getCategory() { + return "Soda"; + } + + public List getExtras() { + return extras; + } + + @Override + public String getName() { + return name; + } + + @Override + public List getIngredients() { + return ingredients; + } + + @Override + public double getPrice() { + return price; + } + + @Override + public boolean getCold() { + return false; + } + + @Override + public boolean isAlcohol() { + return false; + } +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Item.java b/src/main/java/com/SushiAPI/SushiAPI/models/Item.java deleted file mode 100644 index 7b7cd1b..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Item.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.SushiAPI.SushiAPI.models; - -import com.SushiAPI.SushiAPI.models.extra.Extra; -import com.google.gson.JsonArray; -import org.json.JSONArray; - -import java.util.ArrayList; -import java.util.List; - -public abstract class Item { - protected String name; - protected String ingredients; - private double price; - private boolean isDrink; - private boolean isHot; - private boolean isAppetizer; - private boolean isRaw; - private int id; -// private List extras; // allows users to add extra spicy mayo, side of white rice, gluten-free soysauce - private JSONArray extras; - // Constructor - protected Item(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String ingredients) { - this.name = name; - this.price = price; - this.isDrink = isDrink; - this.isHot = isHot; - this.isAppetizer = isAppetizer; - this.isRaw = isRaw; - this.ingredients = ingredients; - } - - public Item(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String ingredients, JSONArray extras) { - this(name, price, isDrink, isHot, isAppetizer, isRaw, ingredients); - this.extras = extras; - } - - // shared - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name; - } - - public double getPrice() { - return price; - } - - public void setPrice(double price) { - this.price = price; - } - - public JSONArray getExtras() { - return extras; - } - - public void setExtras(JSONArray extras) {this.extras = extras;} - - public int getId() { - return id; - } - - public void setId(int id) { - this.id = id; - } - - // - public abstract String getCategory(); -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/MenuItem.java b/src/main/java/com/SushiAPI/SushiAPI/models/MenuItem.java new file mode 100644 index 0000000..f2cbed4 --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/MenuItem.java @@ -0,0 +1,19 @@ +package com.SushiAPI.SushiAPI.models; + +import java.util.List; +import java.util.Arrays; +import java.util.Collections; + +public interface MenuItem { + String getName(); + String getCategory(); + List getIngredients(); + + double getPrice(); + int getSpiceLevel(); + List getExtras(); + boolean isDrink(); + boolean getCold(); + boolean isAlcohol(); + +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Receipt/Receipt.java b/src/main/java/com/SushiAPI/SushiAPI/models/Receipt/Receipt.java deleted file mode 100644 index a4eb0b3..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Receipt/Receipt.java +++ /dev/null @@ -1,20 +0,0 @@ -package com.SushiAPI.SushiAPI.models.Receipt; - -import java.time.LocalDate; -import java.util.ArrayList; - -public abstract class Receipt { - private LocalDate localDate; - private double totalAmount; - private double tax; - private ArrayList items = new ArrayList<>(); - - // Consturcotor - - public Receipt(LocalDate localDate, double totalAmount, double tax, ArrayList items) { - this.localDate = localDate; - this.totalAmount = totalAmount; - this.tax = tax; - this.items = items; - } -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Receipt/item.java b/src/main/java/com/SushiAPI/SushiAPI/models/Receipt/item.java deleted file mode 100644 index ce4f42a..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Receipt/item.java +++ /dev/null @@ -1,17 +0,0 @@ -package com.SushiAPI.SushiAPI.models.Receipt; - -import java.time.LocalDate; -import java.util.ArrayList; - -public class item extends Receipt { - private String itemName; - private double itemPrice; - private String itemDescription; - - public item(LocalDate localDate, double totalAmount, double tax, ArrayList items, String itemName, double itemPrice, String itemDescription) { - super(localDate, totalAmount, tax, items); - this.itemName = itemName; - this.itemPrice = itemPrice; - this.itemDescription = itemDescription; - } -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java new file mode 100644 index 0000000..f54c1e1 --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java @@ -0,0 +1,52 @@ +package com.SushiAPI.SushiAPI.models.Sushi; + +import java.util.List; + +public class Nigiri extends Sushi{ + private String name; + private double price; + private List ingredients; + private List extras; + + public Nigiri(String name, double price, int spiceLevel, List ingredients, List extras) { + super(name + " Nigiri", price, spiceLevel, "Nigiri", ingredients, extras); + this.name = name; + this.price = price; + this.ingredients = ingredients; + this.extras = extras; + } + + public List getExtras() { + return extras; + } + + @Override + public String getName() { + return name; + } + + @Override + public List getIngredients() { + return ingredients; + } + + @Override + public double getPrice() { + return price; + } + + @Override + public String getCategory() { + return "roll"; + } + + @Override + public boolean getCold() { + return false; + } + + @Override + public boolean isAlcohol() { + return false; + } +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java new file mode 100644 index 0000000..8731638 --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java @@ -0,0 +1,44 @@ +package com.SushiAPI.SushiAPI.models.Sushi; + +import java.util.List; + +public class Roll extends Sushi{ + private String name; + private double price; + private List ingredients; + private List extras; + + public Roll(String name, double price, int spiceLevel, List ingredients, List extras) { + super(name + " roll", price, spiceLevel, "roll", ingredients, extras); + this.name = name; + this.price = price; + this.ingredients = ingredients; + this.extras = extras; + } + + public List getExtras() { + return extras; + } + + @Override + public double getPrice() { + return price; + } + + @Override + public String getCategory() { + return "roll"; + } + + @Override + public boolean getCold() { + return false; + } + + @Override + public boolean isAlcohol() { + return false; + } + + +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java new file mode 100644 index 0000000..cb97771 --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java @@ -0,0 +1,32 @@ +package com.SushiAPI.SushiAPI.models.Sushi; + +import com.SushiAPI.SushiAPI.models.MenuItem; + +import java.util.ArrayList; +import java.util.List; + +public abstract class Sushi implements MenuItem { + private String name; + private double price; + private int spiceLevel; + private List ingredients = new ArrayList<>(); + private List extras = new ArrayList<>(); + private String category; + + public Sushi(String name, double price, int spiceLevel, String category, List ingredients, List extras) { + this.name = name; + this.price = price; + this.spiceLevel = spiceLevel; + this.category = category; + this.ingredients = ingredients; + this.extras = extras; + } + + @Override public String getName() { return this.name; } + @Override public List getIngredients() { return this.ingredients;} + @Override public double getPrice() { return this.price; } + @Override public int getSpiceLevel() { return this.spiceLevel; } + @Override public List getExtras() { return this.extras; } + @Override public boolean isDrink() {return false;} + +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/appetizers/appetizers.java b/src/main/java/com/SushiAPI/SushiAPI/models/appetizers/appetizers.java deleted file mode 100644 index decb275..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/appetizers/appetizers.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.SushiAPI.SushiAPI.models.appetizers; - -import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.models.extra.Extra; -import org.json.JSONArray; - -import java.util.List; - -public class appetizers extends Item { - public appetizers(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String ingredients, JSONArray extras) { - super(name, price, isDrink, isHot, isAppetizer, isRaw, ingredients, extras); - this.ingredients = ingredients; - } - - public String getDescription() { - return ingredients; - } - - public void setDescription(String description) { - this.ingredients = description; - } - - @Override - public String getCategory() { - return "Appetizer"; - } -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/drinks/Drink.java b/src/main/java/com/SushiAPI/SushiAPI/models/drinks/Drink.java deleted file mode 100644 index 741d6ab..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/drinks/Drink.java +++ /dev/null @@ -1,24 +0,0 @@ -package com.SushiAPI.SushiAPI.models.drinks; - -import com.SushiAPI.SushiAPI.models.Item; - -public class Drink extends Item { - - public Drink(String name, double price, boolean isHot, String ingredients) { - super(name, price, true, isHot, false, false, ingredients); - } - - public String getDescription() { - return ingredients; - } - - public void setDescription(String description) { - this.ingredients = description; - } - - - @Override - public String getCategory() { - return "Drink"; - } -} \ No newline at end of file diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/extra/Extra.java b/src/main/java/com/SushiAPI/SushiAPI/models/extra/Extra.java deleted file mode 100644 index 56ab6ea..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/extra/Extra.java +++ /dev/null @@ -1,26 +0,0 @@ -package com.SushiAPI.SushiAPI.models.extra; - -public class Extra{ - private String name; - - public Extra( String name) { - - this.name = name.toLowerCase(); - } - - public String getName() { - return name; - } - - public void setName(String name) { - this.name = name.toLowerCase(); - } - - // to String - @Override - public String toString() { - return "Extra{" + - "name='" + name + '\'' + - '}'; - } -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/menu.java b/src/main/java/com/SushiAPI/SushiAPI/models/menu.java deleted file mode 100644 index dca6f65..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/menu.java +++ /dev/null @@ -1,7 +0,0 @@ -package com.SushiAPI.SushiAPI.models; - -import java.util.ArrayList; - -public interface menu { - ArrayList filter(String keyword); -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/nigiri/nigiri.java b/src/main/java/com/SushiAPI/SushiAPI/models/nigiri/nigiri.java deleted file mode 100644 index e8f3c93..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/nigiri/nigiri.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.SushiAPI.SushiAPI.models.nigiri; - -import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.models.extra.Extra; -import org.json.JSONArray; - -import java.util.List; - -public class nigiri extends Item { - private String description; - - public nigiri(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String description, JSONArray extras) { - super(name, price, isDrink, isHot, isAppetizer, isRaw, description, extras); - this.description = description; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - @Override - public String getCategory() { - return "nigiri"; - } -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/rolls/Roll.java b/src/main/java/com/SushiAPI/SushiAPI/models/rolls/Roll.java deleted file mode 100644 index f5e13e4..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/rolls/Roll.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.SushiAPI.SushiAPI.models.rolls; - -import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.models.extra.Extra; -import org.json.JSONArray; - -import java.util.List; - -public class Roll extends Item { - private String description; - - public Roll(String name, double price, boolean isDrink, boolean isHot, boolean isAppetizer, boolean isRaw, String description, JSONArray extras) { - super(name, price, isDrink, isHot, isAppetizer, isRaw, description, extras); - this.description = description; - } - - public String getDescription() { - return description; - } - - public void setDescription(String description) { - this.description = description; - } - - @Override - public String getCategory() { - return "Roll"; - } -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/test.java b/src/main/java/com/SushiAPI/SushiAPI/models/test.java new file mode 100644 index 0000000..00a2bdf --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/models/test.java @@ -0,0 +1,22 @@ +package com.SushiAPI.SushiAPI.models; + +import com.SushiAPI.SushiAPI.models.Sushi.Nigiri; +import com.SushiAPI.SushiAPI.models.Sushi.Roll; + +import java.util.ArrayList; + +public class test { + static void main() { + Roll roll = new Roll("aw", 2, 0, new ArrayList<>(), new ArrayList<>()); + Nigiri nigiri = new Nigiri("test", 2, 0, new ArrayList<>(), new ArrayList<>()); + + ArrayList data = new ArrayList<>(); + data.add(roll); + data.add(nigiri); + for(MenuItem item : data) { + if (item instanceof Roll) { + System.out.println(item.getName() + " is a roll"); + } + } + } +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/totalAmount.java b/src/main/java/com/SushiAPI/SushiAPI/models/totalAmount.java deleted file mode 100644 index 209c3aa..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/models/totalAmount.java +++ /dev/null @@ -1,6 +0,0 @@ -package com.SushiAPI.SushiAPI.models; - -@FunctionalInterface -public interface totalAmount { - int add(double total, double add); -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/utils/CartService.java b/src/main/java/com/SushiAPI/SushiAPI/utils/CartService.java deleted file mode 100644 index fbd01e9..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/utils/CartService.java +++ /dev/null @@ -1,90 +0,0 @@ -package com.SushiAPI.SushiAPI.utils; - -import com.SushiAPI.SushiAPI.main; -import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.models.extra.Extra; -import com.SushiAPI.SushiAPI.models.rolls.Roll; -import org.json.JSONArray; -import org.json.JSONObject; - -import java.util.ArrayList; - -public class CartService { - - public static void addItem(Item item) { - main.Cart.add(item); - } - - public static void removeItem(Item item) { - main.Cart.remove(item); - } - - public static JSONArray allItemsAsJson() { - JSONArray array = new JSONArray(); - - for (Item item : main.Cart) { - JSONObject obj = new JSONObject(); - obj.put("name", item.getName()); - obj.put("price", item.getPrice()); - - // Convert List extras to JSONArray - JSONArray extrasArray = new JSONArray(); - if (item.getExtras() != null) { - for (Object extra : item.getExtras()) { - extrasArray.put(extra); - } - } - obj.put("extras", extrasArray); - - array.put(obj); - } - - return array; - } - - public static double totalAmount() { // get Total Amount - double totalAmount = 0; - for (int i = 0; i < main.Cart.size(); i++) { - totalAmount += main.Cart.get(i).getPrice(); - } - return totalAmount; - } - - public static double totalAmount(double tip) { // get total Amount Plus TIP - double totalAmount = 0; - for (int i = 0; i < main.Cart.size(); i++) { - totalAmount += main.Cart.get(i).getPrice(); - } - return totalAmount + tip; - } - - public static boolean pay() { - boolean anyFoodItems = false; - for (int i = 0; i < main.Cart.size(); i++) { - if(main.Cart.get(i).getCategory().toLowerCase() != "drink" || main.Cart.get(i).getCategory().toLowerCase() != "appetizer") { // if not a drink or appetizer - anyFoodItems = true; - } - } - - if(!anyFoodItems) return false; // no food items - - main.ReceiptItems.addAll(main.Cart); // add to paid items - ReceiptService.saveItems(); - main.Cart.clear(); // remove everything from cart - return true; - } - - public static ArrayList searchItems(String searchQuery) { - ArrayList resultList = new ArrayList<>(); - for (int i = 0; i < main.Cart.size(); i++) { - if(main.Cart.get(i).getName().contains(searchQuery)) { - resultList.add(main.Cart.get(i)); - } - } - return resultList; - } - - public static void deleteAllItems() { - main.Cart.clear(); - } -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/utils/MenuServices.java b/src/main/java/com/SushiAPI/SushiAPI/utils/MenuServices.java deleted file mode 100644 index b2102b6..0000000 --- a/src/main/java/com/SushiAPI/SushiAPI/utils/MenuServices.java +++ /dev/null @@ -1,51 +0,0 @@ -package com.SushiAPI.SushiAPI.utils; - -import com.SushiAPI.SushiAPI.main; -import com.SushiAPI.SushiAPI.models.Item; - -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Map; - -public class MenuServices implements com.SushiAPI.SushiAPI.models.menu { - - public static HashMap> getMenuItems() { - HashMap> menuItems = new HashMap<>(); - int index = 0; - for(Item item : main.items) { - String category = item.getCategory(); - if(!menuItems.containsKey(category)) { - menuItems.put(category, new ArrayList<>()); - } - item.setId(index); - index++; - menuItems.get(category).add(item); - } - return menuItems; - } - - public ArrayList getMenuItems(String filter) { - ArrayList filterItems = filter(filter); - return filterItems; - } - - - public ArrayList filter(String filter) { // drink, hot, raw, item name -// main.items.stream().filter(item -> { -// boolean drink = item.isDrink() == filter.equalsIgnoreCase("drink"); -// boolean raw = item.isRaw() == filter.equalsIgnoreCase("raw"); -// -// return drink; -// }).map(item -> { -// if(item.getName().equalsIgnoreCase(filter)) { -// return item; -// } -// return null; -// }); - - return new ArrayList<>(); - } - - -} diff --git a/src/main/java/com/SushiAPI/SushiAPI/utils/Services/CartService.java b/src/main/java/com/SushiAPI/SushiAPI/utils/Services/CartService.java new file mode 100644 index 0000000..6b8837e --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/utils/Services/CartService.java @@ -0,0 +1,5 @@ +package com.SushiAPI.SushiAPI.utils.Services; + +public class CartService { + +} diff --git a/src/main/java/com/SushiAPI/SushiAPI/utils/ReceiptService.java b/src/main/java/com/SushiAPI/SushiAPI/utils/Services/ReceiptService.java similarity index 75% rename from src/main/java/com/SushiAPI/SushiAPI/utils/ReceiptService.java rename to src/main/java/com/SushiAPI/SushiAPI/utils/Services/ReceiptService.java index 665d714..9852d8a 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/utils/ReceiptService.java +++ b/src/main/java/com/SushiAPI/SushiAPI/utils/Services/ReceiptService.java @@ -1,24 +1,14 @@ -package com.SushiAPI.SushiAPI.utils; +package com.SushiAPI.SushiAPI.utils.Services; import com.SushiAPI.SushiAPI.main; -import com.SushiAPI.SushiAPI.models.Item; +import com.SushiAPI.SushiAPI.utils.Files; import java.text.SimpleDateFormat; -import java.util.ArrayList; import java.util.Date; -import java.util.HashMap; import java.util.concurrent.atomic.AtomicReference; public class ReceiptService { - public static ArrayList> generateReceipt() { - ArrayList> items = new ArrayList<>(); - main.ReceiptItems.forEach(item -> { - HashMap itemHashMap = new HashMap<>(); - itemHashMap.put("testing", item); - items.add(itemHashMap); - }); - return items; - } + public static void saveItems() { Date now = new Date(); @@ -36,8 +26,8 @@ public static void saveItems() { stringBuilder.append("Time: ").append(time).append("\n"); stringBuilder.append("=========ORDER ITEMS================").append("\n"); main.ReceiptItems.forEach(item -> { - stringBuilder.append(item.getName()).append("\t\t\t\t$").append(item.getPrice()).append("\n"); - Subtotal.updateAndGet(v -> new Double((double) (v + item.getPrice()))); +// stringBuilder.append(item.getName()).append("\t\t\t\t$").append(item.getPrice()).append("\n"); +// Subtotal.updateAndGet(v -> new Double((double) (v + item.getPrice()))); }); double originalNumber = Subtotal.get(); diff --git a/src/main/java/com/SushiAPI/SushiAPI/utils/menu.java b/src/main/java/com/SushiAPI/SushiAPI/utils/menu.java index 4a99e73..c772413 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/utils/menu.java +++ b/src/main/java/com/SushiAPI/SushiAPI/utils/menu.java @@ -1,56 +1,115 @@ package com.SushiAPI.SushiAPI.utils; import com.SushiAPI.SushiAPI.main; -import com.SushiAPI.SushiAPI.models.Item; -import com.SushiAPI.SushiAPI.models.appetizers.appetizers; -import com.SushiAPI.SushiAPI.models.drinks.Drink; -import com.SushiAPI.SushiAPI.models.rolls.Roll; +import com.SushiAPI.SushiAPI.models.Appetizer.Seafoods; +import com.SushiAPI.SushiAPI.models.Appetizer.Traditional; +import com.SushiAPI.SushiAPI.models.Drinks.Alcohol; +import com.SushiAPI.SushiAPI.models.Drinks.Soda; +import com.SushiAPI.SushiAPI.models.Sushi.Nigiri; +import com.SushiAPI.SushiAPI.models.Sushi.Roll; + +import java.util.Arrays; import static com.SushiAPI.SushiAPI.utils.Files.readFile; public class menu { + // Load items from CSV to ArrayList public static void loadMenu() { StringBuilder resultDrinks = readFile("files/menus/Drinks.csv"); StringBuilder resultRolls = readFile("files/menus/Rolls.csv"); StringBuilder resultAppetizers = readFile("files/menus/Appetizers.csv"); + StringBuilder resultNigiri = readFile("files/menus/Nigiri.csv"); // load drinks + // name|price|size|hot|alcohol String resultDrinksString = resultDrinks.toString(); String[] drinkLines = resultDrinksString.split("\n"); for(String line : drinkLines) { - if(line.trim().isEmpty()) continue; - String[] fields = line.split("\\|"); - String name = fields[0].trim(); - double price = Double.parseDouble(fields[1].trim()); - int quantity = Integer.parseInt(fields[2].trim()); - boolean hot = Boolean.parseBoolean(fields[3].trim()); - main.items.add(new Drink(name, price, hot, "")); + String[] lineSplit = line.split("\\|"); // split data + // grab needed parameters + String drinkName = lineSplit[0]; + double drinkPrice = Double.parseDouble(lineSplit[1]); + int drinkSize = Integer.parseInt(lineSplit[2]); + boolean drinkIsHot = Boolean.parseBoolean(lineSplit[3]); + boolean drinkIsAlcohol = Boolean.parseBoolean(lineSplit[4]); + + if(drinkIsAlcohol) { // if alcohol + main.items.add(new Alcohol(drinkName, drinkPrice, drinkIsHot, drinkIsAlcohol, null, null)); + } else { + main.items.add(new Soda(drinkName, drinkPrice, drinkIsHot, drinkIsAlcohol, null, null)); + } } // load rolls - // name|price|available|ingredients|raw + // name|price|SpiceLevel|ingredients|raw|extra String resultRollsString = resultRolls.toString(); String[] RollsLines = resultRollsString.split("\n"); for(String line : RollsLines) { - if(line.trim().isEmpty()) continue; - String[] fields = line.split("\\|"); - String name = fields[0].trim(); - double price = Double.parseDouble(fields[1].trim()); - String ingredients = fields[3].trim(); - boolean raw = Boolean.parseBoolean(fields[4].trim()); - main.items.add(new Roll(name, price, false, false, false, raw, ingredients, null)); + String[] lineSplit = line.split("\\|"); // split data + // grab needed parameters + String rollName = lineSplit[0]; + double rollPrice = Double.parseDouble(lineSplit[1]); + int rollSpice = Integer.parseInt(lineSplit[2]); + String[] rollIngredients = lineSplit[3].split(", "); + boolean rollRaw = Boolean.parseBoolean(lineSplit[4]); + String[] rollExtra = lineSplit[5].split(","); + + main.items.add( + new Roll(rollName, rollPrice, rollSpice, Arrays.asList(rollIngredients), Arrays.asList(rollExtra)) + ); + + + } + // load Nigiri + // name|price|SpiceLevel|ingredients|raw|extra + String resultNigiriString = resultNigiri.toString(); + String[] nigiriLines = resultNigiriString.split("\n"); + for(String line : nigiriLines) { + String[] lineSplit = line.split("\\|"); // split data + // grab needed parameters + String nigiriName = lineSplit[0]; + double nigiriPrice = Double.parseDouble(lineSplit[1]); + int nigiriSpice = Integer.parseInt(lineSplit[2]); + String[] nigiriIngredients = lineSplit[3].split(", "); + boolean nigiriRaw = Boolean.parseBoolean(lineSplit[4]); + String[] nigiriExtra = lineSplit[5].split(","); + + main.items.add( + new Nigiri(nigiriName, nigiriPrice, nigiriSpice, Arrays.asList(nigiriIngredients), Arrays.asList(nigiriExtra)) + ); + + } // load appetizers - // name|price|ingredients|hot + // name|price|ingredients|hot|type String resultAppetizersString = resultAppetizers.toString(); String[] AppetizersLines = resultAppetizersString.split("\n"); for(String line : AppetizersLines) { - if(line.trim().isEmpty()) continue; - String[] fields = line.split("\\|"); - String name = fields[0].trim(); - double price = Double.parseDouble(fields[1].trim()); - String ingredients = fields[2].trim(); - boolean hot = Boolean.parseBoolean(fields[3].trim()); - main.items.add(new appetizers(name, price, false, hot, true, false, ingredients, null)); + String[] lineSplit = line.split("\\|"); // split data + + // grab needed parameters + String appetizersName = lineSplit[0]; + double appetizersPrice = Double.parseDouble(lineSplit[1]); + String[] appetizersIngredients = lineSplit[2].split(", "); + boolean appetizersisHot = Boolean.parseBoolean(lineSplit[3]); + String appetizersType = lineSplit[4]; + + /* + types: + 0 = Traditional + 1 = Seafood + */ + if(appetizersType.equalsIgnoreCase("0")) { + main.items.add( + new Traditional(appetizersName, appetizersPrice, 0, Arrays.asList(appetizersIngredients), null) + ); + } else if(appetizersType.equalsIgnoreCase("1")) { + main.items.add( + new Seafoods(appetizersName, appetizersPrice, 0, Arrays.asList(appetizersIngredients), null) + ); + } + + + } } } diff --git a/src/test/java/com/SushiAPI/SushiAPI/SushiApiApplicationTests.java b/src/test/java/com/SushiAPI/SushiAPI/SushiApiApplicationTests.java index e0e204d..52397c7 100644 --- a/src/test/java/com/SushiAPI/SushiAPI/SushiApiApplicationTests.java +++ b/src/test/java/com/SushiAPI/SushiAPI/SushiApiApplicationTests.java @@ -1,13 +1,12 @@ package com.SushiAPI.SushiAPI; +import org.junit.jupiter.api.Assertions; import org.junit.jupiter.api.Test; import org.springframework.boot.test.context.SpringBootTest; @SpringBootTest class SushiApiApplicationTests { - @Test - void contextLoads() { - } + } From 3aedf9623e70ab3408c33c9248fa97171626e82d Mon Sep 17 00:00:00 2001 From: Student Date: Thu, 13 Nov 2025 11:33:16 -0800 Subject: [PATCH 03/13] Notes, item descriptions in web page, redo on OOP --- README.md | 6 ++ img_2.png | Bin 0 -> 21368 bytes .../controller/API/Cart/CartController.java | 44 ++++++++++-- .../SushiAPI/models/Appetizer/Appetizer.java | 11 +++ .../SushiAPI/models/Appetizer/Seafoods.java | 10 +++ .../models/Appetizer/Traditional.java | 10 +++ .../SushiAPI/models/Drinks/Alcohol.java | 10 +++ .../SushiAPI/models/Drinks/Drinks.java | 13 ++++ .../SushiAPI/SushiAPI/models/Drinks/Soda.java | 10 +++ .../SushiAPI/models/Sushi/Nigiri.java | 12 +++- .../SushiAPI/SushiAPI/models/Sushi/Roll.java | 10 ++- .../SushiAPI/SushiAPI/models/Sushi/Sushi.java | 11 +++ .../SushiAPI/utils/Services/CartService.java | 68 ++++++++++++++++++ 13 files changed, 208 insertions(+), 7 deletions(-) create mode 100644 img_2.png diff --git a/README.md b/README.md index 5054c88..364db12 100644 --- a/README.md +++ b/README.md @@ -63,3 +63,9 @@ The following code snippet demonstrates a mechanism for **dynamically adjusting ----- ## 🌐 FrontEnd Images: Home page ![img_1.png](img_1.png) + + +----- +## 🧭 API ROUTES +This image demostrates finding an item based on name +![img_2.png](img_2.png) \ No newline at end of file diff --git a/img_2.png b/img_2.png new file mode 100644 index 0000000000000000000000000000000000000000..bb20d071b73c76fa74156810098b9ac504da3030 GIT binary patch literal 21368 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 Q!3OA)p57;FkCC$f3Ie^b getMenu() { return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(CartService.AllItems().toString()); } @PostMapping("/api/cart/add") - public boolean addItem(@RequestBody String addItem) { + public ResponseEntity addItem(@RequestBody String addItem) { JSONObject jsonObject = new JSONObject(addItem); - return true; + JSONArray extras = jsonObject.getJSONArray("extras"); + MenuItem result = CartService.addItemByName(jsonObject.getString("name")); + if(result != null) { + if(!extras.isEmpty()) { + List extrasList = IntStream.range(0, extras.length()).mapToObj(extras::getString).toList(); + if(result.getCategory().equalsIgnoreCase("soda")) { + result = new Soda(result.getName(), result.getPrice(), result.getCold(), result.isAlcohol(), result.getIngredients(), extrasList); + } else if(result.getCategory().equalsIgnoreCase("Alcohol")) { + result = new Alcohol(result.getName(), result.getPrice(), result.getCold(), result.isAlcohol(), result.getIngredients(), extrasList); + } else if(result.getCategory().equalsIgnoreCase("Seafood Appetizer")) { + result = new Seafoods(result.getName(), result.getPrice(), result.getSpiceLevel(), result.getIngredients(), extrasList); + } else if(result.getCategory().equalsIgnoreCase("Traditional Appetizer")) { + result = new Traditional(result.getName(), result.getPrice(), result.getSpiceLevel(), result.getIngredients(), extrasList); + } else if(result.getCategory().equalsIgnoreCase("roll")) { + result = new Roll(result.getName(), result.getPrice(), result.getSpiceLevel(), result.getIngredients(), extrasList); + } else if(result.getCategory().equalsIgnoreCase("nigiri")) { + result = new Nigiri(result.getName(), result.getPrice(), result.getSpiceLevel(), result.getIngredients(), extrasList); + } + } + main.Cart.add(result); + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(result.toString()); + } + return ResponseEntity.ok().contentType(MediaType.APPLICATION_JSON).body(result.toString()); } @PostMapping("/api/cart/remove") diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Appetizer.java b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Appetizer.java index 962e44a..b3dff0d 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Appetizer.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Appetizer.java @@ -29,4 +29,15 @@ public Appetizer(String name, double price, int spiceLevel, String category, Lis @Override public List getExtras() { return this.extras; } @Override public boolean isDrink() {return false;} + @Override + public String toString() { + return "Appetizer{" + + "name='" + name + '\'' + + ", price=" + price + + ", spiceLevel=" + spiceLevel + + ", ingredients=" + ingredients + + ", extras=" + extras + + ", category='" + category + '\'' + + '}'; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java index e80f5c0..f5e523c 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java @@ -49,4 +49,14 @@ public boolean getCold() { public boolean isAlcohol() { return false; } + + @Override + public String toString() { + return "Seafoods{" + + "name='" + name + '\'' + + ", price=" + price + + ", ingredients=" + ingredients + + ", extras=" + extras + + '}'; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java index d19944e..461f580 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java @@ -49,4 +49,14 @@ public boolean getCold() { public boolean isAlcohol() { return false; } + + @Override + public String toString() { + return "Traditional{" + + "name='" + name + '\'' + + ", price=" + price + + ", ingredients=" + ingredients + + ", extras=" + extras + + '}'; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java index f39634f..b6b58a4 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java @@ -54,4 +54,14 @@ public boolean getCold() { public boolean isAlcohol() { return false; } + + @Override + public String toString() { + return "Alcohol{" + + "name='" + name + '\'' + + ", price=" + price + + ", ingredients=" + ingredients + + ", extras=" + extras + + '}'; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Drinks.java b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Drinks.java index eceef90..3848550 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Drinks.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Drinks.java @@ -34,4 +34,17 @@ public Drinks(String name, double price, boolean isCold, boolean isAlcohol, Stri public boolean isAlcohol() { return isAlcohol; } + + @Override + public String toString() { + return "Drinks{" + + "name='" + name + '\'' + + ", price=" + price + + ", isCold=" + isCold + + ", ingredients=" + ingredients + + ", extras=" + extras + + ", category='" + category + '\'' + + ", isAlcohol=" + isAlcohol + + '}'; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java index 8c5e233..216afbd 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java @@ -54,4 +54,14 @@ public boolean getCold() { public boolean isAlcohol() { return false; } + + @Override + public String toString() { + return "Soda{" + + "name='" + name + '\'' + + ", price=" + price + + ", ingredients=" + ingredients + + ", extras=" + extras + + '}'; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java index f54c1e1..daed583 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java @@ -37,7 +37,7 @@ public double getPrice() { @Override public String getCategory() { - return "roll"; + return "Nigiri"; } @Override @@ -49,4 +49,14 @@ public boolean getCold() { public boolean isAlcohol() { return false; } + + @Override + public String toString() { + return "Nigiri{" + + "name='" + name + '\'' + + ", price=" + price + + ", ingredients=" + ingredients + + ", extras=" + extras + + '}'; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java index 8731638..c84838e 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java @@ -40,5 +40,13 @@ public boolean isAlcohol() { return false; } - + @Override + public String toString() { + return "Roll{" + + "name='" + name + '\'' + + ", price=" + price + + ", ingredients=" + ingredients + + ", extras=" + extras + + '}'; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java index cb97771..5749390 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java @@ -29,4 +29,15 @@ public Sushi(String name, double price, int spiceLevel, String category, List getExtras() { return this.extras; } @Override public boolean isDrink() {return false;} + @Override + public String toString() { + return "Sushi{" + + "name='" + name + '\'' + + ", price=" + price + + ", spiceLevel=" + spiceLevel + + ", ingredients=" + ingredients + + ", extras=" + extras + + ", category='" + category + '\'' + + '}'; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/utils/Services/CartService.java b/src/main/java/com/SushiAPI/SushiAPI/utils/Services/CartService.java index 6b8837e..fb360ac 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/utils/Services/CartService.java +++ b/src/main/java/com/SushiAPI/SushiAPI/utils/Services/CartService.java @@ -1,5 +1,73 @@ package com.SushiAPI.SushiAPI.utils.Services; +import com.SushiAPI.SushiAPI.main; +import com.SushiAPI.SushiAPI.models.MenuItem; +import com.SushiAPI.SushiAPI.models.Sushi.Roll; +import org.json.JSONArray; +import org.json.JSONObject; + public class CartService { + public static MenuItem addItemByName(String name) { + return main.items.stream().filter(product -> product.getName().toLowerCase().startsWith(name.strip())).findFirst().orElse(null); // filter though + } + public static void addItemByItem(MenuItem item) { + main.Cart.add(item); + } + + public static boolean removeItem(MenuItem item) { + if(main.Cart.contains(item)) { + main.Cart.remove(item); + return true; + } + return false; + } + + public static double totalAmount() { + double totalAmount = 0; + for (int i = 0; i < main.Cart.size(); i++) { + totalAmount += main.Cart.get(i).getPrice(); + } + return totalAmount; + } + + public static boolean pay() { + boolean anyFoodItems = false; + for (int i = 0; i < main.Cart.size(); i++) { + if(!main.Cart.get(i).getCategory().equalsIgnoreCase("drink") || !main.Cart.get(i).getCategory().equalsIgnoreCase("appetizer")) { // if not a drink or appetizer + anyFoodItems = true; + } + } + + if(!anyFoodItems) return false; + + main.ReceiptItems.addAll(main.Cart); // move to receipts; + // generate receipt here + // TODO: add generate receipt + // ReceiptService.SaveItems(); + main.Cart.clear(); + return true; + } + + public static JSONArray AllItems() { + JSONArray array = new JSONArray(); + for(MenuItem item : main.Cart) { + JSONObject obj = new JSONObject(); // create new Map style + obj.put("name", item.getName()); + obj.put("price", item.getPrice()); + obj.put("category", item.getCategory()); + obj.put("isCold", item.getCold()); + obj.put("SpiceLevel", item.getSpiceLevel()); + obj.put("Ingredients", item.getIngredients()); + JSONArray extrasArray = new JSONArray(); + if (item.getExtras() != null) { + for (Object extra : item.getExtras()) { + extrasArray.put(extra); + } + } + obj.put("extras", extrasArray); + array.put(obj); + } + return array; + } } From 2de6b3c4b47b24648de24f6cbfae7dceb65f909a Mon Sep 17 00:00:00 2001 From: Student Date: Thu, 13 Nov 2025 12:09:52 -0800 Subject: [PATCH 04/13] Notes, item descriptions in web page, redo on OOP --- files/menus/Appetizers.csv | 3 +- files/menus/Drinks.csv | 1 + .../controller/API/Menu/MenuController.java | 16 ++++++--- .../SushiAPI/models/Appetizer/Seafoods.java | 12 ++++++- .../models/Appetizer/Traditional.java | 12 ++++++- .../SushiAPI/models/Drinks/Alcohol.java | 12 ++++++- .../SushiAPI/SushiAPI/models/Drinks/Soda.java | 12 ++++++- .../SushiAPI/SushiAPI/models/MenuItem.java | 3 +- .../SushiAPI/models/Sushi/Nigiri.java | 9 ++++- .../SushiAPI/SushiAPI/models/Sushi/Roll.java | 9 ++++- .../SushiAPI/SushiAPI/models/Sushi/Sushi.java | 10 ++++++ .../SushiAPI/utils/Services/MenuService.java | 26 ++++++++++++++ src/main/resources/templates/index.html | 35 ++++++++++++++----- 13 files changed, 140 insertions(+), 20 deletions(-) create mode 100644 src/main/java/com/SushiAPI/SushiAPI/utils/Services/MenuService.java diff --git a/files/menus/Appetizers.csv b/files/menus/Appetizers.csv index 1c9df58..94e5233 100644 --- a/files/menus/Appetizers.csv +++ b/files/menus/Appetizers.csv @@ -1,4 +1,5 @@ name|price|ingredients|hot|type Edamame|3.95|steamed Japanese soy bean W/ salt|false|0 Harumaki (4pcs)|3.95|Deep-fried japanese spring rolls|true|0 -Gyoza (6pcs)|3.95|Pan fried Japanese dumpling|true|0 \ No newline at end of file +Gyoza (6pcs)|3.95|Pan fried Japanese dumpling|true|0 +Sunomono|10|Vinegary salad, octopus or shimp|false|1 \ No newline at end of file diff --git a/files/menus/Drinks.csv b/files/menus/Drinks.csv index 8b810c7..d2c7ac6 100644 --- a/files/menus/Drinks.csv +++ b/files/menus/Drinks.csv @@ -4,3 +4,4 @@ Soda|2.95|12|false|false Sparking Soda|14|5|false|false Orange Juice|12|5|false|false Apple Juice|12|5|false|false +Sake|12|5|false|true diff --git a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java index 6f5cb6b..de1a5e1 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java +++ b/src/main/java/com/SushiAPI/SushiAPI/controller/API/Menu/MenuController.java @@ -1,17 +1,25 @@ package com.SushiAPI.SushiAPI.controller.API.Menu; +import com.SushiAPI.SushiAPI.models.MenuItem; +import com.SushiAPI.SushiAPI.utils.Services.MenuService; +import org.springframework.http.HttpStatus; +import org.springframework.http.ResponseEntity; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; +import java.awt.*; +import java.util.ArrayList; +import java.util.HashMap; + @RestController public class MenuController { - @GetMapping("/api/menu") // grab data from CSV - public void getMenu() { - return; + @GetMapping("/api/menu") + public ResponseEntity>> getMenu() { + HashMap> items = MenuService.getMenuItems(); + return new ResponseEntity>>(items, HttpStatus.OK); } - @GetMapping("/api/menu/filter/") // api/menu/filter?search public void searchItem(@RequestParam(required=true, defaultValue="") String searchQuery) { return; diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java index f5e523c..7836c8b 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Seafoods.java @@ -7,7 +7,7 @@ public class Seafoods extends Appetizer{ private double price; private List ingredients; private List extras; - + private int itemId; public Seafoods(String name, double price, int spiceLevel, List ingredients, List extras) { super(name + " Seafood Appetizer", price, spiceLevel, "Appetizer", ingredients, extras); this.name = name; @@ -50,6 +50,16 @@ public boolean isAlcohol() { return false; } + @Override + public void setId(int id) { + id = itemId; + } + + @Override + public int getId() { + return 0; + } + @Override public String toString() { return "Seafoods{" + diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java index 461f580..d484248 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Appetizer/Traditional.java @@ -7,7 +7,7 @@ public class Traditional extends Appetizer{ private double price; private List ingredients; private List extras; - + private int id; public Traditional(String name, double price, int spiceLevel, List ingredients, List extras) { super(name + " Traditional Appetizer", price, spiceLevel, "Appetizer", ingredients, extras); this.name = name; @@ -50,6 +50,16 @@ public boolean isAlcohol() { return false; } + @Override + public void setId(int itemId) { + itemId = id; + } + + @Override + public int getId() { + return 0; + } + @Override public String toString() { return "Traditional{" + diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java index b6b58a4..d793fd4 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Alcohol.java @@ -7,7 +7,7 @@ public class Alcohol extends Drinks{ private double price; private List ingredients; private List extras; - + private int id; public Alcohol(String name, double price, boolean isCold, boolean isAlcohol, List ingredients, List extras) { super(name + " Alcohol", price, isCold, true, "Alcohol", ingredients, extras); this.name = name; @@ -55,6 +55,16 @@ public boolean isAlcohol() { return false; } + @Override + public void setId(int itemId) { + itemId = id; + } + + @Override + public int getId() { + return 0; + } + @Override public String toString() { return "Alcohol{" + diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java index 216afbd..4f41677 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Drinks/Soda.java @@ -7,7 +7,7 @@ public class Soda extends Drinks{ private double price; private List ingredients; private List extras; - + private int id; public Soda(String name, double price, boolean isCold, boolean isAlcohol, List ingredients, List extras) { super(name + " Soda", price, isCold, false, "Soda", ingredients, extras); this.name = name; @@ -55,6 +55,16 @@ public boolean isAlcohol() { return false; } + @Override + public void setId(int itemId) { + itemId = id; + } + + @Override + public int getId() { + return 0; + } + @Override public String toString() { return "Soda{" + diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/MenuItem.java b/src/main/java/com/SushiAPI/SushiAPI/models/MenuItem.java index f2cbed4..8d2566a 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/MenuItem.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/MenuItem.java @@ -15,5 +15,6 @@ public interface MenuItem { boolean isDrink(); boolean getCold(); boolean isAlcohol(); - + void setId(int id); + int getId(); } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java index daed583..a9a2540 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Nigiri.java @@ -7,7 +7,7 @@ public class Nigiri extends Sushi{ private double price; private List ingredients; private List extras; - + private int id; public Nigiri(String name, double price, int spiceLevel, List ingredients, List extras) { super(name + " Nigiri", price, spiceLevel, "Nigiri", ingredients, extras); this.name = name; @@ -50,6 +50,11 @@ public boolean isAlcohol() { return false; } + @Override + public void setId(int itemId) { + itemId = id; + } + @Override public String toString() { return "Nigiri{" + @@ -59,4 +64,6 @@ public String toString() { ", extras=" + extras + '}'; } + + } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java index c84838e..904b5c8 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Roll.java @@ -7,7 +7,7 @@ public class Roll extends Sushi{ private double price; private List ingredients; private List extras; - + private int id; public Roll(String name, double price, int spiceLevel, List ingredients, List extras) { super(name + " roll", price, spiceLevel, "roll", ingredients, extras); this.name = name; @@ -40,6 +40,11 @@ public boolean isAlcohol() { return false; } + @Override + public void setId(int itemId) { + itemId = id; + } + @Override public String toString() { return "Roll{" + @@ -49,4 +54,6 @@ public String toString() { ", extras=" + extras + '}'; } + + } diff --git a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java index 5749390..a3e4ecf 100644 --- a/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java +++ b/src/main/java/com/SushiAPI/SushiAPI/models/Sushi/Sushi.java @@ -12,6 +12,7 @@ public abstract class Sushi implements MenuItem { private List ingredients = new ArrayList<>(); private List extras = new ArrayList<>(); private String category; + private int id; public Sushi(String name, double price, int spiceLevel, String category, List ingredients, List extras) { this.name = name; @@ -40,4 +41,13 @@ public String toString() { ", category='" + category + '\'' + '}'; } + + @Override + public int getId() { + return id; + } + + public void setId() { + this.id = id; + } } diff --git a/src/main/java/com/SushiAPI/SushiAPI/utils/Services/MenuService.java b/src/main/java/com/SushiAPI/SushiAPI/utils/Services/MenuService.java new file mode 100644 index 0000000..de185e0 --- /dev/null +++ b/src/main/java/com/SushiAPI/SushiAPI/utils/Services/MenuService.java @@ -0,0 +1,26 @@ +package com.SushiAPI.SushiAPI.utils.Services; + +import com.SushiAPI.SushiAPI.main; +import com.SushiAPI.SushiAPI.models.MenuItem; +import com.SushiAPI.SushiAPI.utils.menu; + +import java.util.ArrayList; +import java.util.HashMap; + +public class MenuService { + public static HashMap> getMenuItems() { + HashMap> menuItems = new HashMap<>(); + int index = 0; + for(MenuItem item : main.items) { + String category = item.getCategory(); + System.out.println(category); + if(!menuItems.containsKey(category)) { + menuItems.put(category, new ArrayList<>()); + } + item.setId(index); + index++; + menuItems.get(category).add(item); + } + return menuItems; + } +} diff --git a/src/main/resources/templates/index.html b/src/main/resources/templates/index.html index 7130a6d..5702ff5 100644 --- a/src/main/resources/templates/index.html +++ b/src/main/resources/templates/index.html @@ -618,15 +618,26 @@

Japanese Cuisine

Rolls

- +
+

Nigiri

+ +
-

Drinks

+

Drinks - Non-Alcohol

+
+

Drinks - Alcohol

+ +
-

Appetizers

- +

Appetizers - Non-Traditional

+ +
+
+

Appetizers - Traditional

+
@@ -751,14 +762,22 @@

Add Extras

// Render Menu Items function renderMenu() { - renderCategory('Roll', 'rollGrid'); - renderCategory('Drink', 'drinkGrid'); - renderCategory("Appetizer", "appetizerGrid") + + renderCategory('roll', 'rollGrid'); + renderCategory('Soda', 'drinkGrid'); + renderCategory('Nigiri', 'nigiriGrid'); + renderCategory('Traditional Appetizer', 'TraditionalAppetizerGrid'); + renderCategory('Seafood Appetizer', 'SeafoodAppetizerGrid'); + renderCategory('Alcohol', 'AlcoholDrinkGrid'); + + + // renderCategory("Appetizer", "appetizerGrid") } function renderCategory(category, gridId) { const grid = document.getElementById(gridId); - const items = menuData[category] || []; + const items = menuData[category.trim()] || []; + grid.innerHTML = items.map(item => `