diff --git a/src/main/java/dev/service/AuthService.java b/src/main/java/dev/service/AuthService.java index bee866a..32e2bd3 100644 --- a/src/main/java/dev/service/AuthService.java +++ b/src/main/java/dev/service/AuthService.java @@ -1,23 +1,51 @@ package dev.service; +import dev.dao.UserDao; import dev.model.User; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; + public class AuthService { + private final UserDao userDao = new UserDao(); + + + private String hashPassword(String password) { + try { + MessageDigest md = MessageDigest.getInstance("SHA-256"); + byte[] hash = md.digest(password.getBytes()); + StringBuilder sb = new StringBuilder(); + for (byte b : hash) sb.append(String.format("%02x", b)); + return sb.toString(); + } catch (NoSuchAlgorithmException e) { + throw new RuntimeException("Hashing error", e); + } + } + public boolean register(String username, String password, String email) { - - // TODO: - // Validate and register user - - return false; + if (username == null || username.isBlank() || password == null || password.isBlank()) { + System.out.println("Username and password are required."); + return false; + } + if (userDao.findByUsername(username) != null) { + System.out.println("Username already taken."); + return false; + } + User user = new User(username, hashPassword(password), email.isBlank() ? null : email); + return userDao.save(user); } public User login(String username, String password) { - - // TODO: - // Authenticate user - - return null; + User user = userDao.findByUsername(username); + if (user == null) { + System.out.println("User not found."); + return null; + } + if (!user.getPassword().equals(hashPassword(password))) { + System.out.println("Incorrect password."); + return null; + } + return user; } - } \ 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..3257079 100644 --- a/src/main/java/dev/service/MenuService.java +++ b/src/main/java/dev/service/MenuService.java @@ -1,12 +1,27 @@ package dev.service; +import dev.dao.MenuItemDao; +import dev.model.MenuItem; + +import java.util.List; + public class MenuService { - public void showMenu() { - - // TODO: - // Display menu items + private final MenuItemDao menuItemDao = new MenuItemDao(); + public List getMenuItems() { + return menuItemDao.findAll(); } + public void showMenu() { + List items = getMenuItems(); + System.out.println("\n--- MENU ---"); + System.out.printf("%-5s %-25s %-12s %s%n", "ID", "Name", "Price", "Category"); + System.out.println("-".repeat(55)); + for (MenuItem item : items) { + System.out.printf("%-5d %-25s $%-11.2f %s%n", + item.getId(), item.getName(), item.getPrice(), item.getCategory()); + } + System.out.println("-".repeat(55)); + } } \ 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 14708f8..446196e 100644 --- a/src/main/java/dev/service/OrderService.java +++ b/src/main/java/dev/service/OrderService.java @@ -1,26 +1,101 @@ 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.*; + public class OrderService { + private final MenuItemDao menuItemDao = new MenuItemDao(); + private final OrderDao orderDao = new OrderDao(); + private final OrderDetailDao orderDetailDao = new OrderDetailDao(); + private final MenuService menuService = new MenuService(); + private final Scanner scanner = new Scanner(System.in); + public void placeOrder(int userId) { + menuService.showMenu(); + + Map cart = new LinkedHashMap<>(); // int[] = {quantity} + Map itemMap = new HashMap<>(); - // TODO: - // Create order + while (true) { + System.out.print("\nEnter item ID to add (0 to finish): "); + int id = scanner.nextInt(); + if (id == 0) break; + MenuItem item = menuItemDao.findById(id); + if (item == null) { + System.out.println("Item not found, try again."); + continue; + } + System.out.print("Enter quantity: "); + int qty = scanner.nextInt(); + if (qty <= 0) { System.out.println("Quantity must be > 0."); continue; } + + cart.merge(id, new int[]{qty}, (a, b) -> new int[]{a[0] + b[0]}); + itemMap.put(id, item); + System.out.printf("Added %dx %s%n", qty, item.getName()); + } + + if (cart.isEmpty()) { System.out.println("No items selected."); return; } + + // Calculate total + double total = cart.entrySet().stream() + .mapToDouble(e -> itemMap.get(e.getKey()).getPrice() * e.getValue()[0]) + .sum(); + + // Save order + Order order = new Order(userId, total); + int orderId = orderDao.save(order); + if (orderId == -1) { System.out.println("Failed to save order."); return; } + + // Save order details + for (Map.Entry entry : cart.entrySet()) { + MenuItem item = itemMap.get(entry.getKey()); + OrderDetail detail = new OrderDetail(orderId, item.getId(), entry.getValue()[0], item.getPrice()); + orderDetailDao.save(detail); + } + + printReceipt(orderId); } public void printReceipt(int orderId) { + List details = orderDetailDao.findByOrderId(orderId); + System.out.println("\n--- RECEIPT ---"); + System.out.printf("%-20s %5s %8s %8s%n", "Item", "Qty", "Unit", "Total"); + System.out.println("-".repeat(47)); - // TODO: - // Print order receipt + double grandTotal = 0; + for (OrderDetail d : details) { + MenuItem item = menuItemDao.findById(d.getMenuItemId()); + String name = (item != null) ? item.getName() : "Unknown"; + double subtotal = d.getPrice() * d.getQuantity(); + grandTotal += subtotal; + System.out.printf("%-20s %5d $%7.2f $%7.2f%n", + name, d.getQuantity(), d.getPrice(), subtotal); + } + System.out.println("-".repeat(47)); + System.out.printf("%-20s %18s $%7.2f%n", "TOTAL", "", grandTotal); + System.out.println("Order saved successfully!"); } public void showOrderHistory(int userId) { + List orders = orderDao.findByUserId(userId); + if (orders.isEmpty()) { System.out.println("No past orders."); return; } - // TODO: - // Display user's order history - + System.out.println("\n--- ORDER HISTORY ---"); + System.out.printf("%-8s %-25s %s%n", "Order#", "Date", "Total"); + System.out.println("-".repeat(45)); + for (Order o : orders) { + System.out.printf("%-8d %-25s $%.2f%n", + o.getId(), o.getCreatedAt().toString().replace("T", " "), o.getTotalPrice()); + } + System.out.println("-".repeat(45)); } - } \ No newline at end of file