diff --git a/.idea/.gitignore b/.idea/.gitignore
new file mode 100644
index 0000000..ab1f416
--- /dev/null
+++ b/.idea/.gitignore
@@ -0,0 +1,10 @@
+# Default ignored files
+/shelf/
+/workspace.xml
+# Ignored default folder with query files
+/queries/
+# Datasource local storage ignored files
+/dataSources/
+/dataSources.local.xml
+# Editor-based HTTP Client requests
+/httpRequests/
diff --git a/.idea/compiler.xml b/.idea/compiler.xml
new file mode 100644
index 0000000..bf2c501
--- /dev/null
+++ b/.idea/compiler.xml
@@ -0,0 +1,13 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/dataSources.xml b/.idea/dataSources.xml
new file mode 100644
index 0000000..f5d4b31
--- /dev/null
+++ b/.idea/dataSources.xml
@@ -0,0 +1,17 @@
+
+
+
+
+ postgresql
+ true
+ org.postgresql.Driver
+ jdbc:postgresql://localhost:5432/postgres
+
+
+
+
+
+ $ProjectFileDir$
+
+
+
\ No newline at end of file
diff --git a/.idea/encodings.xml b/.idea/encodings.xml
new file mode 100644
index 0000000..aa00ffa
--- /dev/null
+++ b/.idea/encodings.xml
@@ -0,0 +1,7 @@
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/jarRepositories.xml b/.idea/jarRepositories.xml
new file mode 100644
index 0000000..a9076af
--- /dev/null
+++ b/.idea/jarRepositories.xml
@@ -0,0 +1,20 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/misc.xml b/.idea/misc.xml
new file mode 100644
index 0000000..f6a588b
--- /dev/null
+++ b/.idea/misc.xml
@@ -0,0 +1,12 @@
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/sqldialects.xml b/.idea/sqldialects.xml
new file mode 100644
index 0000000..1df8135
--- /dev/null
+++ b/.idea/sqldialects.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/.idea/vcs.xml b/.idea/vcs.xml
new file mode 100644
index 0000000..35eb1dd
--- /dev/null
+++ b/.idea/vcs.xml
@@ -0,0 +1,6 @@
+
+
+
+
+
+
\ No newline at end of file
diff --git a/database.sql b/database.sql
index 2169346..b5bd1d0 100644
--- a/database.sql
+++ b/database.sql
@@ -1,141 +1,46 @@
--- Restaurant Database Management System
---
--- Instructions:
--- 1. Create all required tables.
--- 2. Design appropriate PRIMARY KEY and FOREIGN KEY relationships.
--- 3. Add suitable constraints based on the requirements.
--- 4. Insert initial mock data.
--- 5. Insert at least 3 menu items.
--- 6. The script should be executable from start to finish without errors.
+CREATE TABLE users (
+ id SERIAL PRIMARY KEY,
+ username VARCHAR(20) NOT NULL UNIQUE,
+ password VARCHAR(20) NOT NULL,
+ email VARCHAR(100) UNIQUE
+);
+CREATE TABLE menu_items(
+ id SERIAL PRIMARY KEY,
+ name VARCHAR(50) NOT NULL ,
+ description TEXT,
+ price NUMERIC(10, 2) NOT NULL CHECK ( price>0 ),
+ category VARCHAR(50)
+);
--- =======================================================
--- USER TABLE
--- =======================================================
---
--- Represents customers using the system.
---
--- Required information:
--- - Unique identifier
--- - Username
--- - Password
--- - Email (optional)
---
--- Requirements:
--- - Each user must have a unique identifier.
--- - Usernames must be unique.
--- - Username and password are required.
--- - Passwords should not be stored in plain text.
---
--- CREATE TABLE ...
+CREATE TABLE orders(
+ id SERIAL PRIMARY KEY,
+ user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE,
+ created_at TIMESTAMP NOT NULL,
+ total_price NUMERIC(10, 2) NOT NULL CHECK (total_price >= 0)
+
+);
-
--- =======================================================
--- MENU ITEM TABLE
--- =======================================================
---
--- Represents available food and drink items.
---
--- Required information:
--- - Unique identifier
--- - Name
--- - Description (optional)
--- - Price
--- - Category (optional)
---
--- Requirements:
--- - Each menu item must have a unique identifier.
--- - Name is required.
--- - Price must always be positive.
---
--- CREATE TABLE ...
+CREATE TABLE order_detail(
+ id SERIAL PRIMARY KEY,
+ order_id INTEGER NOT NULL REFERENCES orders(id) ON DELETE CASCADE,
+ menu_item_id INTEGER NOT NULL REFERENCES menu_items(id),
+ quantity INTEGER NOT NULL CHECK (quantity > 0),
+ price NUMERIC(10, 2) NOT NULL CHECK (price > 0)
+);
+INSERT INTO menu_items (name, description, price, category)
+VALUES
+ ('Margherita Classica', 'Tomato sauce, fresh mozzarella, and basil on a crispy thin crust', 16.00, 'Pizza'),
+ ('Smoked BBQ Bacon Burger', 'Angus beef with cheddar, bacon, onion rings, and BBQ sauce on a brioche bun.', 14.50, 'Burger'),
+ ('Truffle Mushroom Fettuccine', 'Creamy fettuccine with mushrooms, Parmesan, and a touch of truffle oil.', 18.00, 'Pasta'),
+ ('Cola', 'Cold soft drink', 2.50, 'Drink');
--- =======================================================
--- ORDER TABLE
--- =======================================================
--
--- Represents orders placed by customers.
---
--- Required information:
--- - Unique identifier
--- - Reference to customer
--- - Creation date and time
--- - Total price
---
--- Requirements:
--- - Each order must belong to exactly one user.
--- - A user can have multiple orders.
--- - The relationship between User and Order must be implemented.
---
--- Note:
--- Avoid using reserved SQL keywords as table names.
--- Consider using a name such as "orders" or "customer_orders".
---
--- CREATE TABLE ...
-
-
-
--- =======================================================
--- ORDER DETAIL TABLE
--- =======================================================
---
--- Represents items inside an order.
---
--- Required information:
--- - Unique identifier
--- - Reference to an order
--- - Reference to a menu item
--- - Quantity
--- - Item price at purchase time
---
--- Requirements:
--- - Each detail record must belong to one order.
--- - Each detail record must reference one menu item.
--- - Quantity must always be greater than zero.
--- - Store the item's price at the moment of purchase.
---
--- CREATE TABLE ...
-
-
-
--- =======================================================
--- INITIAL MENU DATA
--- =======================================================
---
--- Insert at least 3 food or drink items.
---
--- Example categories:
--- - Pizza
--- - Burger
--- - Pasta
--- - Drink
---
--- INSERT INTO ...
-
-
-
--- =======================================================
--- OPTIONAL TEST DATA
--- =======================================================
---
--- You may insert sample users and orders for testing.
--- This section is optional.
---
--- INSERT INTO ...
-
-
-
--- =======================================================
--- VERIFICATION QUERIES
--- =======================================================
---
--- Uncomment these queries to verify your database.
---
--- SELECT * FROM ...;
--- SELECT * FROM ...;
--- SELECT * FROM ...;
--- SELECT * FROM ...;
\ No newline at end of file
+SELECT * FROM users;
+SELECT * FROM menu_items;
+SELECT * FROM orders;
+SELECT * FROM order_detail;
\ No newline at end of file
diff --git a/src/main/java/dev/database/DatabaseConnection.java b/src/main/java/dev/database/DatabaseConnection.java
index 35f04fb..0ffef26 100644
--- a/src/main/java/dev/database/DatabaseConnection.java
+++ b/src/main/java/dev/database/DatabaseConnection.java
@@ -6,11 +6,11 @@ import java.sql.SQLException;
public class DatabaseConnection {
- private static final String URL = "jdbc:postgresql://localhost:5432/restaurant_db"; // DB Server
+ private static final String URL = "jdbc:postgresql://localhost:5432/postgres"; // DB Server
private static final String USER = "postgres"; // Your Username
- private static final String PASSWORD = "password"; // Your Password
+ private static final String PASSWORD = "1234"; // Your Password
private DatabaseConnection() {
diff --git a/src/main/java/dev/service/MenuService.java b/src/main/java/dev/service/MenuService.java
index 56aed4f..3dc09d0 100644
--- a/src/main/java/dev/service/MenuService.java
+++ b/src/main/java/dev/service/MenuService.java
@@ -17,10 +17,9 @@ public class MenuService {
for ( MenuItem menuItem : items) {
System.out.println(menuItem.getId() + ". " + menuItem.getName() +
- " " + menuItem.getPrice() + " | " + menuItem.getCategory());
- System.out.println(menuItem.getDescription());
+ " " + menuItem.getPrice() + "$ \n" +
+ menuItem.getCategory() + " | " + menuItem.getDescription());
+ System.out.println();
}
-
}
-
}
\ No newline at end of file
diff --git a/src/main/java/dev/service/OrderService.java b/src/main/java/dev/service/OrderService.java
index 508882a..0e2b28e 100644
--- a/src/main/java/dev/service/OrderService.java
+++ b/src/main/java/dev/service/OrderService.java
@@ -85,7 +85,7 @@ public class OrderService {
double totalPrice = 0;
- System.out.println("\n===== RECEIPT =====");
+ System.out.println("\n============ RECEIPT ============");
for (OrderDetail detail : details) {
@@ -97,7 +97,8 @@ public class OrderService {
System.out.println( item.getName() + " | Quantity: " + detail.getQuantity() +
" | Price: " + detail.getPrice() + "$ | Total: " + subtotal + "$");
}
- System.out.println("\nFinal Total: $" + totalPrice);
+ System.out.println("==============================");
+ System.out.println("Final Total: $" + totalPrice);
}
public void showOrderHistory(int userId) {
diff --git a/src/main/java/dev/ui/ConsoleMenu.java b/src/main/java/dev/ui/ConsoleMenu.java
index 663dc0c..a51d3bb 100644
--- a/src/main/java/dev/ui/ConsoleMenu.java
+++ b/src/main/java/dev/ui/ConsoleMenu.java
@@ -1,12 +1,21 @@
package dev.ui;
+import dev.model.User;
+import dev.service.AuthService;
+import dev.service.MenuService;
+import dev.service.OrderService;
+
import java.util.Scanner;
public class ConsoleMenu {
- private final Scanner scanner =
+ private final Scanner in =
new Scanner(System.in);
+ private final AuthService authService = new AuthService();
+ private final MenuService menuService = new MenuService();
+ private final OrderService orderService = new OrderService();
+
public void start() {
while (true) {
@@ -17,16 +26,17 @@ public class ConsoleMenu {
System.out.println("2. Register");
System.out.println("3. Exit");
- int choice = scanner.nextInt();
+ int choice = in.nextInt();
+ in.nextLine();
switch (choice) {
case 1:
- // TODO
+ login();
break;
case 2:
- // TODO
+ register();
break;
case 3:
@@ -41,4 +51,78 @@ public class ConsoleMenu {
}
+
+ public void login() {
+
+ System.out.println("Enter your username: ");
+ String username = in.nextLine();
+
+ System.out.println("Enter your password: ");
+ String password = in.nextLine();
+
+ User user = authService.login(username, password);
+
+ if(user != null) {
+ System.out.println("Welcome back, " + username);
+ showOptions(user);
+ }
+ else System.out.println("Wrong username or password.");
+
+ }
+
+
+ public void register() {
+
+ System.out.println("Enter your username: ");
+ String username = in.nextLine();
+
+ System.out.println("Enter password: ");
+ String password = in.nextLine();
+
+ System.out.println("Enter your email: ");
+ String email = in.nextLine();
+
+ if (authService.register(username, password, email)) {
+ System.out.println("Welcome!");
+ }
+ else System.out.println("Registration failed");
+ }
+
+ public void showOptions(User user) {
+
+ System.out.println("""
+ =======================================
+ \uD83C\uDF7D️ MAIN MENU \uD83C\uDF7D️
+ =======================================""");
+
+
+
+ while (true) {
+
+ System.out.println("1. View Menu\n" +
+ "2. Place a New Order\n" +
+ "3. View Order History \n" +
+ "4. Logout");
+
+ int choice = in.nextInt();
+
+ switch (choice) {
+
+ case 1:
+ menuService.showMenu();
+ break;
+
+ case 2:
+ orderService.placeOrder(user.getId());
+ break;
+
+ case 3:
+ orderService.showOrderHistory(user.getId());
+ break;
+
+ case 4:
+ return;
+ }
+ }
+ }
}
\ No newline at end of file