From 9f1fcdad57bd6dae2b7403f20d8aca3a08b708d0 Mon Sep 17 00:00:00 2001 From: "github-classroom[bot]" <66690702+github-classroom[bot]@users.noreply.github.com> Date: Wed, 3 Dec 2025 07:07:15 +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 4c4df08aa644768a5609bd81f1be8ffdf8445797 Mon Sep 17 00:00:00 2001 From: Linus Westling Date: Wed, 3 Dec 2025 15:28:25 +0100 Subject: [PATCH 02/10] Before making a huge mess --- src/main/java/com/example/Main.java | 54 ++++++++++++++++- src/main/java/com/example/MoonMission.java | 60 +++++++++++++++++++ .../SimpleDriverManagerDataSource.java | 21 +++++++ .../example/jdbc/JdbcAccountRepository.java | 20 +++++++ .../jdbc/JdbcMoonMissionRepository.java | 23 +++++++ .../repositorys/AccountRepository.java | 7 +++ .../repositorys/MoonMissionRepository.java | 11 ++++ 7 files changed, 195 insertions(+), 1 deletion(-) create mode 100644 src/main/java/com/example/MoonMission.java create mode 100644 src/main/java/com/example/SimpleDriverManagerDataSource.java create mode 100644 src/main/java/com/example/jdbc/JdbcAccountRepository.java create mode 100644 src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java create mode 100644 src/main/java/com/example/repositorys/AccountRepository.java create mode 100644 src/main/java/com/example/repositorys/MoonMissionRepository.java diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 6dc6fbd..8cd6f18 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -4,6 +4,7 @@ import java.sql.DriverManager; import java.sql.SQLException; import java.util.Arrays; +import java.util.Scanner; public class Main { @@ -30,7 +31,40 @@ public void run() { } catch (SQLException e) { throw new RuntimeException(e); } - //Todo: Starting point for your code + /* THE WORKFLOW + * Implementation of CLI logic + * Recieve Username + * Recieve Password + * Options: + * 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 + * Prompt user for Username + * Store Username in String + * Prompt user for Password + * Store Password in String + * checkIfValidAccount(Username, Password) return boolean + * if checkFail -> Invalid Username or Password, please try again, or exit with typing: 0 + * else + * getOptions() + */ + + Scanner sc = new Scanner(System.in); + + System.out.print("Enter your Username: "); + String username = sc.nextLine(); + System.out.print("Enter your password: "); + String password = sc.nextLine(); + +// checkIfValidAccount(Username, Password) return boolean +// if checkFail -> Invalid Username or Password, please try again, or exit with typing: 0 + + System.out.println("Welcome / Välkommen: " + username); + getOptions(); } /** @@ -59,4 +93,22 @@ private static String resolveConfig(String propertyKey, String envKey) { } return (v == null || v.trim().isEmpty()) ? null : v.trim(); } + + + public void getOptions() { + System.out.println( + """ + You can choose from the following options: + 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. + """ + ); + } + + } diff --git a/src/main/java/com/example/MoonMission.java b/src/main/java/com/example/MoonMission.java new file mode 100644 index 0000000..6c3de79 --- /dev/null +++ b/src/main/java/com/example/MoonMission.java @@ -0,0 +1,60 @@ +package com.example; + +import java.time.LocalDate; + +public class MoonMission { + private int missionId; + private String spacecraft; + private LocalDate launchDate; + private String carrierRocket; + private String operator; + private String missionType; + private String outcome; + + // Getters and setters + public int getMissionId() { + return missionId; + } + + public String getSpacecraft() { + return spacecraft; + } + public void setSpacecraft(String spacecraft) { + this.spacecraft = spacecraft; + } + + public LocalDate getLaunchDate() { + return launchDate; + } + public void setLaunchDate(LocalDate launchDate) { + this.launchDate = launchDate; + } + + public String getCarrierRocket() { + return carrierRocket; + } + public void setCarrierRocket(String carrierRocket) { + this.carrierRocket = carrierRocket; + } + + public String getOperator() { + return operator; + } + public void setOperator(String operator) { + this.operator = operator; + } + + public String getMissionType() { + return missionType; + } + public void setMissionType(String missionType) { + this.missionType = missionType; + } + + public String getOutcome() { + return outcome; + } + public void setOutcome(String outcome) { + this.outcome = outcome; + } +} \ No newline at end of file diff --git a/src/main/java/com/example/SimpleDriverManagerDataSource.java b/src/main/java/com/example/SimpleDriverManagerDataSource.java new file mode 100644 index 0000000..6ce5dd2 --- /dev/null +++ b/src/main/java/com/example/SimpleDriverManagerDataSource.java @@ -0,0 +1,21 @@ +package com.example; + +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.SQLException; + +public class SimpleDriverManagerDataSource { + private final String url; + private final String user; + private final String password; + + public SimpleDriverManagerDataSource(String url, String user, String password){ + this.url = url; + this.user = user; + this.password = password; + } + + public Connection getConnection() throws SQLException{ + return DriverManager.getConnection(url, user, password); + } +} diff --git a/src/main/java/com/example/jdbc/JdbcAccountRepository.java b/src/main/java/com/example/jdbc/JdbcAccountRepository.java new file mode 100644 index 0000000..46b7199 --- /dev/null +++ b/src/main/java/com/example/jdbc/JdbcAccountRepository.java @@ -0,0 +1,20 @@ +package com.example.jdbc; + +import com.example.repositorys.AccountRepository; + +public class JdbcAccountRepository implements AccountRepository { + @Override + public void createAccount(String firstName, String lastName, String ssn, String password) { + + } + + @Override + public void updatePassword(int userId, String newPassword) { + + } + + @Override + public void deleteAccount(int userId) { + + } +} diff --git a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java new file mode 100644 index 0000000..ee7600b --- /dev/null +++ b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java @@ -0,0 +1,23 @@ +package com.example.jdbc; + +import com.example.MoonMission; +import com.example.repositorys.MoonMissionRepository; + +import java.util.List; + +public class JdbcMoonMissionRepository implements MoonMissionRepository { + @Override + public List listMissions() { + return List.of(); + } + + @Override + public MoonMission getMissionById(int missionId) { + return null; + } + + @Override + public int countMissionsByYear(int year) { + return 0; + } +} diff --git a/src/main/java/com/example/repositorys/AccountRepository.java b/src/main/java/com/example/repositorys/AccountRepository.java new file mode 100644 index 0000000..7b54589 --- /dev/null +++ b/src/main/java/com/example/repositorys/AccountRepository.java @@ -0,0 +1,7 @@ +package com.example.repositorys; + +public interface AccountRepository { + void createAccount(String firstName, String lastName, String ssn, String password); + void updatePassword(int userId, String newPassword); + void deleteAccount(int userId); +} diff --git a/src/main/java/com/example/repositorys/MoonMissionRepository.java b/src/main/java/com/example/repositorys/MoonMissionRepository.java new file mode 100644 index 0000000..b48f069 --- /dev/null +++ b/src/main/java/com/example/repositorys/MoonMissionRepository.java @@ -0,0 +1,11 @@ +package com.example.repositorys; + +import com.example.MoonMission; + +import java.util.List; + +public interface MoonMissionRepository { + List listMissions(); + MoonMission getMissionById(int missionId); + int countMissionsByYear(int year); +} From 222d677467f132b42a9b6d8ef531ed9899d7c33d Mon Sep 17 00:00:00 2001 From: Linus Westling Date: Wed, 3 Dec 2025 15:58:57 +0100 Subject: [PATCH 03/10] =?UTF-8?q?N=C3=A4stan=20allt=20=C3=A4r=20p=C3=A5=20?= =?UTF-8?q?plats=20inf=C3=B6r=20implementation=20av=20metoder=20och=20quer?= =?UTF-8?q?ies.?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 28 +++------------ src/main/java/com/example/MoonMission.java | 28 ++------------- .../SimpleDriverManagerDataSource.java | 34 ++++++++++++++----- .../example/jdbc/JdbcAccountRepository.java | 15 +++++--- .../repositorys/AccountRepository.java | 7 ++-- 5 files changed, 48 insertions(+), 64 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 8cd6f18..e1f42aa 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -16,18 +16,8 @@ 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"); - - 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)) { + SimpleDriverManagerDataSource ds = new SimpleDriverManagerDataSource(); + try (Connection connection = ds.getConnection()) { } catch (SQLException e) { throw new RuntimeException(e); } @@ -53,6 +43,8 @@ public void run() { * getOptions() */ + // TODO: Parse "year" into localTimeDate for option 3 + Scanner sc = new Scanner(System.in); System.out.print("Enter your Username: "); @@ -82,17 +74,7 @@ private static boolean isDevMode(String[] args) { return Arrays.asList(args).contains("--dev"); //Argument --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()) { - v = System.getenv(envKey); - } - return (v == null || v.trim().isEmpty()) ? null : v.trim(); - } + public void getOptions() { diff --git a/src/main/java/com/example/MoonMission.java b/src/main/java/com/example/MoonMission.java index 6c3de79..eadf5fe 100644 --- a/src/main/java/com/example/MoonMission.java +++ b/src/main/java/com/example/MoonMission.java @@ -11,50 +11,28 @@ public class MoonMission { private String missionType; private String outcome; - // Getters and setters + // GETTERS public int getMissionId() { return missionId; } - public String getSpacecraft() { return spacecraft; } - public void setSpacecraft(String spacecraft) { - this.spacecraft = spacecraft; - } - public LocalDate getLaunchDate() { return launchDate; } - public void setLaunchDate(LocalDate launchDate) { - this.launchDate = launchDate; - } - public String getCarrierRocket() { return carrierRocket; } - public void setCarrierRocket(String carrierRocket) { - this.carrierRocket = carrierRocket; - } - public String getOperator() { return operator; } - public void setOperator(String operator) { - this.operator = operator; - } - public String getMissionType() { return missionType; } - public void setMissionType(String missionType) { - this.missionType = missionType; - } - public String getOutcome() { return outcome; } - public void setOutcome(String outcome) { - this.outcome = outcome; - } + + // SETTERS (if needed later) } \ No newline at end of file diff --git a/src/main/java/com/example/SimpleDriverManagerDataSource.java b/src/main/java/com/example/SimpleDriverManagerDataSource.java index 6ce5dd2..84763e4 100644 --- a/src/main/java/com/example/SimpleDriverManagerDataSource.java +++ b/src/main/java/com/example/SimpleDriverManagerDataSource.java @@ -5,17 +5,35 @@ import java.sql.SQLException; public class SimpleDriverManagerDataSource { - private final String url; - private final String user; - private final String password; + private final String jdbcUrl; + private final String dbUser; + private final String dbPass; - public SimpleDriverManagerDataSource(String url, String user, String password){ - this.url = url; - this.user = user; - this.password = password; + // Resolve DB settings with precedence: System properties -> Environment variable + public SimpleDriverManagerDataSource(){ + this.jdbcUrl = resolveConfig("APP_JDBC_URL", "APP_JDBC_URL"); + this.dbUser = resolveConfig("APP_DB_USER", "APP_DB_USER"); + this.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."); + } } public Connection getConnection() throws SQLException{ - return DriverManager.getConnection(url, user, password); + return DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + } + + /** + * 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()) { + v = System.getenv(envKey); + } + return (v == null || v.trim().isEmpty()) ? null : v.trim(); } } diff --git a/src/main/java/com/example/jdbc/JdbcAccountRepository.java b/src/main/java/com/example/jdbc/JdbcAccountRepository.java index 46b7199..bd55cd0 100644 --- a/src/main/java/com/example/jdbc/JdbcAccountRepository.java +++ b/src/main/java/com/example/jdbc/JdbcAccountRepository.java @@ -4,17 +4,22 @@ public class JdbcAccountRepository implements AccountRepository { @Override - public void createAccount(String firstName, String lastName, String ssn, String password) { - + public Boolean createAccount(String firstName, String lastName, String ssn, String password) { + return true; } @Override - public void updatePassword(int userId, String newPassword) { - + public Boolean updatePassword(int userId, String newPassword) { + return true; } @Override - public void deleteAccount(int userId) { + public Boolean deleteAccount(int userId) { + return true; + } + @Override + public Boolean validateCredentials(String username, String password) { + return true; } } diff --git a/src/main/java/com/example/repositorys/AccountRepository.java b/src/main/java/com/example/repositorys/AccountRepository.java index 7b54589..5e96d0c 100644 --- a/src/main/java/com/example/repositorys/AccountRepository.java +++ b/src/main/java/com/example/repositorys/AccountRepository.java @@ -1,7 +1,8 @@ package com.example.repositorys; public interface AccountRepository { - void createAccount(String firstName, String lastName, String ssn, String password); - void updatePassword(int userId, String newPassword); - void deleteAccount(int userId); + Boolean createAccount(String firstName, String lastName, String ssn, String password); + Boolean updatePassword(int userId, String newPassword); + Boolean deleteAccount(int userId); + Boolean validateCredentials(String username, String password); } From 405d6ca2eb46e53d8594736de00c174bc261a6a8 Mon Sep 17 00:00:00 2001 From: Linus Westling Date: Thu, 4 Dec 2025 13:54:35 +0100 Subject: [PATCH 04/10] Repositorys implementerade --- src/main/java/com/example/MoonMission.java | 31 ++++++- .../example/jdbc/JdbcAccountRepository.java | 81 ++++++++++++++++++- .../jdbc/JdbcMoonMissionRepository.java | 69 +++++++++++++++- 3 files changed, 175 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/MoonMission.java b/src/main/java/com/example/MoonMission.java index eadf5fe..3e42529 100644 --- a/src/main/java/com/example/MoonMission.java +++ b/src/main/java/com/example/MoonMission.java @@ -34,5 +34,34 @@ public String getOutcome() { return outcome; } - // SETTERS (if needed later) + // SETTERS + + + public void setMissionId(int missionId) { + this.missionId = missionId; + } + + public void setSpacecraft(String spacecraft) { + this.spacecraft = spacecraft; + } + + public void setLaunchDate(LocalDate launchDate) { + this.launchDate = launchDate; + } + + public void setCarrierRocket(String carrierRocket) { + this.carrierRocket = carrierRocket; + } + + public void setOutcome(String outcome) { + this.outcome = outcome; + } + + public void setMissionType(String missionType) { + this.missionType = missionType; + } + + public void setOperator(String operator) { + this.operator = operator; + } } \ No newline at end of file diff --git a/src/main/java/com/example/jdbc/JdbcAccountRepository.java b/src/main/java/com/example/jdbc/JdbcAccountRepository.java index bd55cd0..ee8fa8d 100644 --- a/src/main/java/com/example/jdbc/JdbcAccountRepository.java +++ b/src/main/java/com/example/jdbc/JdbcAccountRepository.java @@ -1,25 +1,98 @@ package com.example.jdbc; import com.example.repositorys.AccountRepository; +import com.example.SimpleDriverManagerDataSource; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; + public class JdbcAccountRepository implements AccountRepository { + + SimpleDriverManagerDataSource ds = new SimpleDriverManagerDataSource(); + @Override public Boolean createAccount(String firstName, String lastName, String ssn, String password) { - return true; + + try (Connection connection = ds.getConnection()) { + + String sql = "insert into account (first_name, last_name, ssn, password) values (?, ?, ?, ?);"; + PreparedStatement ps = connection.prepareStatement(sql); + + ps.setString(1, firstName); + ps.setString(2, lastName); + ps.setString(3, ssn); + ps.setString(4, password); + + int rs = ps.executeUpdate(); + + return rs == 1; + + } catch (SQLException e) { + throw new RuntimeException(e); + } + } @Override public Boolean updatePassword(int userId, String newPassword) { - return true; + + try (Connection connection = ds.getConnection()){ + + String sql = "update account set password = ? where userId = ?"; + PreparedStatement ps = connection.prepareStatement(sql); + + ps.setString(1, newPassword); + ps.setInt(2, userId); + + int rs = ps.executeUpdate(); + + return rs == 1; + + } catch (SQLException e) { + throw new RuntimeException(e); + } + } @Override public Boolean deleteAccount(int userId) { - return true; + + try (Connection connection = ds.getConnection()){ + + String sql = "delete from account where userId = ?"; + PreparedStatement ps = connection.prepareStatement(sql); + + ps.setInt(1, userId); + int rs = ps.executeUpdate(); + + return rs == 1; + + } catch (SQLException e) { + throw new RuntimeException(e); + } + } @Override public Boolean validateCredentials(String username, String password) { - return true; + + try (Connection connection = ds.getConnection()){ + + String sql = "select * from account where name = ? and password = ?"; + PreparedStatement ps = connection.prepareStatement(sql); + + ps.setString(1, username); + ps.setString(2, password); + + ResultSet rs = ps.executeQuery(); + + return rs.next(); + + } catch (SQLException e) { + throw new RuntimeException(e); + } } } diff --git a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java index ee7600b..3725eca 100644 --- a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java +++ b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java @@ -1,23 +1,90 @@ package com.example.jdbc; import com.example.MoonMission; +import com.example.SimpleDriverManagerDataSource; import com.example.repositorys.MoonMissionRepository; +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 JdbcMoonMissionRepository implements MoonMissionRepository { + + SimpleDriverManagerDataSource ds = new SimpleDriverManagerDataSource(); + @Override public List listMissions() { - return List.of(); + + try (Connection connection = ds.getConnection()) { + + String sql = "select spacecraft from moon_mission;"; + PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery(); + + List result = new ArrayList<>(); + + while (rs.next()){ + result.add(rs.toString()); + } + + return result; + + } catch (SQLException e) { + throw new RuntimeException(e); + } + } @Override public MoonMission getMissionById(int missionId) { + String sql = "select * from moon_mission where mission_id = ?"; + + try (Connection connection = ds.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql);){ + + ps.setInt(1, missionId); + + try (ResultSet rs = ps.executeQuery()){ + if (rs.next()) { + MoonMission mission = new MoonMission(); + mission.setMissionId(rs.getInt("mission_id")); + mission.setSpacecraft(rs.getString("spacecraft")); + mission.setLaunchDate(rs.getDate("launch_date").toLocalDate()); + mission.setCarrierRocket(rs.getString("carrier_rocket")); + mission.setOutcome(rs.getString("outcome")); + mission.setMissionType(rs.getString("mission_type")); + mission.setOperator(rs.getString("operator")); + return mission; + } + } + } catch (SQLException e) { + throw new RuntimeException(e); + } return null; } @Override public int countMissionsByYear(int year) { + + try (Connection connection = ds.getConnection()){ + + String sql = "select count(*) from moon_mission as mission_count where year(launch_date) = ?"; + PreparedStatement ps = connection.prepareStatement(sql); + + ps.setInt(1, year); + + ResultSet rs = ps.executeQuery(); + + if (rs.next()){ + return rs.getInt("mission_count"); + } + + } catch (SQLException e) { + throw new RuntimeException(e); + } return 0; } } From 6aaa02dfdae5730687a8217bac7ebd08743964bb Mon Sep 17 00:00:00 2001 From: Linus Westling Date: Thu, 4 Dec 2025 15:50:39 +0100 Subject: [PATCH 05/10] =?UTF-8?q?Fixat=20med=20dataSource.=20Fortf=20ej=20?= =?UTF-8?q?f=C3=A4rdigimplementerat.=20TODO:=20Ordna=20s=C3=A5=20konfigura?= =?UTF-8?q?tioner=20g=C3=B6rs=20i=20main?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 166 +++++++++++++----- .../SimpleDriverManagerDataSource.java | 6 +- .../example/jdbc/JdbcAccountRepository.java | 6 +- .../jdbc/JdbcMoonMissionRepository.java | 9 +- 4 files changed, 137 insertions(+), 50 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index e1f42aa..39f9983 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -1,5 +1,8 @@ package com.example; +import com.example.jdbc.JdbcAccountRepository; +import com.example.jdbc.JdbcMoonMissionRepository; + import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; @@ -8,6 +11,11 @@ public class Main { + private SimpleDriverManagerDataSource dataSource; + private JdbcAccountRepository accountRepo; + private JdbcMoonMissionRepository missionRepo; + private Scanner sc; + static void main(String[] args) { if (isDevMode(args)) { DevDatabaseInitializer.start(); @@ -16,47 +24,34 @@ static void main(String[] args) { } public void run() { - SimpleDriverManagerDataSource ds = new SimpleDriverManagerDataSource(); - try (Connection connection = ds.getConnection()) { - } catch (SQLException e) { - throw new RuntimeException(e); - } - /* THE WORKFLOW - * Implementation of CLI logic - * Recieve Username - * Recieve Password - * Options: - * 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 - * Prompt user for Username - * Store Username in String - * Prompt user for Password - * Store Password in String - * checkIfValidAccount(Username, Password) return boolean - * if checkFail -> Invalid Username or Password, please try again, or exit with typing: 0 - * else - * getOptions() - */ - - // TODO: Parse "year" into localTimeDate for option 3 - - Scanner sc = new Scanner(System.in); - - System.out.print("Enter your Username: "); - String username = sc.nextLine(); - System.out.print("Enter your password: "); - String password = sc.nextLine(); - -// checkIfValidAccount(Username, Password) return boolean -// if checkFail -> Invalid Username or Password, please try again, or exit with typing: 0 - - System.out.println("Welcome / Välkommen: " + username); - getOptions(); + + + + dataSource = new SimpleDriverManagerDataSource(); + accountRepo = new JdbcAccountRepository(dataSource); + missionRepo = new JdbcMoonMissionRepository(dataSource); + sc = new Scanner(System.in); + + + + + int choice; + do { + System.out.print("Enter your Username: "); + String username = sc.nextLine(); + System.out.print("Enter your password: "); + String password = sc.nextLine(); + + if (accountRepo.validateCredentials(username, password)) { + System.out.println("Welcome / Välkommen: " + username); + getOptions(); + } else { + System.out.println("Username or password was Incorrect. Press 0 to exit"); + } + + choice = sc.nextInt(); + options(choice); + } while (choice != 0); } /** @@ -74,9 +69,6 @@ private static boolean isDevMode(String[] args) { return Arrays.asList(args).contains("--dev"); //Argument --dev } - - - public void getOptions() { System.out.println( """ @@ -88,9 +80,93 @@ public void getOptions() { 5 - Update an account password (prompts: user_id, new password; prints confirmation). 6 - Delete an account (prompts: user_id; prints confirmation). 0 - Exit. + By pressing either of the numbers listed. """ ); } - + public void options(int choice) { + + switch (choice) { + + case 1: missionRepo. + listMissions(). + forEach(System.out::println); + break; + + case 2: + System.out.print("Enter a mission ID you want to search for: "); + int missionId = sc.nextInt(); + sc.nextLine(); + MoonMission mission = missionRepo.getMissionById(missionId); + if (mission != null) { + System.out.printf( + "Mission ID: %d%nSpacecraft: %s%nLaunch Date: %s%nCarrier Rocket: %s%nOutcome: %s%nMission Type: %s%nOperator: %s%n", + mission.getMissionId(), + mission.getSpacecraft(), + mission.getLaunchDate(), + mission.getCarrierRocket(), + mission.getOutcome(), + mission.getMissionType(), + mission.getOperator() + ); + } else { + System.out.println("No mission found."); + } + break; + + case 3: + System.out.print("Enter the year you wish to see the number of missions: "); + int year = sc.nextInt(); + sc.nextLine(); + int numOfMissions = missionRepo.countMissionsByYear(year); + System.out.println("There were: " + numOfMissions + " year " + year); + break; + + case 4: + System.out.println("Enter your first name: "); + String firstName = sc.nextLine(); + System.out.println("Enter your last name: "); + String lastName = sc.nextLine(); + System.out.println("Enter your ssn (social security number): "); + String ssn = sc.nextLine(); + System.out.println("Enter your password: "); + String password = sc.nextLine(); + + if (accountRepo.createAccount(firstName, lastName, ssn, password)) { + System.out.println("Your account was successfuly created"); + } else { + System.out.println("Something went wrong during the creation of your account"); + } + break; + + case 5: + System.out.println("Enter the userId of the account you would like to update your password for: "); + int userId = sc.nextInt(); + System.out.println("Enter your new password"); + String newPassword = sc.nextLine(); + + if (accountRepo.updatePassword(userId, newPassword)) { + System.out.println("Your password has been updated!"); + } else { + System.out.println("Something went wrong during password update."); + } + break; + + case 6: + System.out.println("Enter userID of the account u want deleted: "); + int userIdDelete = sc.nextInt(); + + boolean isDeleted = accountRepo.deleteAccount(userIdDelete); + System.out.println(isDeleted ? "You account was successfully deleted!" : "Something went wrong deleting your account."); + break; + + case 0: + System.out.println("Exiting the program."); + break; + + default: + System.out.println("Invalid choice"); + } + } } diff --git a/src/main/java/com/example/SimpleDriverManagerDataSource.java b/src/main/java/com/example/SimpleDriverManagerDataSource.java index 84763e4..b620fb4 100644 --- a/src/main/java/com/example/SimpleDriverManagerDataSource.java +++ b/src/main/java/com/example/SimpleDriverManagerDataSource.java @@ -8,6 +8,7 @@ public class SimpleDriverManagerDataSource { private final String jdbcUrl; private final String dbUser; private final String dbPass; + private Connection connection; // Resolve DB settings with precedence: System properties -> Environment variable public SimpleDriverManagerDataSource(){ @@ -22,7 +23,10 @@ public SimpleDriverManagerDataSource(){ } public Connection getConnection() throws SQLException{ - return DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + if (connection == null){ + connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); + } + return connection; } /** diff --git a/src/main/java/com/example/jdbc/JdbcAccountRepository.java b/src/main/java/com/example/jdbc/JdbcAccountRepository.java index ee8fa8d..3a61839 100644 --- a/src/main/java/com/example/jdbc/JdbcAccountRepository.java +++ b/src/main/java/com/example/jdbc/JdbcAccountRepository.java @@ -11,7 +11,11 @@ public class JdbcAccountRepository implements AccountRepository { - SimpleDriverManagerDataSource ds = new SimpleDriverManagerDataSource(); + private final SimpleDriverManagerDataSource ds; + + public JdbcAccountRepository(SimpleDriverManagerDataSource ds) { + this.ds = ds; + } @Override public Boolean createAccount(String firstName, String lastName, String ssn, String password) { diff --git a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java index 3725eca..115e58d 100644 --- a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java +++ b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java @@ -13,7 +13,11 @@ public class JdbcMoonMissionRepository implements MoonMissionRepository { - SimpleDriverManagerDataSource ds = new SimpleDriverManagerDataSource(); + private final SimpleDriverManagerDataSource ds; + + public JdbcMoonMissionRepository(SimpleDriverManagerDataSource ds) { + this.ds = ds; + } @Override public List listMissions() { @@ -27,7 +31,7 @@ public List listMissions() { List result = new ArrayList<>(); while (rs.next()){ - result.add(rs.toString()); + result.add(rs.getString("spacecraft")); } return result; @@ -35,7 +39,6 @@ public List listMissions() { } catch (SQLException e) { throw new RuntimeException(e); } - } @Override From c7c2554f43baf6dcd7e9b6aa36020677a5fe5419 Mon Sep 17 00:00:00 2001 From: Linus Westling Date: Fri, 5 Dec 2025 09:44:23 +0100 Subject: [PATCH 06/10] Div. fixar --- src/main/java/com/example/Main.java | 88 +++++++++++++------ .../SimpleDriverManagerDataSource.java | 19 +--- 2 files changed, 66 insertions(+), 41 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 39f9983..073adf1 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -3,55 +3,89 @@ import com.example.jdbc.JdbcAccountRepository; import com.example.jdbc.JdbcMoonMissionRepository; -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; import java.util.Arrays; import java.util.Scanner; public class Main { - private SimpleDriverManagerDataSource dataSource; - private JdbcAccountRepository accountRepo; - private JdbcMoonMissionRepository missionRepo; - private Scanner sc; + private final JdbcAccountRepository accountRepo; + private final JdbcMoonMissionRepository missionRepo; + private final Scanner sc; - static void main(String[] args) { + public Main(SimpleDriverManagerDataSource dataSource) { + this.accountRepo = new JdbcAccountRepository(dataSource); + this.missionRepo = new JdbcMoonMissionRepository(dataSource); + this.sc = new Scanner(System.in); + } + + public static void main(String[] args) { if (isDevMode(args)) { DevDatabaseInitializer.start(); } - new Main().run(); - } - - public void run() { - - - dataSource = new SimpleDriverManagerDataSource(); - accountRepo = new JdbcAccountRepository(dataSource); - missionRepo = new JdbcMoonMissionRepository(dataSource); - sc = new Scanner(System.in); + 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"); + SimpleDriverManagerDataSource ds = new SimpleDriverManagerDataSource(jdbcUrl, dbUser, dbPass); + new Main(ds).run(); + } + public void run() { + boolean authenticated = false; + String username = ""; + + // Loop until valid credentials + while (!authenticated) { + System.out.print("Enter your Username (or 0 to exit): "); + username = sc.nextLine(); + if ("0".equals(username)) { + System.out.println("Exiting program."); + return; + } - int choice; - do { - System.out.print("Enter your Username: "); - String username = sc.nextLine(); System.out.print("Enter your password: "); String password = sc.nextLine(); if (accountRepo.validateCredentials(username, password)) { System.out.println("Welcome / Välkommen: " + username); - getOptions(); + authenticated = true; } else { - System.out.println("Username or password was Incorrect. Press 0 to exit"); + System.out.println("Invalid Username or Password. Try again or type 0 to exit."); + } + } + + + // Once authenticated, show menu until user exits + int choice; + do { + getOptions(); + + // safer input handling + String choiceStr = sc.nextLine(); + try { + choice = Integer.parseInt(choiceStr); + } catch (NumberFormatException e) { + choice = -1; // invalid } - choice = sc.nextInt(); options(choice); } while (choice != 0); + + System.out.println("Goodbye, " + username + "!"); + } + + /** + * 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()) { + v = System.getenv(envKey); + } + return (v == null || v.trim().isEmpty()) ? null : v.trim(); } /** @@ -72,7 +106,7 @@ private static boolean isDevMode(String[] args) { public void getOptions() { System.out.println( """ - You can choose from the following options: + Select an option: 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). @@ -143,6 +177,7 @@ public void options(int choice) { case 5: System.out.println("Enter the userId of the account you would like to update your password for: "); int userId = sc.nextInt(); + sc.nextLine(); System.out.println("Enter your new password"); String newPassword = sc.nextLine(); @@ -156,6 +191,7 @@ public void options(int choice) { case 6: System.out.println("Enter userID of the account u want deleted: "); int userIdDelete = sc.nextInt(); + sc.nextLine(); boolean isDeleted = accountRepo.deleteAccount(userIdDelete); System.out.println(isDeleted ? "You account was successfully deleted!" : "Something went wrong deleting your account."); diff --git a/src/main/java/com/example/SimpleDriverManagerDataSource.java b/src/main/java/com/example/SimpleDriverManagerDataSource.java index b620fb4..4471ce9 100644 --- a/src/main/java/com/example/SimpleDriverManagerDataSource.java +++ b/src/main/java/com/example/SimpleDriverManagerDataSource.java @@ -11,10 +11,10 @@ public class SimpleDriverManagerDataSource { private Connection connection; // Resolve DB settings with precedence: System properties -> Environment variable - public SimpleDriverManagerDataSource(){ - this.jdbcUrl = resolveConfig("APP_JDBC_URL", "APP_JDBC_URL"); - this.dbUser = resolveConfig("APP_DB_USER", "APP_DB_USER"); - this.dbPass = resolveConfig("APP_DB_PASS", "APP_DB_PASS"); + public SimpleDriverManagerDataSource(String jdbcUrl, String dbUser, String dbPass){ + this.jdbcUrl = jdbcUrl; + this.dbUser = dbUser; + this.dbPass = dbPass; if (jdbcUrl == null || dbUser == null || dbPass == null) { throw new IllegalStateException( "Missing DB configuration. Provide APP_JDBC_URL, APP_DB_USER, APP_DB_PASS " + @@ -29,15 +29,4 @@ public Connection getConnection() throws SQLException{ return connection; } - /** - * 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()) { - v = System.getenv(envKey); - } - return (v == null || v.trim().isEmpty()) ? null : v.trim(); - } } From 8759fa64f10f3796dd5a97d0bcaaea9e7651cf4a Mon Sep 17 00:00:00 2001 From: Linus Westling Date: Fri, 5 Dec 2025 11:47:27 +0100 Subject: [PATCH 07/10] =?UTF-8?q?Alla=20tester=20=C3=A4r=20gr=C3=B6na?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 1 - .../SimpleDriverManagerDataSource.java | 6 +- .../example/jdbc/JdbcAccountRepository.java | 67 +++++++------------ .../jdbc/JdbcMoonMissionRepository.java | 46 ++++++------- 4 files changed, 44 insertions(+), 76 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 073adf1..11e695f 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -56,7 +56,6 @@ public void run() { } } - // Once authenticated, show menu until user exits int choice; do { diff --git a/src/main/java/com/example/SimpleDriverManagerDataSource.java b/src/main/java/com/example/SimpleDriverManagerDataSource.java index 4471ce9..dfc2a56 100644 --- a/src/main/java/com/example/SimpleDriverManagerDataSource.java +++ b/src/main/java/com/example/SimpleDriverManagerDataSource.java @@ -8,7 +8,6 @@ public class SimpleDriverManagerDataSource { private final String jdbcUrl; private final String dbUser; private final String dbPass; - private Connection connection; // Resolve DB settings with precedence: System properties -> Environment variable public SimpleDriverManagerDataSource(String jdbcUrl, String dbUser, String dbPass){ @@ -23,10 +22,7 @@ public SimpleDriverManagerDataSource(String jdbcUrl, String dbUser, String dbPas } public Connection getConnection() throws SQLException{ - if (connection == null){ - connection = DriverManager.getConnection(jdbcUrl, dbUser, dbPass); - } - return connection; + return DriverManager.getConnection(jdbcUrl, dbUser, dbPass); } } diff --git a/src/main/java/com/example/jdbc/JdbcAccountRepository.java b/src/main/java/com/example/jdbc/JdbcAccountRepository.java index 3a61839..0d6eb7a 100644 --- a/src/main/java/com/example/jdbc/JdbcAccountRepository.java +++ b/src/main/java/com/example/jdbc/JdbcAccountRepository.java @@ -8,7 +8,6 @@ import java.sql.ResultSet; import java.sql.SQLException; - public class JdbcAccountRepository implements AccountRepository { private final SimpleDriverManagerDataSource ds; @@ -19,84 +18,64 @@ public JdbcAccountRepository(SimpleDriverManagerDataSource ds) { @Override public Boolean createAccount(String firstName, String lastName, String ssn, String password) { - - try (Connection connection = ds.getConnection()) { - - String sql = "insert into account (first_name, last_name, ssn, password) values (?, ?, ?, ?);"; - PreparedStatement ps = connection.prepareStatement(sql); + String sql = "INSERT INTO account (first_name, last_name, ssn, password) VALUES (?, ?, ?, ?)"; + try (Connection connection = ds.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql)) { ps.setString(1, firstName); ps.setString(2, lastName); ps.setString(3, ssn); ps.setString(4, password); - int rs = ps.executeUpdate(); - - return rs == 1; - + return ps.executeUpdate() == 1; } catch (SQLException e) { - throw new RuntimeException(e); + throw new RuntimeException("Error creating account", e); } - } @Override public Boolean updatePassword(int userId, String newPassword) { - - try (Connection connection = ds.getConnection()){ - - String sql = "update account set password = ? where userId = ?"; - PreparedStatement ps = connection.prepareStatement(sql); + String sql = "UPDATE account SET password = ? WHERE user_id = ?"; + try (Connection connection = ds.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql)) { ps.setString(1, newPassword); ps.setInt(2, userId); - int rs = ps.executeUpdate(); - - return rs == 1; - + return ps.executeUpdate() == 1; } catch (SQLException e) { - throw new RuntimeException(e); + throw new RuntimeException("Error updating password", e); } - } @Override public Boolean deleteAccount(int userId) { - - try (Connection connection = ds.getConnection()){ - - String sql = "delete from account where userId = ?"; - PreparedStatement ps = connection.prepareStatement(sql); + String sql = "DELETE FROM account WHERE user_id = ?"; + try (Connection connection = ds.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql)) { ps.setInt(1, userId); - int rs = ps.executeUpdate(); - - return rs == 1; - + return ps.executeUpdate() == 1; } catch (SQLException e) { - throw new RuntimeException(e); + throw new RuntimeException("Error deleting account", e); } - } @Override public Boolean validateCredentials(String username, String password) { - - try (Connection connection = ds.getConnection()){ - - String sql = "select * from account where name = ? and password = ?"; - PreparedStatement ps = connection.prepareStatement(sql); + // Adjust column names depending on your schema! + String sql = "SELECT * FROM account WHERE name = ? AND password = ?"; + try (Connection connection = ds.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql)) { ps.setString(1, username); ps.setString(2, password); - ResultSet rs = ps.executeQuery(); - - return rs.next(); - + try (ResultSet rs = ps.executeQuery()) { + return rs.next(); + } } catch (SQLException e) { - throw new RuntimeException(e); + return false; } } } diff --git a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java index 115e58d..efd280e 100644 --- a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java +++ b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java @@ -21,36 +21,32 @@ public JdbcMoonMissionRepository(SimpleDriverManagerDataSource ds) { @Override public List listMissions() { + String sql = "SELECT spacecraft FROM moon_mission"; + List result = new ArrayList<>(); - try (Connection connection = ds.getConnection()) { - - String sql = "select spacecraft from moon_mission;"; - PreparedStatement ps = connection.prepareStatement(sql); - ResultSet rs = ps.executeQuery(); - - List result = new ArrayList<>(); + try (Connection connection = ds.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql); + ResultSet rs = ps.executeQuery()) { - while (rs.next()){ + while (rs.next()) { result.add(rs.getString("spacecraft")); } - return result; - } catch (SQLException e) { - throw new RuntimeException(e); + throw new RuntimeException("Error listing missions", e); } } @Override public MoonMission getMissionById(int missionId) { - String sql = "select * from moon_mission where mission_id = ?"; + String sql = "SELECT * FROM moon_mission WHERE mission_id = ?"; try (Connection connection = ds.getConnection(); - PreparedStatement ps = connection.prepareStatement(sql);){ + PreparedStatement ps = connection.prepareStatement(sql)) { ps.setInt(1, missionId); - try (ResultSet rs = ps.executeQuery()){ + try (ResultSet rs = ps.executeQuery()) { if (rs.next()) { MoonMission mission = new MoonMission(); mission.setMissionId(rs.getInt("mission_id")); @@ -64,30 +60,28 @@ public MoonMission getMissionById(int missionId) { } } } catch (SQLException e) { - throw new RuntimeException(e); + throw new RuntimeException("Error fetching mission by ID", e); } return null; } @Override public int countMissionsByYear(int year) { + String sql = "SELECT COUNT(*) AS mission_count FROM moon_mission WHERE YEAR(launch_date) = ?"; - try (Connection connection = ds.getConnection()){ - - String sql = "select count(*) from moon_mission as mission_count where year(launch_date) = ?"; - PreparedStatement ps = connection.prepareStatement(sql); + try (Connection connection = ds.getConnection(); + PreparedStatement ps = connection.prepareStatement(sql)) { ps.setInt(1, year); - ResultSet rs = ps.executeQuery(); - - if (rs.next()){ - return rs.getInt("mission_count"); + try (ResultSet rs = ps.executeQuery()) { + if (rs.next()) { + return rs.getInt("mission_count"); + } } - } catch (SQLException e) { - throw new RuntimeException(e); + throw new RuntimeException("Error counting missions by year", e); } return 0; } -} +} \ No newline at end of file From 228ffcb1bbd33a83bae6c1b84de3baa3281d08d3 Mon Sep 17 00:00:00 2001 From: Linus Westling Date: Fri, 5 Dec 2025 12:33:47 +0100 Subject: [PATCH 08/10] =?UTF-8?q?F=C3=B6re=20jag=20lyssnar=20p=C3=A5=20cha?= =?UTF-8?q?tGPT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/java/com/example/Main.java | 6 ++++-- .../java/com/example/jdbc/JdbcMoonMissionRepository.java | 7 ++++--- .../com/example/repositorys/MoonMissionRepository.java | 3 ++- 3 files changed, 10 insertions(+), 6 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 11e695f..786f115 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -4,6 +4,7 @@ import com.example.jdbc.JdbcMoonMissionRepository; import java.util.Arrays; +import java.util.Optional; import java.util.Scanner; public class Main { @@ -131,8 +132,9 @@ public void options(int choice) { System.out.print("Enter a mission ID you want to search for: "); int missionId = sc.nextInt(); sc.nextLine(); - MoonMission mission = missionRepo.getMissionById(missionId); - if (mission != null) { + Optional missionOpt = missionRepo.getMissionById(missionId); + if (missionOpt.isPresent()) { + MoonMission mission = missionOpt.get(); System.out.printf( "Mission ID: %d%nSpacecraft: %s%nLaunch Date: %s%nCarrier Rocket: %s%nOutcome: %s%nMission Type: %s%nOperator: %s%n", mission.getMissionId(), diff --git a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java index efd280e..b5e1318 100644 --- a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java +++ b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java @@ -10,6 +10,7 @@ import java.sql.SQLException; import java.util.ArrayList; import java.util.List; +import java.util.Optional; public class JdbcMoonMissionRepository implements MoonMissionRepository { @@ -38,7 +39,7 @@ public List listMissions() { } @Override - public MoonMission getMissionById(int missionId) { + public Optional getMissionById(int missionId) { String sql = "SELECT * FROM moon_mission WHERE mission_id = ?"; try (Connection connection = ds.getConnection(); @@ -56,13 +57,13 @@ public MoonMission getMissionById(int missionId) { mission.setOutcome(rs.getString("outcome")); mission.setMissionType(rs.getString("mission_type")); mission.setOperator(rs.getString("operator")); - return mission; + return Optional.of(mission); } } } catch (SQLException e) { throw new RuntimeException("Error fetching mission by ID", e); } - return null; + return Optional.empty(); } @Override diff --git a/src/main/java/com/example/repositorys/MoonMissionRepository.java b/src/main/java/com/example/repositorys/MoonMissionRepository.java index b48f069..602f7dd 100644 --- a/src/main/java/com/example/repositorys/MoonMissionRepository.java +++ b/src/main/java/com/example/repositorys/MoonMissionRepository.java @@ -3,9 +3,10 @@ import com.example.MoonMission; import java.util.List; +import java.util.Optional; public interface MoonMissionRepository { List listMissions(); - MoonMission getMissionById(int missionId); + Optional getMissionById(int missionId); int countMissionsByYear(int year); } From badbe6a228f51c02ba975aa9caa356542e6c8884 Mon Sep 17 00:00:00 2001 From: Linus Westling Date: Fri, 5 Dec 2025 15:09:55 +0100 Subject: [PATCH 09/10] Slutgiltig version 1.0 --- src/main/java/com/example/Main.java | 30 +++++++++++++---------------- 1 file changed, 13 insertions(+), 17 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index 786f115..a03d8d0 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -4,7 +4,6 @@ import com.example.jdbc.JdbcMoonMissionRepository; import java.util.Arrays; -import java.util.Optional; import java.util.Scanner; public class Main { @@ -132,22 +131,19 @@ public void options(int choice) { System.out.print("Enter a mission ID you want to search for: "); int missionId = sc.nextInt(); sc.nextLine(); - Optional missionOpt = missionRepo.getMissionById(missionId); - if (missionOpt.isPresent()) { - MoonMission mission = missionOpt.get(); - System.out.printf( - "Mission ID: %d%nSpacecraft: %s%nLaunch Date: %s%nCarrier Rocket: %s%nOutcome: %s%nMission Type: %s%nOperator: %s%n", - mission.getMissionId(), - mission.getSpacecraft(), - mission.getLaunchDate(), - mission.getCarrierRocket(), - mission.getOutcome(), - mission.getMissionType(), - mission.getOperator() - ); - } else { - System.out.println("No mission found."); - } + missionRepo.getMissionById(missionId).ifPresentOrElse( + mission -> System.out.printf( + "Mission ID: %d%nSpacecraft: %s%nLaunch Date: %s%nCarrier Rocket: %s%nOutcome: %s%nMission Type: %s%nOperator: %s%n", + mission.getMissionId(), + mission.getSpacecraft(), + mission.getLaunchDate(), + mission.getCarrierRocket(), + mission.getOutcome(), + mission.getMissionType(), + mission.getOperator() + ), + () -> System.out.println("No mission found.") + ); break; case 3: From ba97b26123b58fa0f0dab27412797b2d865b567b Mon Sep 17 00:00:00 2001 From: Linus Westling Date: Fri, 5 Dec 2025 15:47:28 +0100 Subject: [PATCH 10/10] Slutgiltig version 1.1 --- src/main/java/com/example/Main.java | 11 +++++++++-- .../com/example/jdbc/JdbcMoonMissionRepository.java | 3 ++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/src/main/java/com/example/Main.java b/src/main/java/com/example/Main.java index a03d8d0..a65193f 100644 --- a/src/main/java/com/example/Main.java +++ b/src/main/java/com/example/Main.java @@ -129,8 +129,15 @@ public void options(int choice) { case 2: System.out.print("Enter a mission ID you want to search for: "); - int missionId = sc.nextInt(); - sc.nextLine(); + String missionIdStr = sc.nextLine(); + int missionId; + try{ + missionId = Integer.parseInt(missionIdStr); + } catch (NumberFormatException e) { + System.out.println("Invalid mission ID"); + break; + } + missionRepo.getMissionById(missionId).ifPresentOrElse( mission -> System.out.printf( "Mission ID: %d%nSpacecraft: %s%nLaunch Date: %s%nCarrier Rocket: %s%nOutcome: %s%nMission Type: %s%nOperator: %s%n", diff --git a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java index b5e1318..1070152 100644 --- a/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java +++ b/src/main/java/com/example/jdbc/JdbcMoonMissionRepository.java @@ -52,7 +52,8 @@ public Optional getMissionById(int missionId) { MoonMission mission = new MoonMission(); mission.setMissionId(rs.getInt("mission_id")); mission.setSpacecraft(rs.getString("spacecraft")); - mission.setLaunchDate(rs.getDate("launch_date").toLocalDate()); + java.sql.Date sqlDate = rs.getDate("launch_date"); + mission.setLaunchDate(sqlDate != null ? sqlDate.toLocalDate() : null); mission.setCarrierRocket(rs.getString("carrier_rocket")); mission.setOutcome(rs.getString("outcome")); mission.setMissionType(rs.getString("mission_type"));