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/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/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..837c335 100644 --- a/database.sql +++ b/database.sql @@ -9,7 +9,6 @@ -- 6. The script should be executable from start to finish without errors. - -- ======================================================= -- USER TABLE -- ======================================================= @@ -30,6 +29,12 @@ -- -- CREATE TABLE ... +CREATE TABLE users( + id SERIAL PRIMARY KEY, + username TEXT UNIQUE NOT NULL, + password VARCHAR(250) NOT NULL, + email VARCHAR(100) +); -- ======================================================= @@ -52,7 +57,13 @@ -- -- CREATE TABLE ... - +CREATE TABLE menu_items( + id SERIAL PRIMARY KEY, + name VARCHAR(100) NOT NULL, + description TEXT, + price DECIMAL(10, 2) NOT NULL CHECK ( price > 0 ), + category VARCHAR(100) +); -- ======================================================= -- ORDER TABLE @@ -77,7 +88,12 @@ -- -- CREATE TABLE ... - +CREATE TABLE orders ( + id SERIAL PRIMARY KEY, + user_id INT NOT NULL REFERENCES users(id), + created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP, + total_price DECIMAL(10, 2) DEFAULT 0.00 +); -- ======================================================= -- ORDER DETAIL TABLE @@ -100,7 +116,13 @@ -- -- CREATE TABLE ... - +CREATE TABLE order_detail( + id SERIAL PRIMARY KEY, + order_id INT NOT NULL REFERENCES orders(id), + menu_item_id INT NOT NULL REFERENCES menuItem(id), + quantity INT NOT NULL CHECK ( quantity > 0 ), + unit_price DECIMAL(10, 2) NOT NULL +); -- ======================================================= -- INITIAL MENU DATA @@ -116,6 +138,12 @@ -- -- INSERT INTO ... +INSERT INTO menuItem( + name, description, price, category +) VALUES('Pizza Margherita', 'Classic pizza with tomato sauce and mozzarella', 10.00, 'Pizza'), + ('Beef Burger', 'Juicy beef patty with cheese, lettuce, and tomato', 8.50, 'Burger'), + ('Pasta Alfredo', 'Creamy pasta with grilled chicken and parmesan', 12.00, 'Pasta'), + ('Coca Cola', 'Cold soft drink', 2.00, 'Drink'); -- ======================================================= @@ -127,7 +155,18 @@ -- -- INSERT INTO ... +--AI generated +INSERT INTO users ( + username, password, email +) VALUES('ali_dev', '$2a$12$K8M6O2wWfG1...hashed_long_string...', 'ali@email.com'), + ('sara_k', '$2a$12$R9P2m1vXyZ7...hashed_long_string...', NULL), + ('reza_food', '$2a$12$T5N8b9zQpW3...hashed_long_string...', 'reza@email.com'); +INSERT INTO orders ( + user_id, total_price +) VALUES(1, 18.50), -- سفارش اول علی + (2, 12.00), -- سفارش سارا + (1, 20.00); -- سفارش دوم علی -- ======================================================= -- VERIFICATION QUERIES @@ -135,7 +174,7 @@ -- -- 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 menuItem; +SELECT * FROM orders; +SELECT * FROM order_detail; \ No newline at end of file diff --git a/pom.xml b/pom.xml index 028ca50..c12c681 100644 --- a/pom.xml +++ b/pom.xml @@ -27,6 +27,12 @@ ${postgresql.version} + + org.mindrot + jbcrypt + 0.4 + + \ No newline at end of file diff --git a/src/main/java/dev/dao/MenuItemDao.java b/src/main/java/dev/dao/MenuItemDao.java index 3bbebe9..a11edf1 100644 --- a/src/main/java/dev/dao/MenuItemDao.java +++ b/src/main/java/dev/dao/MenuItemDao.java @@ -1,7 +1,13 @@ 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 { @@ -10,14 +16,53 @@ public class MenuItemDao { // TODO: // Retrieve all menu items + List menuItems = new ArrayList<>(); + String sql = "SELECT * FROM menu_items"; - return null; + try(Connection conn = DatabaseConnection.getConnection(); + PreparedStatement stmt = conn.prepareCall(sql); + ResultSet rs = stmt.executeQuery()) { + while (rs.next()) + { + int id = rs.getInt("id"); + String name = rs.getString("name"); + String description = rs.getString("description"); + double price = rs.getDouble("price"); + String category = rs.getString("category"); + + MenuItem menuItem = new MenuItem(id, name, description, price, category); + menuItems.add(menuItem); + } + } catch (SQLException e) { + e.printStackTrace(); + } + return menuItems; } public MenuItem findById(int id) { // TODO: // Find menu item by id + String sql = "SELECT * FROM menu_items WHERE id = ?"; + + try(Connection conn = DatabaseConnection.getConnection(); + PreparedStatement stmt = conn.prepareCall(sql);) { + stmt.setInt(1, id); + try( ResultSet rs = stmt.executeQuery()) { + if(rs.next()) + { + int itemID = rs.getInt("id"); + String name = rs.getString("name"); + String description = rs.getString("description"); + double price = rs.getDouble("price"); + String category = rs.getString("category"); + MenuItem menuItem = new MenuItem(itemID, name, description, price, category); + return menuItem; + } + } + } catch (SQLException e) { + e.printStackTrace(); + } return null; } diff --git a/src/main/java/dev/dao/OrderDao.java b/src/main/java/dev/dao/OrderDao.java index 00999a2..cd4036c 100644 --- a/src/main/java/dev/dao/OrderDao.java +++ b/src/main/java/dev/dao/OrderDao.java @@ -1,7 +1,12 @@ package dev.dao; +import dev.database.DatabaseConnection; +import dev.model.MenuItem; import dev.model.Order; +import java.sql.*; +import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; public class OrderDao { @@ -10,6 +15,22 @@ public class OrderDao { // TODO: // Insert order and return generated id + String sql = "INSERT INTO orders (user_id, total_price) VALUES (?, ?)"; + try (Connection conn = DatabaseConnection.getConnection();) { + PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + stmt.setInt(1, order.getUserId()); + stmt.setDouble(2, order.getTotalPrice()); + int row = stmt.executeUpdate(); + if (row > 0) { + try (ResultSet generatedKeys = stmt.getGeneratedKeys()) { + if (generatedKeys.next()) { + return generatedKeys.getInt(1); + } + } + } + } catch (SQLException ex) { + throw new RuntimeException(ex); + } return -1; } @@ -18,8 +39,26 @@ public class OrderDao { // TODO: // Retrieve all orders of a user - - return null; + List orders = new ArrayList<>(); + String sql = "SELECT * FROM orders WHERE user_id = ?"; + try(Connection conn = DatabaseConnection.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, userId); + try (ResultSet rs = stmt.executeQuery()){ + while (rs.next()) + { + int id = rs.getInt("id"); + int orderUserId = rs.getInt("user_id"); + LocalDateTime localDateTime = rs.getTimestamp("created_at").toLocalDateTime(); + double totalPrice = rs.getDouble("total_price"); + Order order = new Order(id, orderUserId, localDateTime, totalPrice); + orders.add(order); + } + } + return orders; + } catch (SQLException e) { + throw new RuntimeException(e); + } } } \ No newline at end of file diff --git a/src/main/java/dev/dao/OrderDetailDao.java b/src/main/java/dev/dao/OrderDetailDao.java index ed42f56..a0edf04 100644 --- a/src/main/java/dev/dao/OrderDetailDao.java +++ b/src/main/java/dev/dao/OrderDetailDao.java @@ -1,7 +1,12 @@ package dev.dao; +import dev.database.DatabaseConnection; +import dev.model.Order; import dev.model.OrderDetail; +import java.sql.*; +import java.time.LocalDateTime; +import java.util.ArrayList; import java.util.List; public class OrderDetailDao { @@ -10,15 +15,46 @@ public class OrderDetailDao { // TODO: // Insert order detail - + String sql = "INSERT INTO order_detail (order_id, menu_item_id,quantity, unit_price) VALUES (?, ?, ?, ?)"; + try (Connection conn = DatabaseConnection.getConnection();) { + PreparedStatement stmt = conn.prepareStatement(sql, Statement.RETURN_GENERATED_KEYS); + stmt.setInt(1, detail.getOrderId()); + stmt.setInt(2, detail.getMenuItemId()); + stmt.setInt(3, detail.getQuantity()); + stmt.setDouble(4, detail.getPrice()); + stmt.executeUpdate(); + } catch (SQLException ex) { + throw new RuntimeException(ex); + } } public List findByOrderId(int orderId) { // TODO: // Retrieve order details + // Retrieve all orders of a user + List orderDetails = new ArrayList<>(); + String sql = "SELECT * FROM order_detail WHERE order_id = ?"; + try(Connection conn = DatabaseConnection.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setInt(1, orderId); + try (ResultSet rs = stmt.executeQuery()){ + while (rs.next()) + { - return null; + int id = rs.getInt("id"); + int orderUserId = rs.getInt("order_id"); + int menuItemId = rs.getInt("menu_item_id"); + int quantity = rs.getInt("quantity"); + double unitPrice = rs.getDouble("unit_price"); + OrderDetail orderDetail = new OrderDetail(id, orderUserId, menuItemId, quantity, unitPrice); + orderDetails.add(orderDetail); + } + } + return orderDetails; + } catch (SQLException e) { + throw new RuntimeException(e); + } } } \ No newline at end of file diff --git a/src/main/java/dev/dao/UserDao.java b/src/main/java/dev/dao/UserDao.java index af08106..c57c364 100644 --- a/src/main/java/dev/dao/UserDao.java +++ b/src/main/java/dev/dao/UserDao.java @@ -1,6 +1,14 @@ package dev.dao; +import dev.database.DatabaseConnection; import dev.model.User; +import org.mindrot.jbcrypt.BCrypt; +import org.postgresql.jdbc.ResourceLock; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; public class UserDao { @@ -8,16 +16,41 @@ public class UserDao { // TODO: // Insert user into database - - return false; + String sql = "INSERT INTO users (username, password, email) VALUES (?, ?, ?)"; + try (Connection conn = DatabaseConnection.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql)) { + stmt.setString(1, user.getUsername()); + String hashedPassword = BCrypt.hashpw(user.getPassword(), BCrypt.gensalt()); + stmt.setString(2, hashedPassword); + stmt.setString(3, user.getEmail()); + int row = stmt.executeUpdate(); + return row > 0; + } catch (SQLException e) { + throw new RuntimeException(e); + } } public User findByUsername(String username) { // TODO: // Find a user by username + String sql = "SELECT * FROM users WHERE username = ?"; + try (Connection conn = DatabaseConnection.getConnection(); + PreparedStatement stmt = conn.prepareStatement(sql)){ + stmt.setString(1, username); + try (ResultSet rs = stmt.executeQuery()){ + if(rs.next()) { + int id = rs.getInt("id"); + String password = rs.getString("password"); + String email = rs.getString("email"); + return new User(id, username, password, email); + } + return null; + } - return null; + } catch (SQLException e) { + throw new RuntimeException(e); + } } } \ 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 da45535..a0a5ff3 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 = ""; // Your Password private DatabaseConnection() { @@ -20,8 +21,7 @@ public class DatabaseConnection { // TODO: // Return a valid PostgreSQL connection - - return null; + return DriverManager.getConnection(URL, USER, PASSWORD); } } \ No newline at end of file diff --git a/src/main/java/dev/model/MenuItem.java b/src/main/java/dev/model/MenuItem.java index 265ecc1..01afc1c 100644 --- a/src/main/java/dev/model/MenuItem.java +++ b/src/main/java/dev/model/MenuItem.java @@ -1,5 +1,7 @@ package dev.model; +import java.math.BigDecimal; + public class MenuItem { private int id; @@ -12,4 +14,32 @@ public class MenuItem { private String category; + + public MenuItem(int id, String name, String description, double price, String category) { + this.id = id; + this.name = name; + this.description = description; + this.price = price; + this.category = category; + } + + public String getCategory() { + return category; + } + + public String getDescription() { + return description; + } + + public int getId() { + return id; + } + + public String getName() { + return name; + } + + public double getPrice() { + return price; + } } \ 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..1db8ea1 100644 --- a/src/main/java/dev/model/Order.java +++ b/src/main/java/dev/model/Order.java @@ -12,4 +12,32 @@ public class Order { private double totalPrice; + public Order(int id, int userId, LocalDateTime createdAt, double totalPrice) { + this.id = id; + this.userId = userId; + this.createdAt = createdAt; + this.totalPrice = totalPrice; + } + + public Order(int userId, double totalPrice) { + this.userId = userId; + this.totalPrice = totalPrice; + } + + + public LocalDateTime getCreatedAt() { + return createdAt; + } + + public int getId() { + return id; + } + + public double getTotalPrice() { + return totalPrice; + } + + public int getUserId() { + return userId; + } } \ 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..c1dc70e 100644 --- a/src/main/java/dev/model/OrderDetail.java +++ b/src/main/java/dev/model/OrderDetail.java @@ -12,4 +12,42 @@ public class OrderDetail { private double price; + public OrderDetail(int id, int orderId, int menuItemId, int quantity, double price) { + this.id = id; + this.orderId = orderId; + this.menuItemId = menuItemId; + this.quantity = quantity; + this.price = price; + } + + public OrderDetail(int menuItemId, int quantity, double price) + { + this.menuItemId = menuItemId; + this.quantity = quantity; + this.price = price; + } + + public int getId() { + return id; + } + + public int getMenuItemId() { + return menuItemId; + } + + public int getOrderId() { + return orderId; + } + + public double getPrice() { + return price; + } + + public int getQuantity() { + return quantity; + } + + public void setOrderId(int orderId) { + this.orderId = orderId; + } } \ No newline at end of file diff --git a/src/main/java/dev/model/User.java b/src/main/java/dev/model/User.java index 0ab60c6..951011f 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 User(int id, String username, String password, String email) { + this.id = id; + this.username = username; + this.password = password; + this.email = email; + } + + public User(String username, String password, String email) + { + this.username = username; + this.password = password; + this.email = email; + } + + + public String getEmail() { + return email; + } + + public int getId() { + return id; + } + + public String getPassword() { + return password; + } + + public String getUsername() { + return username; + } } \ No newline at end of file diff --git a/src/main/java/dev/service/AuthService.java b/src/main/java/dev/service/AuthService.java index bee866a..3528b7f 100644 --- a/src/main/java/dev/service/AuthService.java +++ b/src/main/java/dev/service/AuthService.java @@ -1,23 +1,42 @@ package dev.service; +import dev.dao.UserDao; import dev.model.User; +import org.mindrot.jbcrypt.BCrypt; public class AuthService { + private UserDao userDao = new UserDao(); public boolean register(String username, String password, String email) { // TODO: // Validate and register user - - return false; + if(userDao.findByUsername(username) != null) + { + System.out.println("Username is already taken."); + return false; + } + return userDao.save(new User(username, password, email)); } public User login(String username, String password) { // TODO: // Authenticate user + User user = userDao.findByUsername(username); + if(user == null) + { + System.out.println("Invalid username or password."); + return null; + } - return null; + boolean isPasswordCorrect = BCrypt.checkpw(password, user.getPassword()); + if (!isPasswordCorrect) { + System.out.println("Invalid password."); + return null; + } + System.out.println("Login successful!"); + return user; } -} \ No newline at end of file + } \ No newline at end of file diff --git a/src/main/java/dev/service/MenuService.java b/src/main/java/dev/service/MenuService.java index 6dbf4da..3135e03 100644 --- a/src/main/java/dev/service/MenuService.java +++ b/src/main/java/dev/service/MenuService.java @@ -1,12 +1,32 @@ 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 items = menuItemDao.findAll(); + //AI generated. + System.out.println("Available Items:"); + if (items == null || items.isEmpty()) { + System.out.println("No items available at the moment."); + return; + } + for (MenuItem item : items) { + System.out.printf("%d. %s - $%.2f%n", + item.getId(), + item.getName(), + item.getPrice() + ); + } } - } \ No newline at end of file diff --git a/src/main/java/dev/service/OrderService.java b/src/main/java/dev/service/OrderService.java deleted file mode 100644 index 14708f8..0000000 --- a/src/main/java/dev/service/OrderService.java +++ /dev/null @@ -1,26 +0,0 @@ -package dev.service; - -public class OrderService { - - public void placeOrder(int userId) { - - // TODO: - // Create order - - } - - public void printReceipt(int orderId) { - - // TODO: - // Print order receipt - - } - - public void showOrderHistory(int userId) { - - // TODO: - // Display user's order history - - } - -} \ No newline at end of file diff --git a/src/main/java/dev/service/orderService.java b/src/main/java/dev/service/orderService.java new file mode 100644 index 0000000..019cf46 --- /dev/null +++ b/src/main/java/dev/service/orderService.java @@ -0,0 +1,142 @@ +package dev.service; + +import dev.dao.MenuItemDao; +import dev.dao.OrderDao; +import dev.dao.OrderDetailDao; +import dev.database.DatabaseConnection; +import dev.model.MenuItem; +import dev.model.Order; +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.Collection; +import java.util.List; +import java.util.Scanner; + +public class orderService { + + private OrderDao orderDao = new OrderDao(); + private OrderDetailDao orderDetailDao = new OrderDetailDao(); + private MenuItemDao menuItemDao = new MenuItemDao(); + private MenuService menuService = new MenuService(); + private Scanner scanner = new Scanner(System.in); + + public void placeOrder(int userId) { + + // TODO: + // Create order + System.out.println("\n[Placing Order]"); + menuService.showMenu(); + List cart = new ArrayList<>(); + double totalPrice = 0.0; + while (true) { + System.out.print("\nEnter the ID of the item to add (or 0 to finish): "); + int itemId = scanner.nextInt(); + if (itemId == 0) { + break; + } + MenuItem item = menuItemDao.findById(itemId); + if (item == null) { + System.out.println("Invalid Item ID! Please try again."); + continue; + } + System.out.print("Enter quantity: "); + int quantity = scanner.nextInt(); + if (quantity <= 0) { + System.out.println("Quantity must always be greater than zero!"); + continue; + } + double itemPrice = item.getPrice(); + double subTotal = itemPrice * quantity; + totalPrice += subTotal; + OrderDetail orderDetail = new OrderDetail(itemId, quantity, itemPrice); + cart.add(orderDetail); + System.out.printf("Added %dx %s to your cart.%n", quantity, item.getName()); + } + + if (cart.isEmpty()) { + System.out.println("Order cancelled. Your cart is empty."); + return; + } + Order order = new Order(userId, totalPrice); + int generatedOrderId = orderDao.save(order); // متد save باید آی‌دیِ ایجاد شده را برگرداند + + if (generatedOrderId > 0) { + for (OrderDetail detail : cart) { + detail.setOrderId(generatedOrderId); + orderDetailDao.save(detail); + } + System.out.println("\nOrder saved successfully!"); + printReceipt(generatedOrderId); + } else { + System.out.println("Failed to save order due to a database error."); + } + } + + public void printReceipt(int orderId) { + + // TODO: + // Print order receipt + //AI generated + List orderDetails = orderDetailDao.findByOrderId(orderId); + if (orderDetails.isEmpty()) { + System.out.println("Receipt error: Order not found."); + return; + } + + // ۲. چاپ فاکتور دقیقاً بر اساس قالب ریدمی + System.out.println("\n[Order Summary / Receipt]"); + System.out.println("---------------------------------------"); + System.out.printf("%-12s %-7s %-9s %-7s%n", "Item", "Qty", "Unit", "Total"); + System.out.println("---------------------------------------"); + + for (OrderDetail detail : orderDetails) { + // برای نمایش نام غذا، آن را با آی‌دی از جدول منو می‌خوانیم + MenuItem item = menuItemDao.findById(detail.getMenuItemId()); + String itemName = (item != null) ? item.getName() : "Unknown Item"; + + double totalItemPrice = detail.getPrice() * detail.getQuantity(); + + System.out.printf("%-12s %-7d $%-8.2f $%-7.2f%n", + itemName, + detail.getQuantity(), + detail.getPrice(), + totalItemPrice + ); + } + } + + public void showOrderHistory(int userId) { + + // TODO: + // Display user's order history + //AI generated + System.out.println("\n[Order History]"); + + + List orders = orderDao.findByUserId(userId); + + if (orders == null || orders.isEmpty()) { + System.out.println("You haven't placed any orders yet."); + return; + } + + System.out.println("--------------------------------------------"); + System.out.printf("%-10s %-22s %-10s%n", "Order ID", "Date & Time", "Amount Spent"); + System.out.println("--------------------------------------------"); + + for (Order o : orders) { + System.out.printf("ID: %-6d %-22s $%-10.2f%n", + o.getId(), + o.getCreatedAt(), // این فیلد از نوع Timestamp یا String در مدل شماست + o.getTotalPrice() + ); + } + System.out.println("--------------------------------------------"); + } + +} \ 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..a94a05a 100644 --- a/src/main/java/dev/ui/ConsoleMenu.java +++ b/src/main/java/dev/ui/ConsoleMenu.java @@ -1,44 +1,104 @@ package dev.ui; +import dev.service.AuthService; +import dev.service.MenuService; +import dev.model.User; +import dev.service.orderService; + import java.util.Scanner; public class ConsoleMenu { - private final Scanner scanner = - new Scanner(System.in); + private AuthService authService = new AuthService(); + private MenuService menuService = new MenuService(); + private orderService orderService = new orderService(); + private Scanner scanner = new Scanner(System.in); + private User loggedInUser = null; // برای حفظ وضعیت کاربر لاگین شده 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"); - - int choice = scanner.nextInt(); - - switch (choice) { - - case 1: - // TODO - break; - - case 2: - // TODO - break; - - case 3: - return; - - default: - System.out.println("Invalid choice"); - + if (loggedInUser == null) { + showAuthMenu(); + } else { + showRestaurantMenu(); } - } - } + // ۱. منوی اولیه: لاگین و ثبت‌نام + private void showAuthMenu() { + System.out.println("======================================="); + System.out.println(" 🍕 WELCOME TO JAVA PIZZERIA 🍕"); + System.out.println("======================================="); + System.out.println("1. Login"); + System.out.println("2. Register New Account"); + System.out.println("3. Exit"); + System.out.println("======================================="); + System.out.print("Choose an option: "); + + int option = scanner.nextInt(); + scanner.nextLine(); // خالی کردن بافر اسکنر + + switch (option) { + case 1 -> handleLogin(); + case 2 -> handleRegister(); + case 3 -> { + System.out.println("Goodbye!"); + System.exit(0); + } + default -> System.out.println("Invalid option! Try again."); + } + } + + // ۲. منوی اصلی بعد از لاگین موفق + private void showRestaurantMenu() { + System.out.println("======================================="); + System.out.println(" 🍽️ MAIN MENU 🍽️"); + System.out.println("======================================="); + System.out.println("1. View Menu"); + System.out.println("2. Place a New Order"); + System.out.println("3. View Order History"); + System.out.println("4. Logout"); + System.out.println("======================================="); + System.out.print("Choose an option: "); + + int option = scanner.nextInt(); + scanner.nextLine(); + + switch (option) { + case 1 -> menuService.showMenu(); // فقط متد نمایش رو از سرویس صدا می‌زنیم + case 2 -> orderService.placeOrder(loggedInUser.getId()); // هدایت به بخش ثبت سفارش + case 3 -> orderService.showOrderHistory(loggedInUser.getId()); + case 4 -> { + loggedInUser = null; // خروج از حساب کاربری + System.out.println("Logged out successfully."); + } + default -> System.out.println("Invalid option!"); + } + } + + private void handleLogin() { + System.out.println("[Login]"); + System.out.print("Enter username: "); + String username = scanner.nextLine(); + System.out.print("Enter password: "); + String password = scanner.nextLine(); + + // سپردن کار اصلی تایید به لایه سرویس + loggedInUser = authService.login(username, password); + } + + private void handleRegister() { + System.out.println("[Register]"); + System.out.print("Enter username: "); + String username = scanner.nextLine(); + System.out.print("Enter password: "); + String password = scanner.nextLine(); + System.out.print("Enter email (optional): "); + String email = scanner.nextLine(); + boolean success = authService.register(username, password, email); + if (success) { + System.out.println("Account registered successfully! Please login."); + } + } } \ No newline at end of file