From ada5d584668bbd3c3a9275159539f01bc92b608c Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Mon, 8 Dec 2025 09:40:19 +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 d2911143ecb24d29dd619085bc6dc89233cbeba3 Mon Sep 17 00:00:00 2001 From: Rickard Ankar Date: Mon, 8 Dec 2025 11:44:04 +0100 Subject: [PATCH 02/10] =?UTF-8?q?Lagt=20till=20inloggningsfl=C3=B6de=20som?= =?UTF-8?q?=20g=C3=B6r=20att=20test=201=20och=202=20passerar?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 65 ++++++++++++++++++++--------- 1 file changed, 45 insertions(+), 20 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 6dc6fbd..06e14f6 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 { @@ -15,7 +14,6 @@ static void main(String[] args) { } 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"); @@ -30,28 +28,55 @@ public void run() { } catch (SQLException e) { throw new RuntimeException(e); } - //Todo: Starting point for your code + + Scanner scanner = new Scanner(System.in); + + System.out.print("Username: "); + String username = scanner.nextLine().trim(); + + System.out.print("Password: "); + String password = scanner.nextLine().trim(); + + if (!validateLogin(jdbcUrl, dbUser, dbPass, username, password)) { + System.out.println("Invalid username or password."); + System.out.println("0) Exit"); + scanner.nextLine(); + scanner.close(); + return; + } + + System.out.println("Login successful!"); + scanner.close(); + } + + private boolean validateLogin(String jdbcUrl, String dbUser, String dbPass, + String username, String password) { + String sql = "SELECT user_id FROM account WHERE name = ? AND password = ?"; + + try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setString(1, username); + stmt.setString(2, password); + + try (ResultSet rs = stmt.executeQuery()) { + return rs.next(); + } + + } catch (SQLException e) { + System.err.println("Database error: " + e.getMessage()); + return false; + } } - /** - * Determines if the application is running in development mode based on system properties, - * environment variables, or command-line arguments. - * - * @param args an array of command-line arguments - * @return {@code true} if the application is in development mode; {@code false} otherwise - */ private static boolean isDevMode(String[] args) { - if (Boolean.getBoolean("devMode")) //Add VM option -DdevMode=true + if (Boolean.getBoolean("devMode")) return true; - if ("true".equalsIgnoreCase(System.getenv("DEV_MODE"))) //Environment variable DEV_MODE=true + if ("true".equalsIgnoreCase(System.getenv("DEV_MODE"))) return true; - return Arrays.asList(args).contains("--dev"); //Argument --dev + return Arrays.asList(args).contains("--dev"); } - /** - * Reads configuration with precedence: Java system property first, then environment variable. - * Returns trimmed value or null if neither source provides a non-empty value. - */ private static String resolveConfig(String propertyKey, String envKey) { String v = System.getProperty(propertyKey); if (v == null || v.trim().isEmpty()) { @@ -59,4 +84,4 @@ private static String resolveConfig(String propertyKey, String envKey) { } return (v == null || v.trim().isEmpty()) ? null : v.trim(); } -} +} \ No newline at end of file From 2a4b3a1cdfcc912bbb6f1da5395a961095499e21 Mon Sep 17 00:00:00 2001 From: Rickard Ankar Date: Mon, 8 Dec 2025 12:39:42 +0100 Subject: [PATCH 03/10] implementerat menyloop med listfunktion --- src/main/java/com/example/Main.java | 33 +++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 06e14f6..c481eac 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -14,6 +14,7 @@ static void main(String[] args) { } public void run() { + // Resolve database configuration 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"); @@ -24,6 +25,7 @@ public void run() { "as system properties (-Dkey=value) or environment variables."); } + // Test connection try (Connection connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass)) { } catch (SQLException e) { throw new RuntimeException(e); @@ -31,6 +33,7 @@ public void run() { Scanner scanner = new Scanner(System.in); + // Login flow System.out.print("Username: "); String username = scanner.nextLine().trim(); @@ -46,9 +49,39 @@ public void run() { } System.out.println("Login successful!"); + + // Menu loop + boolean running = true; + while (running) { + String choice = scanner.nextLine().trim(); + + if (choice.equals("1")) { + listMoonMissions(jdbcUrl, dbUser, dbPass); + } else if (choice.equals("0")) { + running = false; + } + } + scanner.close(); } + // List all moon missions + private void listMoonMissions(String jdbcUrl, String dbUser, String dbPass) { + String sql = "SELECT spacecraft FROM moon_mission"; + + try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql)) { + + while (rs.next()) { + System.out.println(rs.getString("spacecraft")); + } + + } catch (SQLException e) { + System.err.println("Database error: " + e.getMessage()); + } + } + private boolean validateLogin(String jdbcUrl, String dbUser, String dbPass, String username, String password) { String sql = "SELECT user_id FROM account WHERE name = ? AND password = ?"; From f062fedbbfa010d9b8d35dc98bb2df2a3e39534a Mon Sep 17 00:00:00 2001 From: Rickard Ankar Date: Tue, 9 Dec 2025 02:08:39 +0100 Subject: [PATCH 04/10] implementerat login-validering och mission by ID --- src/main/java/com/example/Main.java | 63 +++++++++++++++++++++++++---- 1 file changed, 55 insertions(+), 8 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index c481eac..5dbd0c9 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -53,12 +53,29 @@ public void run() { // Menu loop boolean running = true; while (running) { + System.out.println("\n1) List moon missions"); + System.out.println("2) Get a moon mission by mission_id"); + System.out.println("3) Count missions for a given 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("Choose an option: "); + String choice = scanner.nextLine().trim(); - if (choice.equals("1")) { - listMoonMissions(jdbcUrl, dbUser, dbPass); - } else if (choice.equals("0")) { - running = false; + switch (choice) { + case "1": + listMoonMissions(jdbcUrl, dbUser, dbPass); + break; + case "2": + getMissionById(scanner, jdbcUrl, dbUser, dbPass); + break; + case "0": + running = false; + break; + default: + System.out.println("Invalid option"); } } @@ -67,21 +84,51 @@ public void run() { // List all moon missions private void listMoonMissions(String jdbcUrl, String dbUser, String dbPass) { - String sql = "SELECT spacecraft FROM moon_mission"; + String sql = "SELECT spacecraft FROM moon_mission ORDER BY mission_id"; try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(sql)) { + PreparedStatement stmt = conn.prepareStatement(sql); + ResultSet rs = stmt.executeQuery()) { while (rs.next()) { System.out.println(rs.getString("spacecraft")); } } catch (SQLException e) { - System.err.println("Database error: " + e.getMessage()); + System.err.println("Error listing missions: " + e.getMessage()); + } + } + + // Get mission by ID + private void getMissionById(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { + System.out.print("Enter mission_id: "); + String input = scanner.nextLine().trim(); + + try { + long missionId = Long.parseLong(input); + String sql = "SELECT mission_id, spacecraft, launch_date FROM moon_mission WHERE mission_id = ?"; + + try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setLong(1, missionId); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + System.out.println("Mission ID: " + rs.getLong("mission_id")); + System.out.println("Spacecraft: " + rs.getString("spacecraft")); + System.out.println("Launch Date: " + rs.getDate("launch_date")); + } + } + } + } catch (NumberFormatException e) { + System.out.println("Invalid mission ID format"); + } catch (SQLException e) { + System.err.println("Error: " + e.getMessage()); } } + // Validate user credentials private boolean validateLogin(String jdbcUrl, String dbUser, String dbPass, String username, String password) { String sql = "SELECT user_id FROM account WHERE name = ? AND password = ?"; From fe91eb315e40ac7c7753a5b79f8a8716304edfbd Mon Sep 17 00:00:00 2001 From: Rickard Ankar Date: Tue, 9 Dec 2025 02:44:56 +0100 Subject: [PATCH 05/10] count missions by year med databas-aggregering --- src/main/java/com/example/Main.java | 31 +++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 5dbd0c9..d644a4a 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -71,6 +71,9 @@ public void run() { case "2": getMissionById(scanner, jdbcUrl, dbUser, dbPass); break; + case "3": + countMissionsByYear(scanner, jdbcUrl, dbUser, dbPass); + break; case "0": running = false; break; @@ -128,6 +131,34 @@ private void getMissionById(Scanner scanner, String jdbcUrl, String dbUser, Stri } } + // Count missions by year + private void countMissionsByYear(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { + System.out.print("Enter year: "); + String input = scanner.nextLine().trim(); + + try { + int year = Integer.parseInt(input); + String sql = "SELECT COUNT(*) as count FROM moon_mission WHERE YEAR(launch_date) = ?"; + + try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setInt(1, year); + + try (ResultSet rs = stmt.executeQuery()) { + if (rs.next()) { + int count = rs.getInt("count"); + System.out.println("Number of missions in " + year + ": " + count); + } + } + } + } catch (NumberFormatException e) { + System.out.println("Invalid year format"); + } catch (SQLException e) { + System.err.println("Error: " + e.getMessage()); + } + } + // Validate user credentials private boolean validateLogin(String jdbcUrl, String dbUser, String dbPass, String username, String password) { From e496ab010700685e08e74580ca8fafd1abebe0b2 Mon Sep 17 00:00:00 2001 From: Rickard Ankar Date: Tue, 9 Dec 2025 03:12:01 +0100 Subject: [PATCH 06/10] implementerat create account med INSERT INTO --- src/main/java/com/example/Main.java | 37 +++++++++++++++++++++++++++++ 1 file changed, 37 insertions(+) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index d644a4a..4bda4c2 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -74,6 +74,9 @@ public void run() { case "3": countMissionsByYear(scanner, jdbcUrl, dbUser, dbPass); break; + case "4": + createAccount(scanner, jdbcUrl, dbUser, dbPass); + break; case "0": running = false; break; @@ -159,6 +162,40 @@ private void countMissionsByYear(Scanner scanner, String jdbcUrl, String dbUser, } } + // Create new account + private void createAccount(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { + System.out.print("First name: "); + String firstName = scanner.nextLine().trim(); + + System.out.print("Last name: "); + String lastName = scanner.nextLine().trim(); + + System.out.print("SSN: "); + String ssn = scanner.nextLine().trim(); + + System.out.print("Password: "); + String password = scanner.nextLine().trim(); + + String sql = "INSERT INTO account (first_name, last_name, ssn, password) VALUES (?, ?, ?, ?)"; + + try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setString(1, firstName); + stmt.setString(2, lastName); + stmt.setString(3, ssn); + stmt.setString(4, password); + + int rowsAffected = stmt.executeUpdate(); + if (rowsAffected > 0) { + System.out.println("Account created successfully"); + } + + } catch (SQLException e) { + System.err.println("Error: " + e.getMessage()); + } + } + // Validate user credentials private boolean validateLogin(String jdbcUrl, String dbUser, String dbPass, String username, String password) { From 61d4e9590097b356a423acd080d229d2702e8923 Mon Sep 17 00:00:00 2001 From: Rickard Ankar Date: Tue, 9 Dec 2025 03:48:19 +0100 Subject: [PATCH 07/10] implementerat update och delete account - 9/9 test --- src/main/java/com/example/Main.java | 62 +++++++++++++++++++++++++++++ 1 file changed, 62 insertions(+) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 4bda4c2..8752389 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -77,6 +77,12 @@ public void run() { case "4": createAccount(scanner, jdbcUrl, dbUser, dbPass); break; + case "5": + updateAccountPassword(scanner, jdbcUrl, dbUser, dbPass); + break; + case "6": + deleteAccount(scanner, jdbcUrl, dbUser, dbPass); + break; case "0": running = false; break; @@ -196,6 +202,62 @@ private void createAccount(Scanner scanner, String jdbcUrl, String dbUser, Strin } } + // Update account password + private void updateAccountPassword(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { + System.out.print("Enter user_id: "); + String input = scanner.nextLine().trim(); + + System.out.print("Enter new password: "); + String newPassword = scanner.nextLine().trim(); + + try { + long userId = Long.parseLong(input); + String sql = "UPDATE account SET password = ? WHERE user_id = ?"; + + try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setString(1, newPassword); + stmt.setLong(2, userId); + + int rowsAffected = stmt.executeUpdate(); + if (rowsAffected > 0) { + System.out.println("Password updated successfully"); + } + } + } catch (NumberFormatException e) { + System.out.println("Invalid user ID format"); + } catch (SQLException e) { + System.err.println("Error: " + e.getMessage()); + } + } + + // Delete account + private void deleteAccount(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { + System.out.print("Enter user_id to delete: "); + String input = scanner.nextLine().trim(); + + try { + long userId = Long.parseLong(input); + String sql = "DELETE FROM account WHERE user_id = ?"; + + try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + PreparedStatement stmt = conn.prepareStatement(sql)) { + + stmt.setLong(1, userId); + + int rowsAffected = stmt.executeUpdate(); + if (rowsAffected > 0) { + System.out.println("Account deleted successfully"); + } + } + } catch (NumberFormatException e) { + System.out.println("Invalid user ID format"); + } catch (SQLException e) { + System.err.println("Error: " + e.getMessage()); + } + } + // Validate user credentials private boolean validateLogin(String jdbcUrl, String dbUser, String dbPass, String username, String password) { From 0b38e922e2d7256ac8d809d9ab3da2f4eecaba18 Mon Sep 17 00:00:00 2001 From: Rickard Ankar Date: Tue, 9 Dec 2025 10:30:42 +0100 Subject: [PATCH 08/10] JavaDoc --- src/main/java/com/example/Main.java | 31 ++++++++++++++++++++++------- 1 file changed, 24 insertions(+), 7 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 8752389..0f6eaf6 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -13,6 +13,9 @@ static void main(String[] args) { new Main().run(); } + /** + * Runs the main application with login and menu. + */ public void run() { // Resolve database configuration String jdbcUrl = resolveConfig("APP_JDBC_URL", "APP_JDBC_URL"); @@ -94,7 +97,9 @@ public void run() { scanner.close(); } - // List all moon missions + /** + * Lists all spacecraft from moon_mission table. + */ private void listMoonMissions(String jdbcUrl, String dbUser, String dbPass) { String sql = "SELECT spacecraft FROM moon_mission ORDER BY mission_id"; @@ -111,7 +116,9 @@ private void listMoonMissions(String jdbcUrl, String dbUser, String dbPass) { } } - // Get mission by ID + /** + * Gets a specific mission by ID and prints details. + */ private void getMissionById(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { System.out.print("Enter mission_id: "); String input = scanner.nextLine().trim(); @@ -140,7 +147,9 @@ private void getMissionById(Scanner scanner, String jdbcUrl, String dbUser, Stri } } - // Count missions by year + /** + * Counts how many missions were launched in a specific year. + */ private void countMissionsByYear(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { System.out.print("Enter year: "); String input = scanner.nextLine().trim(); @@ -168,7 +177,9 @@ private void countMissionsByYear(Scanner scanner, String jdbcUrl, String dbUser, } } - // Create new account + /** + * Creates a new account in the database. + */ private void createAccount(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { System.out.print("First name: "); String firstName = scanner.nextLine().trim(); @@ -202,7 +213,9 @@ private void createAccount(Scanner scanner, String jdbcUrl, String dbUser, Strin } } - // Update account password + /** + * Updates password for an existing account. + */ private void updateAccountPassword(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { System.out.print("Enter user_id: "); String input = scanner.nextLine().trim(); @@ -232,7 +245,9 @@ private void updateAccountPassword(Scanner scanner, String jdbcUrl, String dbUse } } - // Delete account + /** + * Deletes an account from the database. + */ private void deleteAccount(Scanner scanner, String jdbcUrl, String dbUser, String dbPass) { System.out.print("Enter user_id to delete: "); String input = scanner.nextLine().trim(); @@ -258,7 +273,9 @@ private void deleteAccount(Scanner scanner, String jdbcUrl, String dbUser, Strin } } - // Validate user credentials + /** + * Checks if username and password are correct. + */ private boolean validateLogin(String jdbcUrl, String dbUser, String dbPass, String username, String password) { String sql = "SELECT user_id FROM account WHERE name = ? AND password = ?"; From aed701ef69dfcec28f680cbe57cb67b1d9b35fde Mon Sep 17 00:00:00 2001 From: Rickard Ankar Date: Tue, 9 Dec 2025 12:26:42 +0100 Subject: [PATCH 09/10] =?UTF-8?q?mer=20JavaDoc=20och=20tagit=20bort=20on?= =?UTF-8?q?=C3=B6dig=20kod=20som=20coderabbit=20varna=20om.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 0f6eaf6..3c64125 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -46,7 +46,6 @@ public void run() { if (!validateLogin(jdbcUrl, dbUser, dbPass, username, password)) { System.out.println("Invalid username or password."); System.out.println("0) Exit"); - scanner.nextLine(); scanner.close(); return; } @@ -137,6 +136,8 @@ private void getMissionById(Scanner scanner, String jdbcUrl, String dbUser, Stri System.out.println("Mission ID: " + rs.getLong("mission_id")); System.out.println("Spacecraft: " + rs.getString("spacecraft")); System.out.println("Launch Date: " + rs.getDate("launch_date")); + } else { + System.out.println("No mission found with ID: " + missionId); } } } @@ -236,6 +237,8 @@ private void updateAccountPassword(Scanner scanner, String jdbcUrl, String dbUse int rowsAffected = stmt.executeUpdate(); if (rowsAffected > 0) { System.out.println("Password updated successfully"); + } else { + System.out.println("No account found with user_id: " + userId); } } } catch (NumberFormatException e) { @@ -264,6 +267,8 @@ private void deleteAccount(Scanner scanner, String jdbcUrl, String dbUser, Strin int rowsAffected = stmt.executeUpdate(); if (rowsAffected > 0) { System.out.println("Account deleted successfully"); + } else { + System.out.println("No account found with user_id: " + userId); } } } catch (NumberFormatException e) { @@ -296,6 +301,9 @@ private boolean validateLogin(String jdbcUrl, String dbUser, String dbPass, } } + /** + * Checks if dev mode is enabled. + */ private static boolean isDevMode(String[] args) { if (Boolean.getBoolean("devMode")) return true; @@ -304,6 +312,10 @@ private static boolean isDevMode(String[] args) { return Arrays.asList(args).contains("--dev"); } + + /** + * Gets config from system properties or environment variables. + */ private static String resolveConfig(String propertyKey, String envKey) { String v = System.getProperty(propertyKey); if (v == null || v.trim().isEmpty()) { From 5d5f51f016d3e4da3e0af1d60b47471ad082ce9c Mon Sep 17 00:00:00 2001 From: Rickard Ankar Date: Tue, 9 Dec 2025 15:33:09 +0100 Subject: [PATCH 10/10] lagt till username-generering i createAccount --- src/main/java/com/example/Main.java | 31 ++++++++++++++++------------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 3c64125..b422703 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -46,6 +46,7 @@ public void run() { if (!validateLogin(jdbcUrl, dbUser, dbPass, username, password)) { System.out.println("Invalid username or password."); System.out.println("0) Exit"); + scanner.nextLine(); scanner.close(); return; } @@ -136,8 +137,6 @@ private void getMissionById(Scanner scanner, String jdbcUrl, String dbUser, Stri System.out.println("Mission ID: " + rs.getLong("mission_id")); System.out.println("Spacecraft: " + rs.getString("spacecraft")); System.out.println("Launch Date: " + rs.getDate("launch_date")); - } else { - System.out.println("No mission found with ID: " + missionId); } } } @@ -194,15 +193,19 @@ private void createAccount(Scanner scanner, String jdbcUrl, String dbUser, Strin System.out.print("Password: "); String password = scanner.nextLine().trim(); - String sql = "INSERT INTO account (first_name, last_name, ssn, password) VALUES (?, ?, ?, ?)"; + String username = firstName.substring(0, Math.min(3, firstName.length())) + + lastName.substring(0, Math.min(3, lastName.length())); + + String sql = "INSERT INTO account (name, first_name, last_name, ssn, password) VALUES (?, ?, ?, ?, ?)"; try (Connection conn = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); PreparedStatement stmt = conn.prepareStatement(sql)) { - stmt.setString(1, firstName); - stmt.setString(2, lastName); - stmt.setString(3, ssn); - stmt.setString(4, password); + stmt.setString(1, username); + stmt.setString(2, firstName); + stmt.setString(3, lastName); + stmt.setString(4, ssn); + stmt.setString(5, password); int rowsAffected = stmt.executeUpdate(); if (rowsAffected > 0) { @@ -237,8 +240,6 @@ private void updateAccountPassword(Scanner scanner, String jdbcUrl, String dbUse int rowsAffected = stmt.executeUpdate(); if (rowsAffected > 0) { System.out.println("Password updated successfully"); - } else { - System.out.println("No account found with user_id: " + userId); } } } catch (NumberFormatException e) { @@ -267,8 +268,6 @@ private void deleteAccount(Scanner scanner, String jdbcUrl, String dbUser, Strin int rowsAffected = stmt.executeUpdate(); if (rowsAffected > 0) { System.out.println("Account deleted successfully"); - } else { - System.out.println("No account found with user_id: " + userId); } } } catch (NumberFormatException e) { @@ -302,7 +301,11 @@ private boolean validateLogin(String jdbcUrl, String dbUser, String dbPass, } /** - * Checks if dev mode is enabled. + * Determines if the application is running in development mode based on system properties, + * environment variables, or command-line arguments. + * + * @param args an array of command-line arguments + * @return {@code true} if the application is in development mode; {@code false} otherwise */ private static boolean isDevMode(String[] args) { if (Boolean.getBoolean("devMode")) @@ -312,9 +315,9 @@ private static boolean isDevMode(String[] args) { return Arrays.asList(args).contains("--dev"); } - /** - * Gets config from system properties or environment variables. + * Reads configuration with precedence: Java system property first, then environment variable. + * Returns trimmed value or null if neither source provides a non-empty value. */ private static String resolveConfig(String propertyKey, String envKey) { String v = System.getProperty(propertyKey);