From 4b15eec88b35e83b943df1e29e9565ae06d60bfa Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 17:14:49 +0330 Subject: [PATCH 01/12] add database.sql --- database.sql | 170 +++++++++++++-------------------------------------- 1 file changed, 41 insertions(+), 129 deletions(-) diff --git a/database.sql b/database.sql index 2169346..087e3d2 100644 --- a/database.sql +++ b/database.sql @@ -1,141 +1,53 @@ --- 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. --- ======================================================= --- 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 ... +CREAT TABLE users( + id SERIAL PRIMARY KEY, + username VARCHAR(50) NOT NULL UNIQUE, + password VARCHAR(100) NOT NULL, + email VARCHAR(100) +); --- ======================================================= --- 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 menu_items ( + id SERIAL PRIMARY KEY, + name VARCHAR(100) NOT NULL, + description TEXT, + price NUMERIC(10, 2) NOT NULL CHECK (price > 0), + category VARCHAR(50) +); + + +CREATE TABLE orders ( + id SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP, + total_price NUMERIC(10, 2) NOT NULL CHECK (total_price >= 0) +); --- ======================================================= --- 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 ... +CREATE TABLE order_details ( + 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 + ('Pizza', 'Cheese pizza with tomato sauce', 12.50, 'Pizza'), + ('Burger', 'Beef burger with fries', 9.00, 'Burger'), + ('Pasta', 'Pasta with Alfredo sauce', 11.00, 'Pasta'), + ('Cola', 'Cold soft drink', 2.50, 'Drink'); + +SELECT * FROM users; +SELECT * FROM menu_items; +SELECT * FROM orders; +SELECT * FROM order_details; --- ======================================================= --- 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 -- 2.54.0 From aaa9e075a50faf8993957dec071eb38683c0b180 Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 17:15:34 +0330 Subject: [PATCH 02/12] Database Connection --- src/main/java/dev/database/DatabaseConnection.java | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/database/DatabaseConnection.java b/src/main/java/dev/database/DatabaseConnection.java index da45535..bac84ac 100644 --- a/src/main/java/dev/database/DatabaseConnection.java +++ b/src/main/java/dev/database/DatabaseConnection.java @@ -1,6 +1,7 @@ package dev.database; import java.sql.Connection; +import java.sql.DriverManager; import java.sql.SQLException; public class DatabaseConnection { @@ -9,7 +10,7 @@ public class DatabaseConnection { 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() { @@ -18,10 +19,9 @@ public class DatabaseConnection { public static Connection getConnection() throws SQLException { - // TODO: - // Return a valid PostgreSQL connection + return DriverManager.getConnection(URL, USER, PASSWORD); + - return null; } } \ No newline at end of file -- 2.54.0 From f099fc65384b8930da5435b0184ef0e48f39bb4a Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 17:16:34 +0330 Subject: [PATCH 03/12] Complete Users and UserDao --- src/main/java/dev/dao/UserDao.java | 60 +++++++++++++++++++++++++++--- src/main/java/dev/model/User.java | 31 +++++++++++++++ 2 files changed, 86 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/dao/UserDao.java b/src/main/java/dev/dao/UserDao.java index af08106..43803ba 100644 --- a/src/main/java/dev/dao/UserDao.java +++ b/src/main/java/dev/dao/UserDao.java @@ -1,21 +1,71 @@ package dev.dao; +import dev.database.DatabaseConnection; import dev.model.User; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + public class UserDao { public boolean save(User user) { - // TODO: - // Insert user into database + String sql = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)"; + + try ( + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql) + ) { + + statement.setString(1, user.getUsername()); + statement.setString(2, user.getPassword()); + statement.setString(3, user.getEmail()); + + int rows = statement.executeUpdate(); + + return rows > 0; + + } catch (SQLException e) { + + System.out.println("Error saving user: " + e.getMessage()); + return false; + + } - return false; } public User findByUsername(String username) { - // TODO: - // Find a user by username + String sql = "SELECT id, username, password, email FROM users WHERE username = ?"; + + try ( + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql) + ) { + + statement.setString(1, username); + + ResultSet resultSet = statement.executeQuery(); + + if (resultSet.next()) { + + User user = new User(); + + user.setId(resultSet.getInt("id")); + user.setUsername(resultSet.getString("username")); + user.setPassword(resultSet.getString("password")); + user.setEmail(resultSet.getString("email")); + + return user; + } + + } catch (SQLException e) { + + System.out.println("Error finding user: " + e.getMessage()); + + } return null; } diff --git a/src/main/java/dev/model/User.java b/src/main/java/dev/model/User.java index 0ab60c6..afe56dc 100644 --- a/src/main/java/dev/model/User.java +++ b/src/main/java/dev/model/User.java @@ -10,4 +10,35 @@ public class User { private String email; + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getUsername() { + return username; + } + + public void setUsername(String username) { + this.username = username; + } + + public String getPassword() { + return password; + } + + public void setPassword(String password) { + this.password = password; + } + + public String getEmail() { + return email; + } + + public void setEmail(String email) { + this.email = email; + } } \ No newline at end of file -- 2.54.0 From b962a08296c87157ffb5c019e4033fd7c481f954 Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 17:29:56 +0330 Subject: [PATCH 04/12] modify database.sql --- database.sql | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/database.sql b/database.sql index 087e3d2..18e2a33 100644 --- a/database.sql +++ b/database.sql @@ -1,7 +1,7 @@ -CREAT TABLE users( +CREATE TABLE users( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, password VARCHAR(100) NOT NULL, -- 2.54.0 From 3a205532fba5ef6ebea8c6c882b38b90247c8b71 Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 17:31:06 +0330 Subject: [PATCH 05/12] add MenuItem and MenuItemDao --- src/main/java/dev/dao/MenuItemDao.java | 69 ++++++++++++++++++++++++-- src/main/java/dev/model/MenuItem.java | 43 ++++++++++++++-- 2 files changed, 103 insertions(+), 9 deletions(-) diff --git a/src/main/java/dev/dao/MenuItemDao.java b/src/main/java/dev/dao/MenuItemDao.java index 3bbebe9..1bd48b4 100644 --- a/src/main/java/dev/dao/MenuItemDao.java +++ b/src/main/java/dev/dao/MenuItemDao.java @@ -1,23 +1,82 @@ package dev.dao; +import dev.database.DatabaseConnection; import dev.model.MenuItem; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; public class MenuItemDao { public List findAll() { - // TODO: - // Retrieve all menu items + String sql = "SELECT id, name, description, price, category FROM menu_items"; - return null; + List menuItems = new ArrayList<>(); + + try ( + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql); + ResultSet resultSet = statement.executeQuery() + ) { + + while (resultSet.next()) { + + MenuItem menuItem = new MenuItem(); + + menuItem.setId(resultSet.getInt("id")); + menuItem.setName(resultSet.getString("name")); + menuItem.setDescription(resultSet.getString("description")); + menuItem.setPrice(resultSet.getDouble("price")); + menuItem.setCategory(resultSet.getString("category")); + + menuItems.add(menuItem); + } + + } catch (SQLException e) { + + System.out.println("Error loading menu items: " + e.getMessage()); + + } + + return menuItems; } public MenuItem findById(int id) { - // TODO: - // Find menu item by id + String sql = "SELECT id, name, description, price, category FROM menu_items WHERE id = ?"; + + try ( + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql) + ) { + + statement.setInt(1, id); + + ResultSet resultSet = statement.executeQuery(); + + if (resultSet.next()) { + + MenuItem menuItem = new MenuItem(); + + menuItem.setId(resultSet.getInt("id")); + menuItem.setName(resultSet.getString("name")); + menuItem.setDescription(resultSet.getString("description")); + menuItem.setPrice(resultSet.getDouble("price")); + menuItem.setCategory(resultSet.getString("category")); + + return menuItem; + } + + } catch (SQLException e) { + + System.out.println("Error finding menu item: " + e.getMessage()); + + } return null; } diff --git a/src/main/java/dev/model/MenuItem.java b/src/main/java/dev/model/MenuItem.java index 265ecc1..7a8a6f0 100644 --- a/src/main/java/dev/model/MenuItem.java +++ b/src/main/java/dev/model/MenuItem.java @@ -3,13 +3,48 @@ package dev.model; public class MenuItem { private int id; - private String name; - private String description; - private double price; - private String category; + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + + public String getDescription() { + return description; + } + + public void setDescription(String description) { + this.description = description; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } + + public String getCategory() { + return category; + } + + public void setCategory(String category) { + this.category = category; + } } \ No newline at end of file -- 2.54.0 From 45be56851e2e7f3ce31dbce3cf7389da6f0980a8 Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 17:52:18 +0330 Subject: [PATCH 06/12] Complete Order and OrderDao --- src/main/java/dev/dao/OrderDao.java | 57 ++++++++++++++++++++++++++--- src/main/java/dev/model/Order.java | 31 ++++++++++++++++ 2 files changed, 82 insertions(+), 6 deletions(-) diff --git a/src/main/java/dev/dao/OrderDao.java b/src/main/java/dev/dao/OrderDao.java index 00999a2..5514ce4 100644 --- a/src/main/java/dev/dao/OrderDao.java +++ b/src/main/java/dev/dao/OrderDao.java @@ -1,25 +1,70 @@ package dev.dao; +import dev.database.DatabaseConnection; import dev.model.Order; +import java.sql.*; +import java.util.ArrayList; import java.util.List; public class OrderDao { public int save(Order order) { - // TODO: - // Insert order and return generated id + String sql = "INSERT INTO orders (user_id, total_price) VALUES (?, ?) RETURNING id"; + + try ( + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql) + ) { + + statement.setInt(1, order.getUserId()); + statement.setDouble(2, order.getTotalPrice()); + + ResultSet resultSet = statement.executeQuery(); + + if (resultSet.next()) { + return resultSet.getInt("id"); + } + + } catch (SQLException e) { + System.out.println("Error saving order: " + e.getMessage()); + } return -1; } public List findByUserId(int userId) { - // TODO: - // Retrieve all orders of a user + String sql = "SELECT id, user_id, created_at, total_price FROM orders WHERE user_id = ?"; - return null; + List orders = new ArrayList<>(); + + try ( + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql) + ) { + + statement.setInt(1, userId); + + ResultSet resultSet = statement.executeQuery(); + + while (resultSet.next()) { + + Order order = new Order(); + + order.setId(resultSet.getInt("id")); + order.setUserId(resultSet.getInt("user_id")); + order.setCreatedAt(resultSet.getTimestamp("created_at").toLocalDateTime()); + order.setTotalPrice(resultSet.getDouble("total_price")); + + orders.add(order); + } + + } catch (SQLException e) { + System.out.println("Error loading orders: " + e.getMessage()); + } + + return orders; } - } \ No newline at end of file diff --git a/src/main/java/dev/model/Order.java b/src/main/java/dev/model/Order.java index 32049cb..8cbc53f 100644 --- a/src/main/java/dev/model/Order.java +++ b/src/main/java/dev/model/Order.java @@ -12,4 +12,35 @@ public class Order { private double totalPrice; + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getUserId() { + return userId; + } + + public void setUserId(int userId) { + this.userId = userId; + } + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public void setCreatedAt(LocalDateTime createdAt) { + this.createdAt = createdAt; + } + + public double getTotalPrice() { + return totalPrice; + } + + public void setTotalPrice(double totalPrice) { + this.totalPrice = totalPrice; + } } \ No newline at end of file -- 2.54.0 From 1b95925aafaa7e4b23e23b92e9f1f814e7da4964 Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 17:59:51 +0330 Subject: [PATCH 07/12] Complete OrderDetail and OrderDetailDao --- src/main/java/dev/dao/OrderDetailDao.java | 62 ++++++++++++++++++++--- src/main/java/dev/model/OrderDetail.java | 39 ++++++++++++++ 2 files changed, 95 insertions(+), 6 deletions(-) diff --git a/src/main/java/dev/dao/OrderDetailDao.java b/src/main/java/dev/dao/OrderDetailDao.java index ed42f56..276bd9a 100644 --- a/src/main/java/dev/dao/OrderDetailDao.java +++ b/src/main/java/dev/dao/OrderDetailDao.java @@ -1,24 +1,74 @@ package dev.dao; +import dev.database.DatabaseConnection; import dev.model.OrderDetail; +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.util.ArrayList; import java.util.List; public class OrderDetailDao { public void save(OrderDetail detail) { - // TODO: - // Insert order detail + String sql = "INSERT INTO order_details (order_id, menu_item_id, quantity, price) VALUES (?, ?, ?, ?)"; + try ( + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql) + ) { + + statement.setInt(1, detail.getOrderId()); + statement.setInt(2, detail.getMenuItemId()); + statement.setInt(3, detail.getQuantity()); + statement.setDouble(4, detail.getPrice()); + + statement.executeUpdate(); + + } catch (SQLException e) { + + System.out.println("Error saving order detail: " + e.getMessage()); + + } } public List findByOrderId(int orderId) { - // TODO: - // Retrieve order details + String sql = "SELECT id, order_id, menu_item_id, quantity, price FROM order_details WHERE order_id = ?"; - return null; + List details = new ArrayList<>(); + + try ( + Connection connection = DatabaseConnection.getConnection(); + PreparedStatement statement = connection.prepareStatement(sql) + ) { + + statement.setInt(1, orderId); + + ResultSet resultSet = statement.executeQuery(); + + while (resultSet.next()) { + + OrderDetail detail = new OrderDetail(); + + detail.setId(resultSet.getInt("id")); + detail.setOrderId(resultSet.getInt("order_id")); + detail.setMenuItemId(resultSet.getInt("menu_item_id")); + detail.setQuantity(resultSet.getInt("quantity")); + detail.setPrice(resultSet.getDouble("price")); + + details.add(detail); + } + + } catch (SQLException e) { + + System.out.println("Error loading order details: " + e.getMessage()); + + } + + return details; } - } \ No newline at end of file diff --git a/src/main/java/dev/model/OrderDetail.java b/src/main/java/dev/model/OrderDetail.java index b5b8bbe..c89e932 100644 --- a/src/main/java/dev/model/OrderDetail.java +++ b/src/main/java/dev/model/OrderDetail.java @@ -12,4 +12,43 @@ public class OrderDetail { private double price; + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public int getOrderId() { + return orderId; + } + + public void setOrderId(int orderId) { + this.orderId = orderId; + } + + public int getMenuItemId() { + return menuItemId; + } + + public void setMenuItemId(int menuItemId) { + this.menuItemId = menuItemId; + } + + public int getQuantity() { + return quantity; + } + + public void setQuantity(int quantity) { + this.quantity = quantity; + } + + public double getPrice() { + return price; + } + + public void setPrice(double price) { + this.price = price; + } } \ No newline at end of file -- 2.54.0 From 8976c89fe3e74ee8a8176bf25a1119b671f9e73d Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 19:09:38 +0330 Subject: [PATCH 08/12] Complete AuthService --- src/main/java/dev/service/AuthService.java | 37 +++++++++++++++++++--- 1 file changed, 32 insertions(+), 5 deletions(-) diff --git a/src/main/java/dev/service/AuthService.java b/src/main/java/dev/service/AuthService.java index bee866a..9d2ea96 100644 --- a/src/main/java/dev/service/AuthService.java +++ b/src/main/java/dev/service/AuthService.java @@ -1,21 +1,48 @@ package dev.service; +import dev.dao.UserDao; import dev.model.User; public class AuthService { + private UserDao userDao = new UserDao(); + public boolean register(String username, String password, String email) { - // TODO: - // Validate and register user + if (username == null || username.isBlank()) { + return false; + } - return false; + if (password == null || password.isBlank()) { + return false; + } + + User existingUser = userDao.findByUsername(username); + + if (existingUser != null) { + return false; + } + + User user = new User(); + + user.setUsername(username); + user.setPassword(password); + user.setEmail(email); + + return userDao.save(user); } public User login(String username, String password) { - // TODO: - // Authenticate user + User user = userDao.findByUsername(username); + + if (user == null) { + return null; + } + + if (user.getPassword().equals(password)) { + return user; + } return null; } -- 2.54.0 From 67538b25bb8f33727370f213f4985acf492318aa Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 19:12:44 +0330 Subject: [PATCH 09/12] Complete MenuService --- src/main/java/dev/service/MenuService.java | 27 +++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/service/MenuService.java b/src/main/java/dev/service/MenuService.java index 6dbf4da..2e94cec 100644 --- a/src/main/java/dev/service/MenuService.java +++ b/src/main/java/dev/service/MenuService.java @@ -1,12 +1,33 @@ package dev.service; +import dev.dao.MenuItemDao; +import dev.model.MenuItem; + +import java.util.List; + public class MenuService { + private MenuItemDao menuItemDao = new MenuItemDao(); + public void showMenu() { - // TODO: - // Display menu items + List menuItems = menuItemDao.findAll(); + if (menuItems.isEmpty()) { + System.out.println("Menu is empty."); + return; + } + + System.out.println("===== MENU ====="); + + for (MenuItem item : menuItems) { + System.out.println( + item.getId() + ". " + + item.getName() + " - " + + item.getDescription() + " - $" + + item.getPrice() + " - " + + item.getCategory() + ); + } } - } \ No newline at end of file -- 2.54.0 From 667d2f66c76b1f46072e25f5bb94f7d09e8213d5 Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 19:18:39 +0330 Subject: [PATCH 10/12] Complete OrderService --- src/main/java/dev/service/OrderService.java | 129 ++++++++++++++++++-- 1 file changed, 122 insertions(+), 7 deletions(-) diff --git a/src/main/java/dev/service/OrderService.java b/src/main/java/dev/service/OrderService.java index 14708f8..7f32a62 100644 --- a/src/main/java/dev/service/OrderService.java +++ b/src/main/java/dev/service/OrderService.java @@ -1,26 +1,141 @@ package dev.service; +import dev.dao.MenuItemDao; +import dev.dao.OrderDao; +import dev.dao.OrderDetailDao; +import dev.model.MenuItem; +import dev.model.Order; +import dev.model.OrderDetail; + +import java.util.ArrayList; +import java.util.List; +import java.util.Scanner; + public class OrderService { + private final Scanner scanner = new Scanner(System.in); + + private final MenuItemDao menuItemDao = new MenuItemDao(); + private final OrderDao orderDao = new OrderDao(); + private final OrderDetailDao orderDetailDao = new OrderDetailDao(); + public void placeOrder(int userId) { - // TODO: - // Create order + List cart = new ArrayList<>(); + double totalPrice = 0; + while (true) { + + System.out.print("Enter item id or 0 to finish: "); + int itemId = scanner.nextInt(); + + if (itemId == 0) { + break; + } + + MenuItem menuItem = menuItemDao.findById(itemId); + + if (menuItem == null) { + System.out.println("Item not found."); + continue; + } + + System.out.print("Enter quantity: "); + int quantity = scanner.nextInt(); + + if (quantity <= 0) { + System.out.println("Quantity must be greater than 0."); + continue; + } + + OrderDetail detail = new OrderDetail(); + detail.setMenuItemId(menuItem.getId()); + detail.setQuantity(quantity); + detail.setPrice(menuItem.getPrice()); + + cart.add(detail); + + totalPrice += menuItem.getPrice() * quantity; + + System.out.println("Added " + quantity + "x " + menuItem.getName()); + } + + if (cart.isEmpty()) { + System.out.println("Order cancelled."); + return; + } + + Order order = new Order(); + order.setUserId(userId); + order.setTotalPrice(totalPrice); + + int orderId = orderDao.save(order); + + if (orderId == -1) { + System.out.println("Order could not be saved."); + return; + } + + for (OrderDetail detail : cart) { + detail.setOrderId(orderId); + orderDetailDao.save(detail); + } + + System.out.println("Order saved successfully."); + printReceipt(orderId); } public void printReceipt(int orderId) { - // TODO: - // Print order receipt + List details = orderDetailDao.findByOrderId(orderId); + if (details.isEmpty()) { + System.out.println("No details found for this order."); + return; + } + + double finalTotal = 0; + + System.out.println(); + System.out.println("===== RECEIPT ====="); + + for (OrderDetail detail : details) { + + MenuItem item = menuItemDao.findById(detail.getMenuItemId()); + + double subtotal = detail.getPrice() * detail.getQuantity(); + finalTotal += subtotal; + + System.out.println( + item.getName() + + " | Qty: " + detail.getQuantity() + + " | Unit: $" + detail.getPrice() + + " | Total: $" + subtotal + ); + } + + System.out.println("-------------------"); + System.out.println("Final Total: $" + finalTotal); } public void showOrderHistory(int userId) { - // TODO: - // Display user's order history + List orders = orderDao.findByUserId(userId); + if (orders.isEmpty()) { + System.out.println("No orders found."); + return; + } + + System.out.println(); + System.out.println("===== ORDER HISTORY ====="); + + for (Order order : orders) { + System.out.println( + "Order #" + order.getId() + + " | Date: " + order.getCreatedAt() + + " | Total: $" + order.getTotalPrice() + ); + } } - } \ No newline at end of file -- 2.54.0 From 05ab2a497ad7ee723e1fe185773623b6daf18055 Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 20:57:47 +0330 Subject: [PATCH 11/12] modify DatabaseConnection.java --- database.sql | 1 - src/main/java/dev/database/DatabaseConnection.java | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/database.sql b/database.sql index 18e2a33..7c54256 100644 --- a/database.sql +++ b/database.sql @@ -1,6 +1,5 @@ - CREATE TABLE users( id SERIAL PRIMARY KEY, username VARCHAR(50) NOT NULL UNIQUE, diff --git a/src/main/java/dev/database/DatabaseConnection.java b/src/main/java/dev/database/DatabaseConnection.java index bac84ac..1c55f12 100644 --- a/src/main/java/dev/database/DatabaseConnection.java +++ b/src/main/java/dev/database/DatabaseConnection.java @@ -6,7 +6,7 @@ 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 -- 2.54.0 From 2c95ef5f8e345f6713708a4655219d6935f61ba1 Mon Sep 17 00:00:00 2001 From: Parmis Jamami Date: Thu, 25 Jun 2026 20:58:59 +0330 Subject: [PATCH 12/12] Complete ConsoleMenu --- .idea/.gitignore | 10 ++ .idea/compiler.xml | 13 ++ .idea/encodings.xml | 7 ++ .idea/inspectionProfiles/Project_Default.xml | 6 + .idea/jarRepositories.xml | 20 +++ .idea/misc.xml | 12 ++ .idea/vcs.xml | 6 + src/main/java/dev/ui/ConsoleMenu.java | 121 +++++++++++++++---- 8 files changed, 171 insertions(+), 24 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/inspectionProfiles/Project_Default.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/vcs.xml 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/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/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 0000000..5cb71ef --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,6 @@ + + + + \ 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..eba6e1f --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,12 @@ + + + + + + + + \ 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/src/main/java/dev/ui/ConsoleMenu.java b/src/main/java/dev/ui/ConsoleMenu.java index 663dc0c..0ac17ee 100644 --- a/src/main/java/dev/ui/ConsoleMenu.java +++ b/src/main/java/dev/ui/ConsoleMenu.java @@ -1,44 +1,117 @@ 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 = - new Scanner(System.in); + private final Scanner scanner = 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) { System.out.println(); - System.out.println("===== JAVA PIZZERIA ====="); - System.out.println("1. Login"); - System.out.println("2. Register"); - System.out.println("3. Exit"); + System.out.println("===== RESTAURANT SYSTEM ====="); + System.out.println("1. Register"); + System.out.println("2. Login"); + System.out.println("0. Exit"); + System.out.print("Choose: "); int choice = scanner.nextInt(); + scanner.nextLine(); - switch (choice) { - - case 1: - // TODO - break; - - case 2: - // TODO - break; - - case 3: - return; - - default: - System.out.println("Invalid choice"); - + if (choice == 1) { + register(); + } else if (choice == 2) { + login(); + } else if (choice == 0) { + System.out.println("Goodbye!"); + return; + } else { + System.out.println("Invalid choice."); } - } - } + private void register() { + + System.out.print("Username: "); + String username = scanner.nextLine(); + + System.out.print("Password: "); + String password = scanner.nextLine(); + + System.out.print("Email: "); + String email = scanner.nextLine(); + + boolean success = authService.register(username, password, email); + + if (success) { + System.out.println("Registration successful."); + } else { + System.out.println("Registration failed."); + } + } + + private void login() { + + System.out.print("Username: "); + String username = scanner.nextLine(); + + System.out.print("Password: "); + String password = scanner.nextLine(); + + User user = authService.login(username, password); + + if (user == null) { + System.out.println("Invalid username or password."); + return; + } + + System.out.println("Login successful. Welcome " + user.getUsername()); + + userMenu(user); + } + + private void userMenu(User user) { + + while (true) { + + System.out.println(); + System.out.println("===== USER MENU ====="); + System.out.println("1. View Menu"); + System.out.println("2. Place Order"); + System.out.println("3. Order History"); + System.out.println("0. Logout"); + System.out.print("Choose: "); + + int choice = scanner.nextInt(); + scanner.nextLine(); + + if (choice == 1) { + menuService.showMenu(); + } else if (choice == 2) { + menuService.showMenu(); + orderService.placeOrder(user.getId()); + } else if (choice == 3) { + orderService.showOrderHistory(user.getId()); + } else if (choice == 0) { + System.out.println("Logged out."); + return; + } else { + System.out.println("Invalid choice."); + } + } + } } \ No newline at end of file -- 2.54.0