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