From d8dd081cb04e5876bf93438b6a3fb71528b00edd Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Mon, 1 Dec 2025 09:30:35 +0000 Subject: [PATCH 1/8] add deadline --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index d20aaf9..7071577 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,4 @@ +[![Review Assignment Due Date](https://classroom.github.com/assets/deadline-readme-button-22041afd0340ce965d47ae6ef1cefeee28c7c493a6346c4f15d667ab976d596c.svg)](https://classroom.github.com/a/339Lr3BJ) ### How the tests work (and Docker requirement) This project ships with an end‑to‑end CLI integration test suite that uses Testcontainers to spin up a temporary MySQL database. From d1b1ba6cdeb27ffefe0f32f091610890506b426b Mon Sep 17 00:00:00 2001 From: Johan Karlsson <93186588+gurkvatten@users.noreply.github.com> Date: Fri, 12 Dec 2025 11:37:53 +0100 Subject: [PATCH 2/8] login --- mvnw | 0 src/main/java/com/example/Main.java | 41 ++++++++++++++++++++++++++--- 2 files changed, 37 insertions(+), 4 deletions(-) mode change 100644 => 100755 mvnw diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 6dc6fbd..1f05223 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -1,9 +1,8 @@ package com.example; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; +import java.sql.*; import java.util.Arrays; +import java.util.Scanner; public class Main { @@ -27,10 +26,32 @@ public void run() { } try (Connection connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass)) { + Scanner scanner = new Scanner(System.in); + boolean loggedIn = false; + while (!loggedIn) { + System.out.print("Username: "); + String username = scanner.nextLine(); + System.out.print("Password: "); + String password = scanner.nextLine(); + + if (isValidLogin(connection,username,password)) { + loggedIn = true; + System.out.println("Logged in as " + username); + } else { + System.out.println("Invalid username or password"); + System.out.println("0) Exit"); + System.out.println("Press any other key to try again"); + + String choice = scanner.nextLine(); + if (choice.equals("0")) { + return; + } + } + } } catch (SQLException e) { throw new RuntimeException(e); } - //Todo: Starting point for your code + } /** @@ -59,4 +80,16 @@ private static String resolveConfig(String propertyKey, String envKey) { } return (v == null || v.trim().isEmpty()) ? null : v.trim(); } + private boolean isValidLogin(Connection conn, String user, String pass) throws SQLException { + String query = "SELECT * FROM account WHERE username = ? AND password = ?"; + + try (PreparedStatement stmt = conn.prepareStatement(query)) { + stmt.setString(1, user); + stmt.setString(2, pass); + + try (ResultSet rs = stmt.executeQuery()) { + return rs.next(); + } + } + } } From 6b62a9707eefa49ab6c34a8e01a7c2fc49748789 Mon Sep 17 00:00:00 2001 From: Johan Karlsson <93186588+gurkvatten@users.noreply.github.com> Date: Fri, 12 Dec 2025 12:21:29 +0100 Subject: [PATCH 3/8] menu --- src/main/java/com/example/Main.java | 58 +++++++++++++++++++++++++++++ 1 file changed, 58 insertions(+) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 1f05223..82cb488 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -48,12 +48,70 @@ public void run() { } } } + while (true) { + printMenu(); + String option = scanner.nextLine(); + + switch (option) { + switch (option) { + case "1": + listMoonMissions(connection); + break; + case "2": + System.out.print("Enter mission_id: "); + String idStr = scanner.nextLine(); + getMoonMissionById(connection, idStr); + break; + case "3": + System.out.print("Enter year: "); + String yearStr = scanner.nextLine(); + countMissionsByYear(connection, yearStr); + break; + case "4": + System.out.println("Not implemented yet (Step 3)"); + break; + case "5": + System.out.println("Not implemented yet (Step 3)"); + break; + case "6": + System.out.println("Not implemented yet (Step 3)"); + break; + case "0": + return; + default: + System.out.println("Invalid option, try again."); + } + } + } } catch (SQLException e) { throw new RuntimeException(e); } } + private void printMenu() { + System.out.println("\n--- Moon Mission Menu ---"); + System.out.println("1. List moon missions"); + System.out.println("2. Get moon mission by id"); + System.out.println("3. Count missions by year"); + System.out.println("4. Create an account"); + System.out.println("5. Update an account password"); + System.out.println("6. Delete an account"); + System.out.println("0. Exit"); + System.out.print("Choice: "); + } + + private void listMoonMissions(Connection conn) throws SQLException { + String query = "SELECT * FROM moon_missions"; + try (PreparedStatement stmt = conn.prepareStatement(query); + ResultSet rs = stmt.executeQuery()) { + + while (rs.next()) { + System.out.println(rs.getString("name")); + } + } + } + /** * Determines if the application is running in development mode based on system properties, * environment variables, or command-line arguments. From 7fbf6213adf7c30646ac57e446e03652b998afbc Mon Sep 17 00:00:00 2001 From: Johan Karlsson <93186588+gurkvatten@users.noreply.github.com> Date: Fri, 12 Dec 2025 12:36:19 +0100 Subject: [PATCH 4/8] fixed login --- src/main/java/com/example/Main.java | 39 ++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 82cb488..e3513ca 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -52,7 +52,6 @@ public void run() { printMenu(); String option = scanner.nextLine(); - switch (option) { switch (option) { case "1": listMoonMissions(connection); @@ -81,7 +80,7 @@ public void run() { default: System.out.println("Invalid option, try again."); } - } + } } catch (SQLException e) { throw new RuntimeException(e); @@ -102,7 +101,7 @@ private void printMenu() { } private void listMoonMissions(Connection conn) throws SQLException { - String query = "SELECT * FROM moon_missions"; + String query = "SELECT * FROM moon_mission"; try (PreparedStatement stmt = conn.prepareStatement(query); ResultSet rs = stmt.executeQuery()) { @@ -112,6 +111,38 @@ private void listMoonMissions(Connection conn) throws SQLException { } } + private void getMoonMissionById(Connection conn, String id) throws SQLException { + String query = "SELECT * FROM moon_mission WHERE mission_id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(query)) { + stmt.setString(1, id); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + System.out.println("Mission: " + rs.getString("name") + + " (ID: " + rs.getInt("mission_id") + + "), Year: " + rs.getInt("launch_year")); + } else { + System.out.println("Mission not found."); + } + } + } + } + + private void countMissionsByYear(Connection conn, String year) throws SQLException { + String query = "SELECT COUNT(*) FROM moon_mission WHERE launch_year = ?"; + try (PreparedStatement stmt = conn.prepareStatement(query)) { + stmt.setString(1, year); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + int count = rs.getInt(1); + System.out.println("Found " + count + " missions in " + year); + } + } + } + } + + + + /** * Determines if the application is running in development mode based on system properties, * environment variables, or command-line arguments. @@ -139,7 +170,7 @@ private static String resolveConfig(String propertyKey, String envKey) { return (v == null || v.trim().isEmpty()) ? null : v.trim(); } private boolean isValidLogin(Connection conn, String user, String pass) throws SQLException { - String query = "SELECT * FROM account WHERE username = ? AND password = ?"; + String query = "SELECT * FROM account WHERE name = ? AND password = ?"; try (PreparedStatement stmt = conn.prepareStatement(query)) { stmt.setString(1, user); From f1f07d7a07f16f32faebd2b4b7f0d8fc4ef02c08 Mon Sep 17 00:00:00 2001 From: Johan Karlsson <93186588+gurkvatten@users.noreply.github.com> Date: Fri, 12 Dec 2025 12:37:37 +0100 Subject: [PATCH 5/8] create account --- src/main/java/com/example/Main.java | 23 ++++++++++++++++++++++- 1 file changed, 22 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index e3513ca..13736df 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -67,7 +67,7 @@ public void run() { countMissionsByYear(connection, yearStr); break; case "4": - System.out.println("Not implemented yet (Step 3)"); + createAccount(connection, scanner); break; case "5": System.out.println("Not implemented yet (Step 3)"); @@ -140,6 +140,27 @@ private void countMissionsByYear(Connection conn, String year) throws SQLExcepti } } + private void createAccount(Connection conn, Scanner sc) throws SQLException { + System.out.print("First name: "); + String first = sc.nextLine(); + System.out.print("Last name: "); + String last = sc.nextLine(); + System.out.print("SSN: "); + String ssn = sc.nextLine(); + System.out.print("Password: "); + String pass = sc.nextLine(); + + String query = "INSERT INTO account (first_name, last_name, ssn, password) VALUES (?, ?, ?, ?)"; + try (PreparedStatement stmt = conn.prepareStatement(query)) { + stmt.setString(1, first); + stmt.setString(2, last); + stmt.setString(3, ssn); + stmt.setString(4, pass); + stmt.executeUpdate(); + System.out.println("Account created."); + } + } + From 595fb35bd35696c17049bc68fd17cb6b49306338 Mon Sep 17 00:00:00 2001 From: Johan Karlsson <93186588+gurkvatten@users.noreply.github.com> Date: Fri, 12 Dec 2025 12:39:33 +0100 Subject: [PATCH 6/8] update password --- src/main/java/com/example/Main.java | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 13736df..00c3e0e 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -70,7 +70,7 @@ public void run() { createAccount(connection, scanner); break; case "5": - System.out.println("Not implemented yet (Step 3)"); + updateAccountPassword(connection, scanner); break; case "6": System.out.println("Not implemented yet (Step 3)"); @@ -161,6 +161,22 @@ private void createAccount(Connection conn, Scanner sc) throws SQLException { } } + private void updateAccountPassword(Connection conn, Scanner sc) throws SQLException { + System.out.print("Enter user_id: "); + String id = sc.nextLine(); + System.out.print("Enter new password: "); + String pass = sc.nextLine(); + + String query = "UPDATE account SET password = ? WHERE user_id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(query)) { + stmt.setString(1, pass); + stmt.setString(2, id); + int rows = stmt.executeUpdate(); + if (rows > 0) System.out.println("Password updated."); + else System.out.println("User not found."); + } + } + From 28d8d43559184ff7cfb1769ed46d012642767196 Mon Sep 17 00:00:00 2001 From: Johan Karlsson <93186588+gurkvatten@users.noreply.github.com> Date: Fri, 12 Dec 2025 12:51:36 +0100 Subject: [PATCH 7/8] delete account and fixed tables --- src/main/java/com/example/Main.java | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 00c3e0e..c2a228a 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -73,7 +73,7 @@ public void run() { updateAccountPassword(connection, scanner); break; case "6": - System.out.println("Not implemented yet (Step 3)"); + deleteAccount(connection, scanner); break; case "0": return; @@ -106,7 +106,7 @@ private void listMoonMissions(Connection conn) throws SQLException { ResultSet rs = stmt.executeQuery()) { while (rs.next()) { - System.out.println(rs.getString("name")); + System.out.println(rs.getString("spacecraft")); } } } @@ -117,9 +117,11 @@ private void getMoonMissionById(Connection conn, String id) throws SQLException stmt.setString(1, id); try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { - System.out.println("Mission: " + rs.getString("name") + - " (ID: " + rs.getInt("mission_id") + - "), Year: " + rs.getInt("launch_year")); + String dateStr = rs.getString("launch_date"); + String year = (dateStr != null && dateStr.length() >= 4) ? dateStr.substring(0, 4) : "N/A"; + + System.out.println("Mission: " + rs.getString("spacecraft") + + ", Year: " + year); } else { System.out.println("Mission not found."); } @@ -128,13 +130,13 @@ private void getMoonMissionById(Connection conn, String id) throws SQLException } private void countMissionsByYear(Connection conn, String year) throws SQLException { - String query = "SELECT COUNT(*) FROM moon_mission WHERE launch_year = ?"; + String query = "SELECT COUNT(*) FROM moon_mission WHERE YEAR(launch_date) = ?"; try (PreparedStatement stmt = conn.prepareStatement(query)) { stmt.setString(1, year); try (ResultSet rs = stmt.executeQuery()) { if (rs.next()) { int count = rs.getInt(1); - System.out.println("Found " + count + " missions in " + year); + System.out.println("Missions in " + year + ": " + count); } } } @@ -176,6 +178,18 @@ private void updateAccountPassword(Connection conn, Scanner sc) throws SQLExcept else System.out.println("User not found."); } } + private void deleteAccount(Connection conn, Scanner sc) throws SQLException { + System.out.print("Enter user_id: "); + String id = sc.nextLine(); + + String query = "DELETE FROM account WHERE user_id = ?"; + try (PreparedStatement stmt = conn.prepareStatement(query)) { + stmt.setString(1, id); + int rows = stmt.executeUpdate(); + if (rows > 0) System.out.println("Account deleted."); + else System.out.println("User not found."); + } + } From 68302ffec41c45fc368599724ea86ddd1b38dfc4 Mon Sep 17 00:00:00 2001 From: Johan Karlsson <93186588+gurkvatten@users.noreply.github.com> Date: Fri, 12 Dec 2025 15:46:13 +0100 Subject: [PATCH 8/8] fixed create account after feedback --- src/main/java/com/example/Main.java | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index c2a228a..77d2987 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -152,14 +152,23 @@ private void createAccount(Connection conn, Scanner sc) throws SQLException { System.out.print("Password: "); String pass = sc.nextLine(); - String query = "INSERT INTO account (first_name, last_name, ssn, password) VALUES (?, ?, ?, ?)"; + String generatedName = ""; + if (first.length() >= 3 && last.length() >= 3) { + generatedName = first.substring(0, 3) + last.substring(0, 3); + } else { + generatedName = first + last; + } + + String query = "INSERT INTO account (name, first_name, last_name, ssn, password) VALUES (?, ?, ?, ?, ?)"; + try (PreparedStatement stmt = conn.prepareStatement(query)) { - stmt.setString(1, first); - stmt.setString(2, last); - stmt.setString(3, ssn); - stmt.setString(4, pass); + stmt.setString(1, generatedName); // Sätter det genererade namnet + stmt.setString(2, first); + stmt.setString(3, last); + stmt.setString(4, ssn); + stmt.setString(5, pass); stmt.executeUpdate(); - System.out.println("Account created."); + System.out.println("Account created. Your username is: " + generatedName); } }