Develop #1

Open
HadiSharifi wants to merge 7 commits from develop into main
3 changed files with 141 additions and 23 deletions
Showing only changes of commit ccf7343a26 - Show all commits
+39 -11
View File
@@ -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;
}
}
+19 -4
View File
@@ -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<MenuItem> getMenuItems() {
return menuItemDao.findAll();
}
public void showMenu() {
List<MenuItem> 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));
}
}
+83 -8
View File
@@ -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<Integer, int[]> cart = new LinkedHashMap<>(); // int[] = {quantity}
Map<Integer, MenuItem> 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<Integer, int[]> 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<OrderDetail> 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<Order> 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));
}
}