From 28362c42bbe5ddfcecb327685d3675c1ba5fed4d Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 12:59:41 +0000 Subject: [PATCH 01/10] 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 ae2ab2211bab8031f4c85b66c38653ed251727a7 Mon Sep 17 00:00:00 2001 From: Fredrik Mohlen Date: Wed, 10 Dec 2025 10:13:09 +0100 Subject: [PATCH 02/10] 4 tests approved, started on 5, assignment 3 count... --- pom.xml | 5 + src/main/java/com/example/Main.java | 211 +++++++++++++++++++++++++--- 2 files changed, 194 insertions(+), 22 deletions(-) diff --git a/pom.xml b/pom.xml index 002ff66..5bd8e26 100644 --- a/pom.xml +++ b/pom.xml @@ -51,6 +51,11 @@ mysql 1.21.3 + + org.slf4j + slf4j-nop + 2.0.17 + diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 6dc6fbd..3962f85 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -1,9 +1,9 @@ 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 { @@ -14,25 +14,6 @@ static void main(String[] args) { new Main().run(); } - public void run() { - // Resolve DB settings with precedence: System properties -> Environment variables - String jdbcUrl = resolveConfig("APP_JDBC_URL", "APP_JDBC_URL"); - String dbUser = resolveConfig("APP_DB_USER", "APP_DB_USER"); - String dbPass = resolveConfig("APP_DB_PASS", "APP_DB_PASS"); - - if (jdbcUrl == null || dbUser == null || dbPass == null) { - throw new IllegalStateException( - "Missing DB configuration. Provide APP_JDBC_URL, APP_DB_USER, APP_DB_PASS " + - "as system properties (-Dkey=value) or environment variables."); - } - - try (Connection connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass)) { - } catch (SQLException e) { - throw new RuntimeException(e); - } - //Todo: Starting point for your code - } - /** * Determines if the application is running in development mode based on system properties, * environment variables, or command-line arguments. @@ -59,4 +40,190 @@ private static String resolveConfig(String propertyKey, String envKey) { } return (v == null || v.trim().isEmpty()) ? null : v.trim(); } + + public void run() { + // Resolve DB settings with precedence: System properties -> Environment variables + String jdbcUrl = resolveConfig("APP_JDBC_URL", "APP_JDBC_URL"); + String dbUser = resolveConfig("APP_DB_USER", "APP_DB_USER"); + String dbPass = resolveConfig("APP_DB_PASS", "APP_DB_PASS"); + + if (jdbcUrl == null || dbUser == null || dbPass == null) { + throw new IllegalStateException( + "Missing DB configuration. Provide APP_JDBC_URL, APP_DB_USER, APP_DB_PASS " + + "as system properties (-Dkey=value) or environment variables."); + } + + try (Connection connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass)) { + + Scanner scanner = new Scanner(System.in); + + System.out.print("Username: "); + if (!scanner.hasNextLine()) { + return; // Hantera EOF i testmiljön + } + String username = scanner.nextLine(); + + System.out.print("Password: "); + if (!scanner.hasNextLine()) { + return; // Hantera EOF i testmiljön + } + String password = scanner.nextLine(); + + String sql = " select name from account where name = ? and password = ? "; + + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, username); + stmt.setString(2, password); + + try (ResultSet rs = stmt.executeQuery()) { + + if (rs.next()) { + + boolean running = true; + while (running) { + System.out.println(""" + + Press a number for next assignment: + + 1) List moon missions (prints spacecraft names from `moon_mission`). + 2) Get a moon mission by mission_id (prints details for that mission). + 3) Count missions for a given year (prompts: year; prints the number of missions launched that year). + 4) Create an account (prompts: first name, last name, ssn, password; prints confirmation). + 5) Update an account password (prompts: user_id, new password; prints confirmation). + 6) Delete an account (prompts: user_id; prints confirmation). + 0) Exit. + """); + + System.out.println("Choose (0-6): "); + if (!scanner.hasNextInt()) { + running = false; + break; + } + String choiceStr = scanner.nextLine().trim(); + + int choice; + try { + choice = Integer.parseInt(choiceStr); + } catch (NumberFormatException e) { + System.out.println("Invalid input. Please enter a number (0-6)."); + continue; + } + switch (choice) { + case 0: + System.out.println("Exiting application. Goodbye!"); + running = false; + break; + case 1: + System.out.println("Executing: 1) List moon missions..."); + listMoonMissions(connection); + break; + case 2: + System.out.println("Executing: 2) Get a moon mission by mission_id..."); + moonMissionsById(connection, scanner); + break; + case 3: + System.out.println("Executing: 3) Count missions for a given year..."); + // Todo: Prompt for year, then SQL SELECT COUNT(*) FROM moon_mission WHERE YEAR(launch_date) = ? + countingMissionsForAGivenYear(connection, scanner); + break; + case 4: + System.out.println("Executing: 4) Create an account..."); + // Todo: Prompt for first name, last name, ssn, password, then SQL INSERT INTO account (...) VALUES (...) + break; + case 5: + System.out.println("Executing: 5) Update an account password..."); + // Todo: Prompt for user_id, new password, then SQL UPDATE account SET password = ? WHERE user_id = ? + break; + case 6: + System.out.println("Executing: 6) Delete an account..."); + // Todo: Prompt for user_id, then SQL DELETE FROM account WHERE user_id = ? + break; + default: + System.out.println("Invalid choice. Please enter a number between 0 and 6."); + + } + } + } else { + System.out.println("Invalid username or password"); + System.out.println("Exit by pressing '0'"); + String exit = scanner.nextLine(); + if (exit.equals("0")) { + System.exit(0); + + } + } + + } + } + + } catch (SQLException e) { + throw new RuntimeException("Database operation failed. " + e.getMessage()); + } + //Todo: Starting point for your code + + + } + + private void countingMissionsForAGivenYear(Connection connection, Scanner scanner) { + System.out.println("Enter year: "); + if (!scanner.hasNextInt()) { + return; + } + int year = scanner.nextInt(); + String sql = " select count(*) from moon_mission where year(launch_date) = ?"; + } + + private void moonMissionsById(Connection connection, Scanner scanner) { + System.out.println("Enter moon mission id: "); + if (!scanner.hasNextInt()) { + return; + } + String missionId = scanner.nextLine().trim(); + + String sql = "select spacecraft, mission_id, mission_type, launch_date from moon_mission where mission_id = ?"; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + long id; + try { + id = Long.parseLong(missionId); + stmt.setLong(1, id); + } catch (NumberFormatException e) { + System.out.println("Invalid moon mission id. Please enter a number"); + return; + } + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + System.out.println("ID: " + rs.getLong("mission_id")); + System.out.println("Spacecraft: " + rs.getString("spacecraft")); + System.out.println("Mission type: " + rs.getString("mission_type")); + System.out.println("Launch date: " + rs.getString("launch_date")); + } else { + System.out.println("Mission id " + missionId + " not found. Please enter a number"); + } + } + + } catch (SQLException e) { + throw new RuntimeException(e); + } + + + } + + private void listMoonMissions(Connection connection) { + String sql = "select spacecraft from moon_mission order by spacecraft"; + try (PreparedStatement stmt = connection.prepareStatement(sql); + ResultSet rs = stmt.executeQuery()) { + boolean found = false; + while (rs.next()) { + System.out.println(rs.getString("spacecraft")); + found = true; + } + if (!found) { + System.out.println("No moon missions found."); + } + + } catch (SQLException e) { + throw new RuntimeException("Error executing List Moon Missions: \" + e.getMessage(), e"); + } + } } From aea233e3f649818c3870c65f158e0c5428817d12 Mon Sep 17 00:00:00 2001 From: Fredrik Mohlen Date: Wed, 10 Dec 2025 10:50:02 +0100 Subject: [PATCH 03/10] test (5) approved --- src/main/java/com/example/Main.java | 21 ++++++++++++++++++++- 1 file changed, 20 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 3962f85..d02e6d3 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -167,10 +167,29 @@ public void run() { private void countingMissionsForAGivenYear(Connection connection, Scanner scanner) { System.out.println("Enter year: "); if (!scanner.hasNextInt()) { + scanner.nextLine(); + System.out.println("Invalid year"); return; } int year = scanner.nextInt(); - String sql = " select count(*) from moon_mission where year(launch_date) = ?"; + scanner.nextLine(); + + String sql = " select count(*) as mission_count from moon_mission where year(launch_date) = ?"; + + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setInt(1, year); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + int count = rs.getInt("mission_count"); + System.out.println("Mission count for year: " + year); + System.out.println("Number of moon missions: " + count ); + } else + System.out.println("No moon missions for year: " + year); + } + } catch (SQLException e) { + throw new RuntimeException(e); + } } private void moonMissionsById(Connection connection, Scanner scanner) { From 41cde285823e208e75c85e4bc2d76be824db8574 Mon Sep 17 00:00:00 2001 From: Fredrik Mohlen Date: Wed, 10 Dec 2025 11:21:43 +0100 Subject: [PATCH 04/10] test (6) approved --- src/main/java/com/example/Main.java | 33 ++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index d02e6d3..290f8bf 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -123,12 +123,12 @@ public void run() { break; case 3: System.out.println("Executing: 3) Count missions for a given year..."); - // Todo: Prompt for year, then SQL SELECT COUNT(*) FROM moon_mission WHERE YEAR(launch_date) = ? countingMissionsForAGivenYear(connection, scanner); break; case 4: System.out.println("Executing: 4) Create an account..."); // Todo: Prompt for first name, last name, ssn, password, then SQL INSERT INTO account (...) VALUES (...) + createAnAccount(connection, scanner); break; case 5: System.out.println("Executing: 5) Update an account password..."); @@ -164,6 +164,37 @@ public void run() { } + private void createAnAccount(Connection connection, Scanner scanner) { + System.out.println("Creating an account..."); + System.out.print("Enter first name: "); + String firstName = scanner.nextLine().trim(); + System.out.print("Enter last name: "); + String lastName = scanner.nextLine().trim(); + System.out.print("Enter ssn: "); + String ssn = scanner.nextLine().trim(); + System.out.print("Enter password: "); + String password = scanner.nextLine().trim(); + String name = firstName.substring(0,3) + lastName.substring(0,3); + + String sql = "INSERT INTO account (first_name, last_name, ssn, password, name) VALUES (?, ?, ?, ?, ?)"; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, firstName); + stmt.setString(2, lastName); + stmt.setString(3, ssn); + stmt.setString(4, password); + stmt.setString(5, name); + + int affectedRows = stmt.executeUpdate(); + if (affectedRows > 0) { + System.out.println("Successfully created an account for " + firstName + " " + lastName); + } else + System.out.println("Failed to create an account."); + + } catch (SQLException e) { + throw new RuntimeException("Database operation failed. " + e.getMessage()); + } + } + private void countingMissionsForAGivenYear(Connection connection, Scanner scanner) { System.out.println("Enter year: "); if (!scanner.hasNextInt()) { From 9b610c54bb9dcc04263dd16b46c8db5418cd3a0d Mon Sep 17 00:00:00 2001 From: Fredrik Mohlen Date: Wed, 10 Dec 2025 13:32:38 +0100 Subject: [PATCH 05/10] all tests approved --- src/main/java/com/example/Main.java | 52 +++++++++++++++++++++++++++-- 1 file changed, 49 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 290f8bf..408f71e 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -127,16 +127,16 @@ public void run() { break; case 4: System.out.println("Executing: 4) Create an account..."); - // Todo: Prompt for first name, last name, ssn, password, then SQL INSERT INTO account (...) VALUES (...) createAnAccount(connection, scanner); break; case 5: System.out.println("Executing: 5) Update an account password..."); - // Todo: Prompt for user_id, new password, then SQL UPDATE account SET password = ? WHERE user_id = ? + updateAccountPassword(connection, scanner); break; case 6: System.out.println("Executing: 6) Delete an account..."); // Todo: Prompt for user_id, then SQL DELETE FROM account WHERE user_id = ? + deleteAccount(connection, scanner); break; default: System.out.println("Invalid choice. Please enter a number between 0 and 6."); @@ -164,6 +164,52 @@ public void run() { } + private void deleteAccount(Connection connection, Scanner scanner) { + System.out.println("Enter user id, that you wish to delete: "); + if (!scanner.hasNextLine()) { return; } + String userId = scanner.nextLine(); + + String sql = " delete from account where user_id = ? "; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, userId); + + int affectedRows = stmt.executeUpdate(); + if (affectedRows > 0) { + System.out.println("Successfully deleted the account."); + } else { + System.out.println("Failed to delete the account."); + } + } catch (SQLException e) { + throw new RuntimeException("Database operation failed. " + e.getMessage()); + } + } + + private void updateAccountPassword(Connection connection, Scanner scanner) { + System.out.println("Enter user_id: "); + if (!scanner.hasNextLine()) { return; } + String userId = scanner.nextLine(); + System.out.println("Enter new password: "); + if (!scanner.hasNextLine()) { return; } + String newPassword = scanner.nextLine(); + + String sql = " update account set password = ? where user_id = ? "; + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, newPassword); + stmt.setString(2, userId); + + int affectedRows = stmt.executeUpdate(); + + if (affectedRows > 0) { + System.out.println("Account updated successfully."); + } else { + System.out.println("Failed to update account."); + } + + } catch (SQLException e){ + System.out.println("Failed to update account."); + } + } + private void createAnAccount(Connection connection, Scanner scanner) { System.out.println("Creating an account..."); System.out.print("Enter first name: "); @@ -260,7 +306,7 @@ private void moonMissionsById(Connection connection, Scanner scanner) { } private void listMoonMissions(Connection connection) { - String sql = "select spacecraft from moon_mission order by spacecraft"; + String sql = " select spacecraft from moon_mission order by spacecraft "; try (PreparedStatement stmt = connection.prepareStatement(sql); ResultSet rs = stmt.executeQuery()) { boolean found = false; From c12ed443d7b4484a3973431bf9bfbfc4bdea5c6b Mon Sep 17 00:00:00 2001 From: Fredrik Mohlen Date: Wed, 10 Dec 2025 13:53:54 +0100 Subject: [PATCH 06/10] all tests approved + small improvements --- src/main/java/com/example/Main.java | 67 +++++++++++++++-------------- 1 file changed, 34 insertions(+), 33 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 408f71e..d58a766 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -53,21 +53,20 @@ public void run() { "as system properties (-Dkey=value) or environment variables."); } - try (Connection connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass)) { - - Scanner scanner = new Scanner(System.in); + try (Connection connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + Scanner scanner = new Scanner(System.in)) { System.out.print("Username: "); if (!scanner.hasNextLine()) { return; // Hantera EOF i testmiljön } - String username = scanner.nextLine(); + String username = scanner.nextLine().trim(); System.out.print("Password: "); if (!scanner.hasNextLine()) { return; // Hantera EOF i testmiljön } - String password = scanner.nextLine(); + String password = scanner.nextLine().trim(); String sql = " select name from account where name = ? and password = ? "; @@ -94,8 +93,8 @@ public void run() { 0) Exit. """); - System.out.println("Choose (0-6): "); - if (!scanner.hasNextInt()) { + System.out.print("Choose (0-6): "); + if (!scanner.hasNextLine()) { running = false; break; } @@ -136,7 +135,7 @@ public void run() { case 6: System.out.println("Executing: 6) Delete an account..."); // Todo: Prompt for user_id, then SQL DELETE FROM account WHERE user_id = ? - deleteAccount(connection, scanner); + deleteAccount(connection, scanner); break; default: System.out.println("Invalid choice. Please enter a number between 0 and 6."); @@ -144,16 +143,11 @@ public void run() { } } } else { - System.out.println("Invalid username or password"); - System.out.println("Exit by pressing '0'"); - String exit = scanner.nextLine(); - if (exit.equals("0")) { - System.exit(0); + System.out.println("Invalid username or password. Exiting"); - } } - } + } } catch (SQLException e) { @@ -166,7 +160,9 @@ public void run() { private void deleteAccount(Connection connection, Scanner scanner) { System.out.println("Enter user id, that you wish to delete: "); - if (!scanner.hasNextLine()) { return; } + if (!scanner.hasNextLine()) { + return; + } String userId = scanner.nextLine(); String sql = " delete from account where user_id = ? "; @@ -176,7 +172,7 @@ private void deleteAccount(Connection connection, Scanner scanner) { int affectedRows = stmt.executeUpdate(); if (affectedRows > 0) { System.out.println("Successfully deleted the account."); - } else { + } else { System.out.println("Failed to delete the account."); } } catch (SQLException e) { @@ -186,10 +182,14 @@ private void deleteAccount(Connection connection, Scanner scanner) { private void updateAccountPassword(Connection connection, Scanner scanner) { System.out.println("Enter user_id: "); - if (!scanner.hasNextLine()) { return; } + if (!scanner.hasNextLine()) { + return; + } String userId = scanner.nextLine(); System.out.println("Enter new password: "); - if (!scanner.hasNextLine()) { return; } + if (!scanner.hasNextLine()) { + return; + } String newPassword = scanner.nextLine(); String sql = " update account set password = ? where user_id = ? "; @@ -201,12 +201,13 @@ private void updateAccountPassword(Connection connection, Scanner scanner) { if (affectedRows > 0) { System.out.println("Account updated successfully."); - } else { + } else { System.out.println("Failed to update account."); } - } catch (SQLException e){ - System.out.println("Failed to update account."); + } catch (SQLException e) { + System.err.println("ERROR: Failed to update password."); + throw new RuntimeException("Database operation failed. " + e.getMessage()); } } @@ -220,7 +221,7 @@ private void createAnAccount(Connection connection, Scanner scanner) { String ssn = scanner.nextLine().trim(); System.out.print("Enter password: "); String password = scanner.nextLine().trim(); - String name = firstName.substring(0,3) + lastName.substring(0,3); + String name = firstName.substring(0, 3) + lastName.substring(0, 3); String sql = "INSERT INTO account (first_name, last_name, ssn, password, name) VALUES (?, ?, ?, ?, ?)"; try (PreparedStatement stmt = connection.prepareStatement(sql)) { @@ -249,21 +250,21 @@ private void countingMissionsForAGivenYear(Connection connection, Scanner scanne return; } int year = scanner.nextInt(); - scanner.nextLine(); + scanner.nextLine(); String sql = " select count(*) as mission_count from moon_mission where year(launch_date) = ?"; try (PreparedStatement stmt = connection.prepareStatement(sql)) { - stmt.setInt(1, year); + stmt.setInt(1, year); - try (ResultSet rs = stmt.executeQuery()) { - if (rs.next()) { - int count = rs.getInt("mission_count"); - System.out.println("Mission count for year: " + year); - System.out.println("Number of moon missions: " + count ); - } else - System.out.println("No moon missions for year: " + year); - } + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + int count = rs.getInt("mission_count"); + System.out.println("Mission count for year: " + year); + System.out.println("Number of moon missions: " + count); + } else + System.out.println("No moon missions for year: " + year); + } } catch (SQLException e) { throw new RuntimeException(e); } From afbba8b6f04f63dffab9fa02856f5dc4b5a145db Mon Sep 17 00:00:00 2001 From: Fredrik Mohlen Date: Wed, 10 Dec 2025 15:11:38 +0100 Subject: [PATCH 07/10] all tests approved, authenticateUser method --- src/main/java/com/example/Main.java | 188 ++++++++++++++-------------- 1 file changed, 97 insertions(+), 91 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index d58a766..2de19e2 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -56,108 +56,116 @@ public void run() { try (Connection connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); Scanner scanner = new Scanner(System.in)) { - System.out.print("Username: "); - if (!scanner.hasNextLine()) { - return; // Hantera EOF i testmiljön - } - String username = scanner.nextLine().trim(); - - System.out.print("Password: "); - if (!scanner.hasNextLine()) { - return; // Hantera EOF i testmiljön + String loggedInUser = authenticateUser(connection, scanner); + if (loggedInUser == null) { + System.out.println("Invalid username or password. Exiting"); + return; } - String password = scanner.nextLine().trim(); - - String sql = " select name from account where name = ? and password = ? "; - - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - stmt.setString(1, username); - stmt.setString(2, password); - - try (ResultSet rs = stmt.executeQuery()) { - - if (rs.next()) { - - boolean running = true; - while (running) { - System.out.println(""" - - Press a number for next assignment: - - 1) List moon missions (prints spacecraft names from `moon_mission`). - 2) Get a moon mission by mission_id (prints details for that mission). - 3) Count missions for a given year (prompts: year; prints the number of missions launched that year). - 4) Create an account (prompts: first name, last name, ssn, password; prints confirmation). - 5) Update an account password (prompts: user_id, new password; prints confirmation). - 6) Delete an account (prompts: user_id; prints confirmation). - 0) Exit. - """); - - System.out.print("Choose (0-6): "); - if (!scanner.hasNextLine()) { - running = false; - break; - } - String choiceStr = scanner.nextLine().trim(); - - int choice; - try { - choice = Integer.parseInt(choiceStr); - } catch (NumberFormatException e) { - System.out.println("Invalid input. Please enter a number (0-6)."); - continue; - } - switch (choice) { - case 0: - System.out.println("Exiting application. Goodbye!"); - running = false; - break; - case 1: - System.out.println("Executing: 1) List moon missions..."); - listMoonMissions(connection); - break; - case 2: - System.out.println("Executing: 2) Get a moon mission by mission_id..."); - moonMissionsById(connection, scanner); - break; - case 3: - System.out.println("Executing: 3) Count missions for a given year..."); - countingMissionsForAGivenYear(connection, scanner); - break; - case 4: - System.out.println("Executing: 4) Create an account..."); - createAnAccount(connection, scanner); - break; - case 5: - System.out.println("Executing: 5) Update an account password..."); - updateAccountPassword(connection, scanner); - break; - case 6: - System.out.println("Executing: 6) Delete an account..."); - // Todo: Prompt for user_id, then SQL DELETE FROM account WHERE user_id = ? - deleteAccount(connection, scanner); - break; - default: - System.out.println("Invalid choice. Please enter a number between 0 and 6."); - - } - } - } else { - System.out.println("Invalid username or password. Exiting"); - - } + System.out.println("\nWelcome, " + loggedInUser + "!"); + boolean running = true; + while (running) { + System.out.println(""" + + Press a number for next assignment: + + 1) List moon missions (prints spacecraft names from `moon_mission`). + 2) Get a moon mission by mission_id (prints details for that mission). + 3) Count missions for a given year (prompts: year; prints the number of missions launched that year). + 4) Create an account (prompts: first name, last name, ssn, password; prints confirmation). + 5) Update an account password (prompts: user_id, new password; prints confirmation). + 6) Delete an account (prompts: user_id; prints confirmation). + 0) Exit. + """); + + System.out.print("Choose (0-6): "); + if (!scanner.hasNextLine()) { + running = false; + break; + } + String choiceStr = scanner.nextLine().trim(); + + int choice; + try { + choice = Integer.parseInt(choiceStr); + } catch (NumberFormatException e) { + System.out.println("Invalid input. Please enter a number (0-6)."); + continue; } + switch (choice) { + case 0: + System.out.println("Exiting application. Goodbye!"); + running = false; + break; + case 1: + System.out.println("Executing: 1) List moon missions..."); + listMoonMissions(connection); + break; + case 2: + System.out.println("Executing: 2) Get a moon mission by mission_id..."); + moonMissionsById(connection, scanner); + break; + case 3: + System.out.println("Executing: 3) Count missions for a given year..."); + countingMissionsForAGivenYear(connection, scanner); + break; + case 4: + System.out.println("Executing: 4) Create an account..."); + createAnAccount(connection, scanner); + break; + case 5: + System.out.println("Executing: 5) Update an account password..."); + updateAccountPassword(connection, scanner); + break; + case 6: + System.out.println("Executing: 6) Delete an account..."); + deleteAccount(connection, scanner); + break; + default: + System.out.println("Invalid choice. Please enter a number between 0 and 6."); + + } } } catch (SQLException e) { throw new RuntimeException("Database operation failed. " + e.getMessage()); } //Todo: Starting point for your code + } + + + private String authenticateUser(Connection connection, Scanner scanner) { + System.out.print("Username: "); + if (!scanner.hasNextLine()) { + return null; // Hantera EOF i testmiljön + } + String username = scanner.nextLine().trim(); + + System.out.print("Password: "); + if (!scanner.hasNextLine()) { + return null; // Hantera EOF i testmiljön + } + String password = scanner.nextLine().trim(); + String sql = " select name from account where name = ? and password = ? "; + + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setString(1, username); + stmt.setString(2, password); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + return rs.getString("name"); + } else { + return null; + } + } + } catch (SQLException ex) { + throw new RuntimeException(ex); + } } + private void deleteAccount(Connection connection, Scanner scanner) { System.out.println("Enter user id, that you wish to delete: "); if (!scanner.hasNextLine()) { @@ -302,8 +310,6 @@ private void moonMissionsById(Connection connection, Scanner scanner) { } catch (SQLException e) { throw new RuntimeException(e); } - - } private void listMoonMissions(Connection connection) { From e30ea65ca0cdf290e8ff4fa6924067c188923dd9 Mon Sep 17 00:00:00 2001 From: Fredrik Mohlen Date: Wed, 10 Dec 2025 16:04:04 +0100 Subject: [PATCH 08/10] Changes after checking codeRabbit --- src/main/java/com/example/Main.java | 202 ++++++++++++++-------------- 1 file changed, 102 insertions(+), 100 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 2de19e2..108b80c 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -68,12 +68,12 @@ public void run() { Press a number for next assignment: - 1) List moon missions (prints spacecraft names from `moon_mission`). - 2) Get a moon mission by mission_id (prints details for that mission). - 3) Count missions for a given year (prompts: year; prints the number of missions launched that year). - 4) Create an account (prompts: first name, last name, ssn, password; prints confirmation). - 5) Update an account password (prompts: user_id, new password; prints confirmation). - 6) Delete an account (prompts: user_id; prints confirmation). + 1) List moon missions. + 2) Get a moon mission. + 3) Count missions for a given year. + 4) Create an account. + 5) Update an account password. + 6) Delete an account. 0) Exit. """); @@ -123,14 +123,12 @@ public void run() { break; default: System.out.println("Invalid choice. Please enter a number between 0 and 6."); - } } } catch (SQLException e) { throw new RuntimeException("Database operation failed. " + e.getMessage()); } - //Todo: Starting point for your code } @@ -166,65 +164,96 @@ private String authenticateUser(Connection connection, Scanner scanner) { } - private void deleteAccount(Connection connection, Scanner scanner) { - System.out.println("Enter user id, that you wish to delete: "); + private void listMoonMissions(Connection connection) { + String sql = " select spacecraft from moon_mission order by spacecraft "; + try (PreparedStatement stmt = connection.prepareStatement(sql); + ResultSet rs = stmt.executeQuery()) { + boolean found = false; + while (rs.next()) { + System.out.println(rs.getString("spacecraft")); + found = true; + } + if (!found) { + System.out.println("No moon missions found."); + } + + } catch (SQLException e) { + throw new RuntimeException("Error executing List Moon Missions: " + e.getMessage(), e); + } + } + + private void moonMissionsById(Connection connection, Scanner scanner) { + System.out.println("Enter moon mission id: "); if (!scanner.hasNextLine()) { return; } - String userId = scanner.nextLine(); + String missionId = scanner.nextLine().trim(); + long id; + try { + id = Long.parseLong(missionId); + } catch (NumberFormatException e) { + System.out.println("Invalid moon mission id. Please enter a number"); + return; + } - String sql = " delete from account where user_id = ? "; + String sql = "select spacecraft, mission_id, mission_type, launch_date from moon_mission where mission_id = ?"; try (PreparedStatement stmt = connection.prepareStatement(sql)) { - stmt.setString(1, userId); + stmt.setLong(1, id); - int affectedRows = stmt.executeUpdate(); - if (affectedRows > 0) { - System.out.println("Successfully deleted the account."); - } else { - System.out.println("Failed to delete the account."); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + System.out.println("ID: " + rs.getLong("mission_id")); + System.out.println("Spacecraft: " + rs.getString("spacecraft")); + System.out.println("Mission type: " + rs.getString("mission_type")); + System.out.println("Launch date: " + rs.getString("launch_date")); + } else { + System.out.println("Mission id " + missionId + " not found. Please enter a number"); + } } + } catch (SQLException e) { - throw new RuntimeException("Database operation failed. " + e.getMessage()); + throw new RuntimeException(e); } } - private void updateAccountPassword(Connection connection, Scanner scanner) { - System.out.println("Enter user_id: "); - if (!scanner.hasNextLine()) { - return; - } - String userId = scanner.nextLine(); - System.out.println("Enter new password: "); - if (!scanner.hasNextLine()) { + private void countingMissionsForAGivenYear(Connection connection, Scanner scanner) { + System.out.println("Enter year: "); + if (!scanner.hasNextInt()) { + scanner.nextLine(); + System.out.println("Invalid year"); return; } - String newPassword = scanner.nextLine(); + int year = scanner.nextInt(); + scanner.nextLine(); - String sql = " update account set password = ? where user_id = ? "; - try (PreparedStatement stmt = connection.prepareStatement(sql)) { - stmt.setString(1, newPassword); - stmt.setString(2, userId); + String sql = " select count(*) as mission_count from moon_mission where year(launch_date) = ?"; - int affectedRows = stmt.executeUpdate(); + try (PreparedStatement stmt = connection.prepareStatement(sql)) { + stmt.setInt(1, year); - if (affectedRows > 0) { - System.out.println("Account updated successfully."); - } else { - System.out.println("Failed to update account."); + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + int count = rs.getInt("mission_count"); + System.out.println("Mission count for year: " + year); + System.out.println("Number of moon missions: " + count); + } else + System.out.println("No moon missions for year: " + year); } - } catch (SQLException e) { - System.err.println("ERROR: Failed to update password."); - throw new RuntimeException("Database operation failed. " + e.getMessage()); + throw new RuntimeException(e); } } private void createAnAccount(Connection connection, Scanner scanner) { System.out.println("Creating an account..."); System.out.print("Enter first name: "); + if (!scanner.hasNextLine()) {return;} String firstName = scanner.nextLine().trim(); + if (firstName.length() < 3) { throw new IllegalArgumentException("First name must be at least 3 characters long."); } System.out.print("Enter last name: "); + if (!scanner.hasNextLine()) {return;} String lastName = scanner.nextLine().trim(); + if (lastName.length() < 3) { throw new IllegalArgumentException("First name must be at least 3 characters long."); } System.out.print("Enter ssn: "); String ssn = scanner.nextLine().trim(); System.out.print("Enter password: "); @@ -250,83 +279,56 @@ private void createAnAccount(Connection connection, Scanner scanner) { } } - private void countingMissionsForAGivenYear(Connection connection, Scanner scanner) { - System.out.println("Enter year: "); - if (!scanner.hasNextInt()) { - scanner.nextLine(); - System.out.println("Invalid year"); + private void updateAccountPassword(Connection connection, Scanner scanner) { + System.out.println("Enter user_id: "); + if (!scanner.hasNextLine()) { return; } - int year = scanner.nextInt(); - scanner.nextLine(); - - String sql = " select count(*) as mission_count from moon_mission where year(launch_date) = ?"; + String userId = scanner.nextLine(); + System.out.println("Enter new password: "); + if (!scanner.hasNextLine()) { + return; + } + String newPassword = scanner.nextLine(); + String sql = " update account set password = ? where user_id = ? "; try (PreparedStatement stmt = connection.prepareStatement(sql)) { - stmt.setInt(1, year); + stmt.setString(1, newPassword); + stmt.setString(2, userId); - try (ResultSet rs = stmt.executeQuery()) { - if (rs.next()) { - int count = rs.getInt("mission_count"); - System.out.println("Mission count for year: " + year); - System.out.println("Number of moon missions: " + count); - } else - System.out.println("No moon missions for year: " + year); + int affectedRows = stmt.executeUpdate(); + + if (affectedRows > 0) { + System.out.println("Account updated successfully."); + } else { + System.out.println("Failed to update account."); } + } catch (SQLException e) { - throw new RuntimeException(e); + System.err.println("ERROR: Failed to update password."); + throw new RuntimeException("Database operation failed. " + e.getMessage()); } } - private void moonMissionsById(Connection connection, Scanner scanner) { - System.out.println("Enter moon mission id: "); - if (!scanner.hasNextInt()) { + private void deleteAccount(Connection connection, Scanner scanner) { + System.out.println("Enter user id, that you wish to delete: "); + if (!scanner.hasNextLine()) { return; } - String missionId = scanner.nextLine().trim(); + String userId = scanner.nextLine(); - String sql = "select spacecraft, mission_id, mission_type, launch_date from moon_mission where mission_id = ?"; + String sql = " delete from account where user_id = ? "; try (PreparedStatement stmt = connection.prepareStatement(sql)) { - long id; - try { - id = Long.parseLong(missionId); - stmt.setLong(1, id); - } catch (NumberFormatException e) { - System.out.println("Invalid moon mission id. Please enter a number"); - return; - } - - try (ResultSet rs = stmt.executeQuery()) { - if (rs.next()) { - System.out.println("ID: " + rs.getLong("mission_id")); - System.out.println("Spacecraft: " + rs.getString("spacecraft")); - System.out.println("Mission type: " + rs.getString("mission_type")); - System.out.println("Launch date: " + rs.getString("launch_date")); - } else { - System.out.println("Mission id " + missionId + " not found. Please enter a number"); - } - } - - } catch (SQLException e) { - throw new RuntimeException(e); - } - } + stmt.setString(1, userId); - private void listMoonMissions(Connection connection) { - String sql = " select spacecraft from moon_mission order by spacecraft "; - try (PreparedStatement stmt = connection.prepareStatement(sql); - ResultSet rs = stmt.executeQuery()) { - boolean found = false; - while (rs.next()) { - System.out.println(rs.getString("spacecraft")); - found = true; - } - if (!found) { - System.out.println("No moon missions found."); + int affectedRows = stmt.executeUpdate(); + if (affectedRows > 0) { + System.out.println("Successfully deleted the account."); + } else { + System.out.println("Failed to delete the account."); } - } catch (SQLException e) { - throw new RuntimeException("Error executing List Moon Missions: \" + e.getMessage(), e"); + throw new RuntimeException("Database operation failed. " + e.getMessage()); } } } From 0608d2de7561f8c7d29707077b692ad449ae8626 Mon Sep 17 00:00:00 2001 From: Fredrik Mohlen Date: Thu, 11 Dec 2025 10:48:17 +0100 Subject: [PATCH 09/10] Changes after removing nextInt --- src/main/java/com/example/Main.java | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 108b80c..557940d 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -218,13 +218,11 @@ private void moonMissionsById(Connection connection, Scanner scanner) { private void countingMissionsForAGivenYear(Connection connection, Scanner scanner) { System.out.println("Enter year: "); - if (!scanner.hasNextInt()) { - scanner.nextLine(); + if (!scanner.hasNextLine()) { System.out.println("Invalid year"); return; } - int year = scanner.nextInt(); - scanner.nextLine(); + int year = Integer.parseInt(scanner.nextLine()); String sql = " select count(*) as mission_count from moon_mission where year(launch_date) = ?"; From 38b25693e4cfaf7d15e04b214ac007c2e6664fbb Mon Sep 17 00:00:00 2001 From: Fredrik Mohlen Date: Fri, 12 Dec 2025 13:55:33 +0100 Subject: [PATCH 10/10] Changes after coderabbit suggestions --- src/main/java/com/example/Main.java | 33 +++++++++++++++++++++++------ 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 557940d..fdd7ab8 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -127,7 +127,7 @@ public void run() { } } catch (SQLException e) { - throw new RuntimeException("Database operation failed. " + e.getMessage()); + throw new RuntimeException("Database operation failed. " + e.getMessage(), e); } } @@ -192,7 +192,7 @@ private void moonMissionsById(Connection connection, Scanner scanner) { try { id = Long.parseLong(missionId); } catch (NumberFormatException e) { - System.out.println("Invalid moon mission id. Please enter a number"); + System.out.println("Invalid moon mission id."); return; } @@ -222,7 +222,14 @@ private void countingMissionsForAGivenYear(Connection connection, Scanner scanne System.out.println("Invalid year"); return; } - int year = Integer.parseInt(scanner.nextLine()); + String yearString = scanner.nextLine().trim(); + int year; + try { + year = Integer.parseInt(yearString); + } catch (NumberFormatException e) { + System.out.println("Invalid year. Please enter a number (e.g. 1987)."); + return; + } String sql = " select count(*) as mission_count from moon_mission where year(launch_date) = ?"; @@ -247,14 +254,18 @@ private void createAnAccount(Connection connection, Scanner scanner) { System.out.print("Enter first name: "); if (!scanner.hasNextLine()) {return;} String firstName = scanner.nextLine().trim(); - if (firstName.length() < 3) { throw new IllegalArgumentException("First name must be at least 3 characters long."); } + if (firstName.length() < 3) { + System.out.println("First name must be at least 3 characters long."); return; } System.out.print("Enter last name: "); if (!scanner.hasNextLine()) {return;} String lastName = scanner.nextLine().trim(); - if (lastName.length() < 3) { throw new IllegalArgumentException("First name must be at least 3 characters long."); } + if (lastName.length() < 3) { + System.out.println("Last name must be at least 3 characters long."); return; } System.out.print("Enter ssn: "); + if (!scanner.hasNextLine()) {return;} String ssn = scanner.nextLine().trim(); System.out.print("Enter password: "); + if (!scanner.hasNextLine()) {return;} String password = scanner.nextLine().trim(); String name = firstName.substring(0, 3) + lastName.substring(0, 3); @@ -282,7 +293,15 @@ private void updateAccountPassword(Connection connection, Scanner scanner) { if (!scanner.hasNextLine()) { return; } - String userId = scanner.nextLine(); + String userIdStr = scanner.nextLine().trim(); + long userId; + try { + userId = Long.parseLong(userIdStr); + } catch (NumberFormatException e) { + System.out.println("Invalid user_id. Please enter a number"); + return; + } + System.out.println("Enter new password: "); if (!scanner.hasNextLine()) { return; @@ -292,7 +311,7 @@ private void updateAccountPassword(Connection connection, Scanner scanner) { String sql = " update account set password = ? where user_id = ? "; try (PreparedStatement stmt = connection.prepareStatement(sql)) { stmt.setString(1, newPassword); - stmt.setString(2, userId); + stmt.setLong(2, userId); int affectedRows = stmt.executeUpdate();