From a58476f109a75ae684ce5f44afe8391793508890 Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Fri, 26 Jun 2026 22:43:25 +0330 Subject: [PATCH 01/15] implement MenuiItem.java --- src/main/java/dev/model/MenuItem.java | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/main/java/dev/model/MenuItem.java b/src/main/java/dev/model/MenuItem.java index 265ecc1..a6532dd 100644 --- a/src/main/java/dev/model/MenuItem.java +++ b/src/main/java/dev/model/MenuItem.java @@ -12,4 +12,9 @@ public class MenuItem { private String category; + public void setId(int id) { this.id = id; } + public void setName(String name) { this.name = name; } + public void setDescription(String description) { this.description = description; } + public void setPrice(double price) { this.price = price; } + public void setCategory(String category) { this.category = category; } } \ No newline at end of file -- 2.54.0 From 55763a1c4618c4f093e0b7b473f102ccc334296b Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Fri, 26 Jun 2026 22:43:50 +0330 Subject: [PATCH 02/15] implement MenuiItemDao.java --- src/main/java/dev/dao/MenuItemDao.java | 59 ++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/dao/MenuItemDao.java b/src/main/java/dev/dao/MenuItemDao.java index 3bbebe9..36aec2b 100644 --- a/src/main/java/dev/dao/MenuItemDao.java +++ b/src/main/java/dev/dao/MenuItemDao.java @@ -1,23 +1,74 @@ 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 + List items = new ArrayList<>(); - return null; + // Retrieve all menu items + try ( Connection connection = DatabaseConnection.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement("SELECT * FROM menu_items"); + ResultSet resultSet = preparedStatement.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")); + + items.add(menuItem); + } + } + catch (SQLException e) { + throw new RuntimeException(e); + } + + return items; } public MenuItem findById(int id) { - // TODO: // Find menu item by id + String sql = "SELECT * FROM menu_items WHERE id=?"; + + try (Connection connection = DatabaseConnection.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + + preparedStatement.setInt(1, id); + + ResultSet resultSet = preparedStatement.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) { + throw new RuntimeException(e); + } return null; } -- 2.54.0 From 156416742029ef27e66c6ef8cdda76a2dcf253ca Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 00:39:41 +0330 Subject: [PATCH 03/15] implement OrderDao.java --- src/main/java/dev/model/Order.java | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/src/main/java/dev/model/Order.java b/src/main/java/dev/model/Order.java index 32049cb..2b1b9af 100644 --- a/src/main/java/dev/model/Order.java +++ b/src/main/java/dev/model/Order.java @@ -12,4 +12,13 @@ public class Order { private double totalPrice; + public void setId(int id) { this.id = id; } + public void setUserId(int userId) { this.userId = userId; } + public void setCreatedAt(LocalDateTime createdAt) { this.createdAt = createdAt; } + public void setTotalPrice(double totalPrice) { this.totalPrice = totalPrice; } + + public int getId() { return id; } + public double getTotalPrice() { return totalPrice; } + public int getUserId() { return userId; } + public LocalDateTime getCreatedAt() { return createdAt; } } \ No newline at end of file -- 2.54.0 From 17ae2dfeaf620c91b781168e68f35cad48c3a193 Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 00:40:27 +0330 Subject: [PATCH 04/15] implement Order.java --- src/main/java/dev/dao/OrderDao.java | 48 +++++++++++++++++++++++++++-- 1 file changed, 45 insertions(+), 3 deletions(-) diff --git a/src/main/java/dev/dao/OrderDao.java b/src/main/java/dev/dao/OrderDao.java index 00999a2..b7365b2 100644 --- a/src/main/java/dev/dao/OrderDao.java +++ b/src/main/java/dev/dao/OrderDao.java @@ -1,25 +1,67 @@ package dev.dao; +import dev.database.DatabaseConnection; import dev.model.Order; +import java.sql.*; +import java.time.LocalDateTime; +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, created_at) VALUES(?, ?, ?) RETURNING id"; + + try (Connection connection = DatabaseConnection.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql)){ + + preparedStatement.setInt(1, order.getUserId()); + preparedStatement.setDouble(2, order.getTotalPrice()); + preparedStatement.setTimestamp(3, Timestamp.valueOf(LocalDateTime.now())); + + ResultSet resultSet = preparedStatement.executeQuery(); + + if(resultSet.next()) return resultSet.getInt("id"); + + } catch (SQLException e) { + throw new RuntimeException(e); + } return -1; } public List findByUserId(int userId) { - // TODO: // Retrieve all orders of a user + String sql = "SELECT * FROM orders WHERE user_id=?"; + List orders = new ArrayList<>(); - return null; + try(Connection connection = DatabaseConnection.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql) ) { + + preparedStatement.setInt(1, userId); + + ResultSet resultSet = preparedStatement.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) { + throw new RuntimeException(e); + } + return orders; } } \ No newline at end of file -- 2.54.0 From 7ed720637247b0d6bcc8a8b8931ed17013c3cf2a Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 00:46:35 +0330 Subject: [PATCH 05/15] implement OrderDetail.java --- src/main/java/dev/model/OrderDetail.java | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/src/main/java/dev/model/OrderDetail.java b/src/main/java/dev/model/OrderDetail.java index b5b8bbe..6b714a4 100644 --- a/src/main/java/dev/model/OrderDetail.java +++ b/src/main/java/dev/model/OrderDetail.java @@ -12,4 +12,17 @@ public class OrderDetail { private double price; + public void setId(int id) { this.id = id; } + public void setOrderId(int orderId) { this.orderId = orderId; } + public void setMenuItemId(int menuItemId) { this.menuItemId = menuItemId; } + public void setQuantity(int quantity) { this.quantity = quantity; } + public void setPrice(double price) { this.price = price; } + + + public int getId() { return id; } + public int getOrderId() { return orderId; } + public int getMenuItemId() { return menuItemId; } + public int getQuantity() { return quantity; } + public double getPrice() { return price; } + } \ No newline at end of file -- 2.54.0 From 8f1cf660dbb18bb7c9429cc824cc531b78866573 Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 01:28:22 +0330 Subject: [PATCH 06/15] implement OrderDetailDao.java --- src/main/java/dev/dao/OrderDetailDao.java | 55 ++++++++++++++++++++++- 1 file changed, 53 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/dao/OrderDetailDao.java b/src/main/java/dev/dao/OrderDetailDao.java index ed42f56..a9340d8 100644 --- a/src/main/java/dev/dao/OrderDetailDao.java +++ b/src/main/java/dev/dao/OrderDetailDao.java @@ -1,7 +1,13 @@ 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 { @@ -11,14 +17,59 @@ public class OrderDetailDao { // TODO: // Insert order detail + String sql = "INSERT INTO order_detail (order_id, menu_item_id, quantity, price) VALUES(?, ?, ?, ?)"; + + try(Connection connection = DatabaseConnection.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + + preparedStatement.setInt(1, detail.getOrderId()); + preparedStatement.setInt(2, detail.getMenuItemId()); + preparedStatement.setInt(3, detail.getQuantity()); + preparedStatement.setDouble(4, detail.getPrice()); + + preparedStatement.executeQuery(); + + } catch (SQLException e) { + throw new RuntimeException(e); + } + } public List findByOrderId(int orderId) { - // TODO: // Retrieve order details - return null; + String sql = "SELECT * FROM order_detail WHERE order_id=?"; + + List orderDetails = new ArrayList<>(); + + try(Connection connection = DatabaseConnection.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + + preparedStatement.setInt(1, orderId); + + ResultSet resultSet = preparedStatement.executeQuery(); + + while (resultSet.next()) { + + OrderDetail orderDetail = new OrderDetail(); + + orderDetail.setId(resultSet.getInt("id")); + orderDetail.setOrderId(resultSet.getInt("order_id")); + orderDetail.setMenuItemId(resultSet.getInt("menu_item_id")); + orderDetail.setQuantity(resultSet.getInt("quantity")); + orderDetail.setPrice(resultSet.getDouble("price")); + + orderDetails.add(orderDetail); + } + + + + } catch (SQLException e) { + throw new RuntimeException(e); + } + + return orderDetails; } } \ No newline at end of file -- 2.54.0 From 0bb90c8c62913eca07b3a5f1dab076d170f39bdc Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 01:54:02 +0330 Subject: [PATCH 07/15] implement User.java --- src/main/java/dev/model/User.java | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/src/main/java/dev/model/User.java b/src/main/java/dev/model/User.java index 0ab60c6..59b144a 100644 --- a/src/main/java/dev/model/User.java +++ b/src/main/java/dev/model/User.java @@ -10,4 +10,15 @@ public class User { private String email; + + public void setId(int id) { this.id = id; } + public void setUsername(String username) { this.username= username; } + public void setPassword(String password) { this.password = password; } + public void setEmail(String email) { this.email = email; } + + + public int getId() { return id; } + public String getUsername() { return username; } + public String getEmail() { return email; } + public String getPassword() { return password; } } \ No newline at end of file -- 2.54.0 From 62de8172edf6302894e43bd7fd440df4c60e33c8 Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 01:54:38 +0330 Subject: [PATCH 08/15] implement UserDao.java --- src/main/java/dev/dao/UserDao.java | 48 +++++++++++++++++++++++++++--- 1 file changed, 44 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/dao/UserDao.java b/src/main/java/dev/dao/UserDao.java index af08106..0056bb1 100644 --- a/src/main/java/dev/dao/UserDao.java +++ b/src/main/java/dev/dao/UserDao.java @@ -1,23 +1,63 @@ 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 - return false; + String sql = "INSERT INTO users (username, password, email) VALUES(?, ?, ?)"; + + try(Connection connection = DatabaseConnection.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + + preparedStatement.setString(1, user.getUsername()); + preparedStatement.setString(2, user.getPassword()); + preparedStatement.setString(3, user.getEmail()); + + return preparedStatement.executeUpdate() > 0; + + } catch (SQLException e) { + throw new RuntimeException(e); + } } public User findByUsername(String username) { - // TODO: // Find a user by username + // Retrieve all orders of a user + String sql = "SELECT * FROM users WHERE username=?"; + try (Connection connection = DatabaseConnection.getConnection(); + PreparedStatement preparedStatement = connection.prepareStatement(sql)) { + + preparedStatement.setString(1, username); + + ResultSet resultSet = preparedStatement.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) { + throw new RuntimeException(e); + } return null; } - } \ No newline at end of file -- 2.54.0 From d5f3f4f38fe319bd7550476a2a9c779a8b26803c Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 02:11:06 +0330 Subject: [PATCH 09/15] Add database connection implementation --- src/main/java/dev/database/DatabaseConnection.java | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/database/DatabaseConnection.java b/src/main/java/dev/database/DatabaseConnection.java index da45535..35f04fb 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.Connection; +import java.sql.DriverManager; import java.sql.SQLException; public class DatabaseConnection { @@ -18,10 +19,8 @@ public class DatabaseConnection { public static Connection getConnection() throws SQLException { - // TODO: // Return a valid PostgreSQL connection - - return null; + return DriverManager.getConnection(URL, USER, PASSWORD); } } \ No newline at end of file -- 2.54.0 From 884e95957d7c6ea87a42e3a2cd4ab17ddf646eac Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 02:25:12 +0330 Subject: [PATCH 10/15] implement AuthService.java --- src/main/java/dev/service/AuthService.java | 21 +++++++++++++++++++-- 1 file changed, 19 insertions(+), 2 deletions(-) diff --git a/src/main/java/dev/service/AuthService.java b/src/main/java/dev/service/AuthService.java index bee866a..76927e5 100644 --- a/src/main/java/dev/service/AuthService.java +++ b/src/main/java/dev/service/AuthService.java @@ -1,22 +1,39 @@ package dev.service; +import dev.dao.UserDao; import dev.model.User; public class AuthService { + UserDao userDao = new UserDao(); + public boolean register(String username, String password, String email) { - // TODO: // Validate and register user + if( username == null || username.isBlank() || password == null || password.isBlank()) + return false; + if (userDao.findByUsername(username) == null) { + + User user = new User(); + + user.setEmail(email); + user.setPassword(password); + user.setUsername(username); + + return userDao.save(user); + } return false; } public User login(String username, String password) { - // TODO: // Authenticate user + User user = userDao.findByUsername(username); + if (user != null && user.getPassword().equals(password)) { + return user; + } return null; } -- 2.54.0 From 878ebcdc6cb3b8f058d3f6b02aea059fb3d36522 Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 02:50:44 +0330 Subject: [PATCH 11/15] edit MenuItem.java --- src/main/java/dev/model/MenuItem.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/src/main/java/dev/model/MenuItem.java b/src/main/java/dev/model/MenuItem.java index a6532dd..18a2da3 100644 --- a/src/main/java/dev/model/MenuItem.java +++ b/src/main/java/dev/model/MenuItem.java @@ -17,4 +17,10 @@ public class MenuItem { public void setDescription(String description) { this.description = description; } public void setPrice(double price) { this.price = price; } public void setCategory(String category) { this.category = category; } + + public int getId() { return id; } + public String getName() { return name; } + public String getDescription() { return description; } + public double getPrice() { return price; } + public String getCategory() { return category; } } \ No newline at end of file -- 2.54.0 From d26975c816737d282a1bddcb3d814bd41f2c0714 Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 04:11:10 +0330 Subject: [PATCH 12/15] implement showMenu() --- src/main/java/dev/service/MenuService.java | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/main/java/dev/service/MenuService.java b/src/main/java/dev/service/MenuService.java index 6dbf4da..56aed4f 100644 --- a/src/main/java/dev/service/MenuService.java +++ b/src/main/java/dev/service/MenuService.java @@ -1,11 +1,25 @@ 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 + MenuItemDao menuItemDao = new MenuItemDao(); + + List items = menuItemDao.findAll(); + + for ( MenuItem menuItem : items) { + + System.out.println(menuItem.getId() + ". " + menuItem.getName() + + " " + menuItem.getPrice() + " | " + menuItem.getCategory()); + System.out.println(menuItem.getDescription()); + } } -- 2.54.0 From de2c9530c7c562eb8ba7cc79de82fc18d197f95d Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 04:11:46 +0330 Subject: [PATCH 13/15] implement OrderService.java --- src/main/java/dev/service/OrderService.java | 101 +++++++++++++++++++- 1 file changed, 97 insertions(+), 4 deletions(-) diff --git a/src/main/java/dev/service/OrderService.java b/src/main/java/dev/service/OrderService.java index 14708f8..508882a 100644 --- a/src/main/java/dev/service/OrderService.java +++ b/src/main/java/dev/service/OrderService.java @@ -1,25 +1,118 @@ 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 { + MenuItemDao menuItemDao = new MenuItemDao(); + OrderDetailDao orderDetailDao = new OrderDetailDao(); + OrderDao orderDao = new OrderDao(); + + Scanner in = new Scanner(System.in); + public void placeOrder(int userId) { - // TODO: - // Create order + List details = new ArrayList<>(); + int totalPrice = 0; + // Create order + while (true) { + System.out.println("Enter the id of your order (-1 to exit) : "); + int id = in.nextInt(); + + if(id==-1) break; + + MenuItem menuItem = menuItemDao.findById(id); + + if(menuItem != null) { + + System.out.println("Enter quantity: "); + int quantity = in.nextInt(); + + if(quantity<=0) { + System.out.println("Quantity can't be negative"); + continue; + } + + OrderDetail orderDetail = new OrderDetail(); + + orderDetail.setPrice(menuItem.getPrice()); + orderDetail.setQuantity(quantity); + orderDetail.setMenuItemId(id); + + details.add(orderDetail); + totalPrice += menuItem.getPrice()*quantity; + + System.out.println(quantity+ " " + menuItem.getName() + "(s) got added to your order."); + } + } + + if (totalPrice<=0) return; + + Order order = new Order(); + order.setTotalPrice(totalPrice); + order.setUserId(userId); + int orderId = orderDao.save(order); + + if (orderId == -1) { + System.out.println("Order could not be saved"); + return; + } + + for(OrderDetail orderDetail : details) { + orderDetail.setOrderId(orderId); + orderDetailDao.save(orderDetail); + } + + printReceipt(orderId); } public void printReceipt(int orderId) { - // TODO: // Print order receipt + List details = orderDetailDao.findByOrderId(orderId); + if (details.isEmpty()) return; + + double totalPrice = 0; + + System.out.println("\n===== RECEIPT ====="); + + for (OrderDetail detail : details) { + + MenuItem item = menuItemDao.findById(detail.getMenuItemId()); + + double subtotal = detail.getPrice() * detail.getQuantity(); + totalPrice += subtotal; + + System.out.println( item.getName() + " | Quantity: " + detail.getQuantity() + + " | Price: " + detail.getPrice() + "$ | Total: " + subtotal + "$"); + } + System.out.println("\nFinal Total: $" + totalPrice); } public void showOrderHistory(int userId) { - // TODO: // Display user's order history + List orders = orderDao.findByUserId(userId); + + if (orders.isEmpty()) return; + + System.out.println("\n===== ORDER HISTORY ====="); + + for (Order order : orders) { + System.out.println( "Order #" + order.getId() + " | Date: " + order.getCreatedAt() + + " | Total: " + order.getTotalPrice() + "$"); + } } -- 2.54.0 From 3573dc1f58e0570348e7f781796cfaa39a214f1f Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 04:12:33 +0330 Subject: [PATCH 14/15] edit OrderDetailDao.java --- src/main/java/dev/dao/OrderDetailDao.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/main/java/dev/dao/OrderDetailDao.java b/src/main/java/dev/dao/OrderDetailDao.java index a9340d8..34aa24c 100644 --- a/src/main/java/dev/dao/OrderDetailDao.java +++ b/src/main/java/dev/dao/OrderDetailDao.java @@ -14,7 +14,6 @@ public class OrderDetailDao { public void save(OrderDetail detail) { - // TODO: // Insert order detail String sql = "INSERT INTO order_detail (order_id, menu_item_id, quantity, price) VALUES(?, ?, ?, ?)"; @@ -27,7 +26,7 @@ public class OrderDetailDao { preparedStatement.setInt(3, detail.getQuantity()); preparedStatement.setDouble(4, detail.getPrice()); - preparedStatement.executeQuery(); + preparedStatement.executeUpdate(); } catch (SQLException e) { throw new RuntimeException(e); -- 2.54.0 From dd6e81bcd5b94ae3824fd6407048890f8c50c49f Mon Sep 17 00:00:00 2001 From: Fateme Azizi Date: Sat, 27 Jun 2026 21:12:42 +0330 Subject: [PATCH 15/15] update multiple classes --- .idea/.gitignore | 10 ++ .idea/compiler.xml | 13 ++ .idea/dataSources.xml | 17 ++ .idea/encodings.xml | 7 + .idea/jarRepositories.xml | 20 +++ .idea/misc.xml | 12 ++ .idea/sqldialects.xml | 6 + .idea/vcs.xml | 6 + database.sql | 169 ++++-------------- .../java/dev/database/DatabaseConnection.java | 4 +- src/main/java/dev/service/MenuService.java | 7 +- src/main/java/dev/service/OrderService.java | 5 +- src/main/java/dev/ui/ConsoleMenu.java | 92 +++++++++- 13 files changed, 224 insertions(+), 144 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/compiler.xml create mode 100644 .idea/dataSources.xml create mode 100644 .idea/encodings.xml create mode 100644 .idea/jarRepositories.xml create mode 100644 .idea/misc.xml create mode 100644 .idea/sqldialects.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/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 -- 2.54.0