From 76bf66912cb80283698768bbf5ec445a81f55681 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Thu, 2 Apr 2026 11:52:38 +0200 Subject: [PATCH 01/33] Fix: DatabaseConnection should actually be a little private --- helpmehelpapplication/.gitignore | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/helpmehelpapplication/.gitignore b/helpmehelpapplication/.gitignore index e673575..3fbc17a 100644 --- a/helpmehelpapplication/.gitignore +++ b/helpmehelpapplication/.gitignore @@ -1,2 +1,4 @@ .idea/ -target/ \ No newline at end of file +target/ +helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseConnection.java +helpmehelpapplication/src/main/resources/fxml/test/ From a19c6a36c5bb92c3e1fece412f65a4b2267061c7 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 5 Apr 2026 14:07:51 +0200 Subject: [PATCH 02/33] Feat: First draft of database (ER-diagram) --- docs/ER-DiagramFile.mwb | Bin 7633 -> 16658 bytes docs/ER-DiagramFile.mwb.bak | Bin 7602 -> 13090 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/ER-DiagramFile.mwb b/docs/ER-DiagramFile.mwb index c05526f18b6306eb8f0f6c26213810064e46bee0..f3d247210e1dbf19a6fc5862ea5dc3fa9e4aa42b 100644 GIT binary patch literal 16658 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 B8W8{h literal 7602 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 From 134c25ef8b7f3ab415cf214dd98ccbb8935fc5c8 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 5 Apr 2026 14:09:52 +0200 Subject: [PATCH 03/33] Feat: First draft of database (ER-diagram) --- docs/ER-Diagram v3.png | Bin 0 -> 79680 bytes docs/ER-Diagram v4.png | Bin 0 -> 101459 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 docs/ER-Diagram v3.png create mode 100644 docs/ER-Diagram v4.png diff --git a/docs/ER-Diagram v3.png b/docs/ER-Diagram v3.png new file mode 100644 index 0000000000000000000000000000000000000000..af63917cec3b193a12040df0d3a826da6845f83d GIT binary patch literal 79680 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

U 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%0Ah{bKL1pj}}zJnJh%fom~9NMG@@ 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 diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java index d3522ed..b0f1acc 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java @@ -17,7 +17,8 @@ class DonationDAOTest { @BeforeEach void setUp() { - DatabaseManager manager = new DatabaseManager(); + DatabaseConnection conn = new DatabaseConnection(); + DatabaseManager manager = new DatabaseManager(conn); manager.createTables(); charity = new Charity("123456", "https://test.org", "Test Charity", true, "approved"); diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java index 086ed69..25c214e 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java @@ -15,7 +15,8 @@ class DatabaseManagerTest { @BeforeEach public void setUp() throws SQLException { - this.dbManager = new DatabaseManager(); + DatabaseConnection conn = new DatabaseConnection(); + this.dbManager = new DatabaseManager(conn); } // Make sure you're connected to the NTNU network for this to work From 48b223576f5620802ad25828eeba2788b2ed6e70 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 12:40:41 +0200 Subject: [PATCH 12/33] On hold: Trying to implement feedback getter-method for database. Doesn't work until user is implemented. On hold. --- .../team6/database/DatabaseManager.java | 40 ++++++++++++++++--- .../systemutvikling/team6/models/Charity.java | 10 +++++ .../team6/models/Feedback.java | 24 +++++++++-- 3 files changed, 65 insertions(+), 9 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index 20972b2..e72fc5d 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -1,12 +1,11 @@ package ntnu.systemutvikling.team6.database; import java.sql.*; +import java.util.ArrayList; import java.util.List; import java.util.UUID; -import ntnu.systemutvikling.team6.models.Charity; -import ntnu.systemutvikling.team6.models.CharityRegistry; -import ntnu.systemutvikling.team6.models.Donation; -import ntnu.systemutvikling.team6.models.DonationRegistry; + +import ntnu.systemutvikling.team6.models.*; import ntnu.systemutvikling.team6.scraper.APICharityData; /** @@ -25,8 +24,8 @@ public class DatabaseManager { * Contractor for DatabaseManager. It uses a DatabaseConnection object that contains a connection * credentials. */ - public DatabaseManager() { - this.connection = new DatabaseConnection(); + public DatabaseManager(DatabaseConnection connection) { + this.connection = connection; } /** @@ -475,4 +474,33 @@ public DonationRegistry getDonationFromDB() { } return registry; } + public ArrayList getFeedbackforChairty(Charity charity){ + ArrayList Feedbacks = new ArrayList<>(); + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT + * + FROM Feedback f + WHERE f.charity_id = ?; + """; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, charity.getUUID().toString()); + ResultSet rs = stmt.executeQuery(sql_query); + + while (rs.next()){ + Feedback feedback = new Feedback( + + ) + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } finally { + conn = null; + } + return Feedbacks + } } diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Charity.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Charity.java index d97d996..eaae882 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Charity.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Charity.java @@ -123,4 +123,14 @@ public void setVerified() { public void setUnverified() { this.status = "Veto"; } + + /** + * Set method for feedbacks. + * Primarily will be used to set feedbacks taken from database. + * + * @param feedbacks + */ + public void setFeedbacks(ArrayList feedbacks){ + this.feedbacks = feedbacks; + } } diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java index 490c47e..2f167c8 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java @@ -1,6 +1,8 @@ package ntnu.systemutvikling.team6.models; +import java.time.LocalDate; import java.time.LocalDateTime; +import java.util.Date; import java.util.UUID; import ntnu.systemutvikling.team6.models.user.User; @@ -15,7 +17,7 @@ public class Feedback { private String comment; /* The date and time when the feedback was given */ - private LocalDateTime date; + private LocalDate date; /* Is the feedback given anonymously? */ private boolean isAnonymous; @@ -30,7 +32,23 @@ public Feedback(User user, String comment) { this.feedbackId = UUID.randomUUID(); this.user = user; this.comment = comment; - this.date = LocalDateTime.now(); + this.date = LocalDate.now(); + + this.isAnonymous = user.getSettings().isAnonymous(); + } + + /** + * Constructor for creating a new feedback, based on getting the data from DATABASE. + * + * @param user The user who gives the feedback. + * @param comment The content of the feedback. + */ + public Feedback(User user_id, String feedback_comment, LocalDate feedback_date) { + + this.feedbackId = UUID.randomUUID(); + this.user = user; + this.comment = comment; + this.date = feedback_date; this.isAnonymous = user.getSettings().isAnonymous(); } @@ -48,7 +66,7 @@ public String getComment() { return comment; } - public LocalDateTime getDate() { + public LocalDate getDate() { return date; } From 83f5f2d62e9d2761aa747642108783c86fcc6792 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 12:46:05 +0200 Subject: [PATCH 13/33] Feat: UserRegistry added --- .../team6/models/UserRegistry.java | 39 ++++++++++++++++++- 1 file changed, 38 insertions(+), 1 deletion(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/UserRegistry.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/UserRegistry.java index 514cbec..3035d48 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/UserRegistry.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/UserRegistry.java @@ -1,3 +1,40 @@ package ntnu.systemutvikling.team6.models; -public class UserRegistry {} +import ntnu.systemutvikling.team6.models.user.User; + +import java.util.*; + +public class UserRegistry { + private final List Users; + + public UserRegistry() { + this.Users = new ArrayList<>(); + } + + public List getAllUsers() { + return Collections.unmodifiableList(Users); + } + + public Optional findUserById(UUID userUUID) { + if (userUUID == null) { + throw new IllegalArgumentException("DonationId can not be null."); + } + return Users.stream() + .filter(u -> userUUID.equals(u.getId())) + .findFirst(); + } + + public void addUser(User user) { + if (user == null) { + throw new IllegalArgumentException("Donation can not be null."); + } + Users.add(user); + } + + public boolean removeUserByUUID(UUID userUUID) { + if (userUUID == null) { + throw new IllegalArgumentException("DonationId can not be null."); + } + return Users.removeIf(user -> userUUID.equals(user.getId())); + } +} From b6369e958278d4a8baf9cde7c349171a5400dd2f Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 13:12:28 +0200 Subject: [PATCH 14/33] Feat: User password field added (whoops) --- docs/ER-Diagram v4.png | Bin 101502 -> 103822 bytes docs/ER-DiagramFile.mwb | Bin 16534 -> 16584 bytes docs/ER-DiagramFile.mwb.bak | Bin 16420 -> 16534 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/ER-Diagram v4.png b/docs/ER-Diagram v4.png index e031b2145c34a8cceb9ff092d02c8b43d62bce3e..bffbaf8ac4292e8b49a52934edebf3771ef0e7aa 100644 GIT binary patch delta 71996 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

$obShFc#50cjDC6hykaJEcpyk?w978fg&$ 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

$?;DqiqV^1TVDq}r7uLpKNq7$#b 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 D5MzIe delta 69539 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 diff --git a/docs/ER-DiagramFile.mwb b/docs/ER-DiagramFile.mwb index 64d953370ece8645f76d027e2fe074078cb0a310..ee90f5e991fd3956fff04df78f71d50ef4d0ed35 100644 GIT binary patch delta 15852 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 delta 15823 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

2Q5(-1j$jzgrVamnx7)-igoDE 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 diff --git a/docs/ER-DiagramFile.mwb.bak b/docs/ER-DiagramFile.mwb.bak index 7b4776f764e886437753d587db8d163f21070a61..64d953370ece8645f76d027e2fe074078cb0a310 100644 GIT binary patch delta 13456 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

5WGcV>h-PDe>>U=P0q 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 Fe*jcb4$J@m From d615a1aeb0e0b0427ce172fd24ec3ebe0436a924 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 13:22:08 +0200 Subject: [PATCH 15/33] Feat: User object has a another constructor taylored for getting data from Database --- .../team6/models/user/User.java | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java index ef59000..dded155 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java @@ -68,6 +68,46 @@ public User( this.settings = settings; this.inbox = inbox; } + /** + * Creates a new user taylored for getting info from DATABASE. + * Settings and inbox can be set on a later date throught another method in databaseManager class + * + * @param uuid gives the user a unique identifier with UUID + * @param name the name of the user + * @param email the email of the user + * @param password the password for the user + * @param role users role + * @throws IllegalArgumentException if any required argument is invalid. + */ + public User( + String uuid, String name, String email, String password, String role) { + + if (uuid == null || uuid.isBlank()) { + throw new IllegalArgumentException("UUID cannot be null or blank."); + } + + if (name == null || name.isBlank()) { + throw new IllegalArgumentException("Name cannot be null or blank."); + } + + if (email == null || email.isBlank() || !email.contains("@") || !email.contains(".")) { + throw new IllegalArgumentException( + "Email cannot be null or blank," + " and must contain '@' and '.'"); + } + + if (role == null) { + throw new IllegalArgumentException("Role cannot be null"); + } + + + this.id = UUID.fromString(uuid); + this.name = name; + this.email = email; + this.passwordHash = password; + this.role = Role.valueOf(role); + this.settings = null; + this.inbox = null; + } // Add Getters From 416f75cce055609fe41281f57638f5d9d2cddc2b Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 13:49:42 +0200 Subject: [PATCH 16/33] Feat: Two new methods for DataManager: GetUser (return user) and getUsers(returns a UserRegistry) --- .../team6/database/DatabaseManager.java | 69 ++++++++++++++++++- 1 file changed, 67 insertions(+), 2 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index e72fc5d..16e77b6 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -6,6 +6,7 @@ import java.util.UUID; import ntnu.systemutvikling.team6.models.*; +import ntnu.systemutvikling.team6.models.user.User; import ntnu.systemutvikling.team6.scraper.APICharityData; /** @@ -114,6 +115,7 @@ FOREIGN KEY (`user_id`) `UUID_User` CHAR(36) NOT NULL, `user_name` VARCHAR(255) NOT NULL, `user_email` VARCHAR(255) NOT NULL, + `user_password` VARCHAR(255) NOT NULL, `role` VARCHAR(45) NOT NULL, PRIMARY KEY (`UUID_User`)) ENGINE = InnoDB; @@ -424,6 +426,66 @@ public CharityRegistry getCharitiesFromDB() { } return registry; } + public UserRegistry getUsersFromDB(){ + UserRegistry registry = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT UUID_User, user_name, user_email, user_password, role FROM User + """; + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql_query); + + while (rs.next()) { + User user = new User( + rs.getString("UUID_User"), + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); + registry.addUser(user); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + return registry; + } + + public User getUserFromDBUuid(UUID uuid){ + User user = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT UUID_User, user_name, user_email, user_password, role FROM User + WHERE UUID_User = ?; + """; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, uuid.toString()); + stmt.setMaxRows(1); + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + user = new User( + rs.getString("UUID_User"), + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + return user; + } + public DonationRegistry getDonationFromDB() { DonationRegistry registry = null; @@ -474,7 +536,8 @@ public DonationRegistry getDonationFromDB() { } return registry; } - public ArrayList getFeedbackforChairty(Charity charity){ + public ArrayList setFeedbackforChairty(Charity charity){ + /* ArrayList Feedbacks = new ArrayList<>(); Connection conn = null; try { @@ -501,6 +564,8 @@ public ArrayList getFeedbackforChairty(Charity charity){ } finally { conn = null; } - return Feedbacks + + */ + return null; } } From 8db6609e1e7a5a7a570e4f41e854a4a280f09db6 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 14:08:07 +0200 Subject: [PATCH 17/33] Feat: User set methods (for database) --- .../team6/models/user/User.java | 23 +++++++++++++++---- 1 file changed, 18 insertions(+), 5 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java index dded155..4c3f108 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java @@ -16,18 +16,17 @@ public class User { private static final PasswordHasher passwordHasher = new PasswordHasher(); - private final UUID id; + private UUID id; private String name; private String email; private String passwordHash; - private final Role role; - private final Settings settings; - private final Inbox inbox; + private Role role; + private Settings settings; + private Inbox inbox; /** * Creates a new user. * - * @param id gives the user a unique identifier with UUID * @param name the name of the user * @param email the email of the user * @param password the password for the user @@ -186,4 +185,18 @@ public void setEmail(String email) { public boolean checkPassword(String password) { return passwordHasher.isValidPassword(password, passwordHash); } + + public void setSettings(Settings settings){ + if (settings == null){ + throw new IllegalArgumentException("Settings cannot be null"); + } + this.settings = settings; + } + + public void setInbox(Inbox inbox){ + if (inbox == null){ + throw new IllegalArgumentException("Inbox cannot be null"); + } + this.inbox = inbox; + } } From dc3e7ea47b74af998080b94b7dcea4dccf1677d0 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 20:03:44 +0200 Subject: [PATCH 18/33] Feat: user has settings when getting data from database (A method) --- .../team6/database/DatabaseManager.java | 34 +++++++++++++++++++ .../team6/models/user/Settings.java | 1 + 2 files changed, 35 insertions(+) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index 16e77b6..8036c6e 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -6,6 +6,8 @@ import java.util.UUID; import ntnu.systemutvikling.team6.models.*; +import ntnu.systemutvikling.team6.models.user.Language; +import ntnu.systemutvikling.team6.models.user.Settings; import ntnu.systemutvikling.team6.models.user.User; import ntnu.systemutvikling.team6.scraper.APICharityData; @@ -478,6 +480,8 @@ public User getUserFromDBUuid(UUID uuid){ rs.getString("user_password"), rs.getString("role") ); + Settings settings = getAndSetSettingsForUserObject(user.getId().toString()); + user.setSettings(settings); } } catch (SQLException e) { e.printStackTrace(); @@ -486,6 +490,36 @@ public User getUserFromDBUuid(UUID uuid){ return user; } + public Settings getAndSetSettingsForUserObject(String user_id){ + Settings settings = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT User_UUID_User, isAnonymous, language, lightmode FROM Settings + WHERE User_UUID_User = ?; + """; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, user_id); + stmt.setMaxRows(1); + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + settings = new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode") + ); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + + return settings; + } + public DonationRegistry getDonationFromDB() { DonationRegistry registry = null; diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Settings.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Settings.java index d814283..36d049b 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Settings.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Settings.java @@ -33,6 +33,7 @@ public Settings(boolean lightMode, Language language, boolean anonymous) { this.anonymous = anonymous; } + /** Toggles between light and dark mode */ public void toggleLightMode() { lightMode = !lightMode; From e17ae394cdbc761b013f6d036ba570046b2787b8 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 20:37:16 +0200 Subject: [PATCH 19/33] Fix and feat: Changed String from field to UUID for matching of charity and such, and added new contructur to make previous messages. --- .../team6/models/user/Message.java | 55 ++++++++++++++++--- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Message.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Message.java index b70ece1..3f0fe44 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Message.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Message.java @@ -1,5 +1,6 @@ package ntnu.systemutvikling.team6.models.user; +import java.time.LocalDate; import java.time.LocalDateTime; import java.util.UUID; @@ -13,9 +14,9 @@ public class Message { private final UUID id; private final String title; - private final String from; + private final UUID fromCharityID; private final String content; - private final LocalDateTime timeAndDate; + private final LocalDate timeAndDate; /** * Creates a message with a unique identifier. The message includes a title, a string who it's @@ -26,13 +27,13 @@ public class Message { * @param content the content of the message * @throws IllegalArgumentException if title, from or content is null or blank. */ - public Message(String title, String from, String content) { + public Message(String title, UUID from, String content) { if (title == null || title.isBlank()) { throw new IllegalArgumentException("Title cannot be null or blank."); } - if (from == null || from.isBlank()) { + if (from == null) { throw new IllegalArgumentException("From cannot be null or blank."); } @@ -42,9 +43,45 @@ public Message(String title, String from, String content) { this.id = UUID.randomUUID(); this.title = title; - this.from = from; + this.fromCharityID = from; this.content = content; - this.timeAndDate = LocalDateTime.now(); + this.timeAndDate = LocalDate.now(); + } + + /** + * Creates a message with a unique identifier. The message includes a title, a string who it's + * from, content and the time and date. + * This one creates a message that has been created before. + * + * @param title the title of the message + * @param from who the message is from + * @param content the content of the message + * @param date date of when the message was created + * @throws IllegalArgumentException if title, from or content is null or blank. + */ + public Message(String title, UUID from, String content, LocalDate date) { + + if (title == null || title.isBlank()) { + throw new IllegalArgumentException("Title cannot be null or blank."); + } + + if (from == null) { + throw new IllegalArgumentException("From cannot be null or blank."); + } + + if (content == null || content.isBlank()) { + throw new IllegalArgumentException("Content cannot be null or blank."); + } + + if (date == null) { + throw new IllegalArgumentException("Content cannot be null or blank."); + } + + this.id = UUID.randomUUID(); + this.title = title; + this.fromCharityID = from; + this.content = content; + this.timeAndDate = date; } public UUID getId() { @@ -55,15 +92,15 @@ public String getTitle() { return title; } - public String getFrom() { - return from; + public UUID getFrom() { + return fromCharityID; } public String getContent() { return content; } - public LocalDateTime getTimeAndDate() { + public LocalDate getTimeAndDate() { return timeAndDate; } } From a9aad5bb5c0fdfdc5e52eef80351805d4561d3da Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 20:37:30 +0200 Subject: [PATCH 20/33] Feat: Users get inbox --- .../team6/database/DatabaseManager.java | 44 ++++++++++++++++--- 1 file changed, 39 insertions(+), 5 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index 8036c6e..55ba947 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -1,14 +1,13 @@ package ntnu.systemutvikling.team6.database; import java.sql.*; +import java.time.LocalDate; import java.util.ArrayList; import java.util.List; import java.util.UUID; import ntnu.systemutvikling.team6.models.*; -import ntnu.systemutvikling.team6.models.user.Language; -import ntnu.systemutvikling.team6.models.user.Settings; -import ntnu.systemutvikling.team6.models.user.User; +import ntnu.systemutvikling.team6.models.user.*; import ntnu.systemutvikling.team6.scraper.APICharityData; /** @@ -480,7 +479,10 @@ public User getUserFromDBUuid(UUID uuid){ rs.getString("user_password"), rs.getString("role") ); - Settings settings = getAndSetSettingsForUserObject(user.getId().toString()); + Settings settings = getSettingsForUser(user.getId().toString()); + user.setSettings(settings); + + Inbox inbox = getInboxForUser(user.getId().toString()); user.setSettings(settings); } } catch (SQLException e) { @@ -490,7 +492,7 @@ public User getUserFromDBUuid(UUID uuid){ return user; } - public Settings getAndSetSettingsForUserObject(String user_id){ + public Settings getSettingsForUser(String user_id){ Settings settings = null; Connection conn = null; try { @@ -520,6 +522,38 @@ public Settings getAndSetSettingsForUserObject(String user_id){ return settings; } + public Inbox getInboxForUser(String user_id){ + Inbox inbox = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT UUID_message, message_title, message_content, message_date, sender_user_id, sender_charity_id, user_id FROM Settings + WHERE User_UUID_User = ?; + """; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, user_id); + stmt.setMaxRows(1); + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + Message message = new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_date"), + LocalDate.parse(rs.getString("message_date")) + ); + inbox.addMessage(message); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + + return inbox; + } + public DonationRegistry getDonationFromDB() { DonationRegistry registry = null; From abc92c08e7d0aa01de44e671af7f6f1706b2bed8 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 20:39:05 +0200 Subject: [PATCH 21/33] Fix: User-registry return method have the same methods as in User return method --- .../systemutvikling/team6/database/DatabaseManager.java | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index 55ba947..3af2fd7 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -447,7 +447,11 @@ public UserRegistry getUsersFromDB(){ rs.getString("user_password"), rs.getString("role") ); - registry.addUser(user); + Settings settings = getSettingsForUser(user.getId().toString()); + user.setSettings(settings); + + Inbox inbox = getInboxForUser(user.getId().toString()); + user.setInbox(inbox); } } catch (SQLException e) { e.printStackTrace(); @@ -483,7 +487,7 @@ public User getUserFromDBUuid(UUID uuid){ user.setSettings(settings); Inbox inbox = getInboxForUser(user.getId().toString()); - user.setSettings(settings); + user.setInbox(inbox); } } catch (SQLException e) { e.printStackTrace(); From cfeaa5d467c0c59e72cc326f3a89e9f1873a36ca Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Thu, 9 Apr 2026 22:31:04 +0200 Subject: [PATCH 22/33] Feat: New row for user and feedback can now be set when getting charities from db. --- .../team6/database/DatabaseManager.java | 35 +++++++++++-------- .../team6/models/Feedback.java | 12 +++---- 2 files changed, 26 insertions(+), 21 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index 3af2fd7..b158b39 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -114,6 +114,7 @@ FOREIGN KEY (`user_id`) -- ----------------------------------------------------- CREATE TABLE IF NOT EXISTS `apbaluna`.`User` ( `UUID_User` CHAR(36) NOT NULL, + `user_displayname` VARCHAR(255) NOT NULL, `user_name` VARCHAR(255) NOT NULL, `user_email` VARCHAR(255) NOT NULL, `user_password` VARCHAR(255) NOT NULL, @@ -419,6 +420,9 @@ public CharityRegistry getCharitiesFromDB() { rs.getString("charity_name"), rs.getBoolean("pre_approved"), rs.getString("status")); + ArrayList feedbacks = getFeedbackforChairtyUUID(charity.getUUID().toString()); + charity.setFeedbacks(feedbacks); + registry.addCharity(charity); } } catch (SQLException e) { @@ -460,7 +464,7 @@ public UserRegistry getUsersFromDB(){ return registry; } - public User getUserFromDBUuid(UUID uuid){ + public User getUserFromDBUuid(String user_id){ User user = null; Connection conn = null; try { @@ -471,7 +475,7 @@ public User getUserFromDBUuid(UUID uuid){ WHERE UUID_User = ?; """; PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, uuid.toString()); + stmt.setString(1, user_id); stmt.setMaxRows(1); ResultSet rs = stmt.executeQuery(); @@ -608,8 +612,8 @@ public DonationRegistry getDonationFromDB() { } return registry; } - public ArrayList setFeedbackforChairty(Charity charity){ - /* + + public ArrayList getFeedbackforChairtyUUID(String charity_uuid) { ArrayList Feedbacks = new ArrayList<>(); Connection conn = null; try { @@ -617,18 +621,21 @@ public ArrayList setFeedbackforChairty(Charity charity){ String sql_query = """ SELECT - * - FROM Feedback f + UUID_feedback, feedback_comment, feedback_date, isAnonymous, charity_id, user_id + FROM Feedback WHERE f.charity_id = ?; """; PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, charity.getUUID().toString()); + stmt.setString(1, charity_uuid); ResultSet rs = stmt.executeQuery(sql_query); - while (rs.next()){ + while (rs. next()){ Feedback feedback = new Feedback( - - ) + rs.getString("UUID_feedback"), + getUserFromDBUuid(rs.getString("user_id")), + rs.getString("feedback_comment"), + LocalDate.parse(rs.getString("feedback_date")) + ); } } catch (Exception e) { e.printStackTrace(); @@ -636,8 +643,6 @@ public ArrayList setFeedbackforChairty(Charity charity){ } finally { conn = null; } - - */ - return null; - } -} + return Feedbacks; + } +} \ No newline at end of file diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java index 2f167c8..6d071cf 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java @@ -23,7 +23,7 @@ public class Feedback { private boolean isAnonymous; /** - * Constructor for creating a new feedback. + * Constructor for creating a new feedback now. * * @param user The user who gives the feedback. * @param comment The content of the feedback. @@ -33,19 +33,19 @@ public Feedback(User user, String comment) { this.user = user; this.comment = comment; this.date = LocalDate.now(); - this.isAnonymous = user.getSettings().isAnonymous(); } /** - * Constructor for creating a new feedback, based on getting the data from DATABASE. + * Constructor for creating a new feedback, based on making a feedback previously made. * * @param user The user who gives the feedback. * @param comment The content of the feedback. - */ - public Feedback(User user_id, String feedback_comment, LocalDate feedback_date) { + * @param feedback_date The content of the feedback. - this.feedbackId = UUID.randomUUID(); + */ + public Feedback(String feedback_id, User user, String feedback_comment, LocalDate feedback_date) { + this.feedbackId = UUID.fromString(feedback_id); this.user = user; this.comment = comment; this.date = feedback_date; From 92ec053c0369eda04b2a88e864b3eee60a965717 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Thu, 9 Apr 2026 22:31:31 +0200 Subject: [PATCH 23/33] Feat: Folder for sql --- docs/{ => SqlDatabase}/ER-Diagram v1.png | Bin docs/{ => SqlDatabase}/ER-Diagram v2.png | Bin docs/{ => SqlDatabase}/ER-Diagram v3.png | Bin docs/{ => SqlDatabase}/ER-Diagram v4.png | Bin docs/{ => SqlDatabase}/ER-DiagramFile.mwb | Bin docs/{ => SqlDatabase}/ER-DiagramFile.mwb.bak | Bin docs/{ => SqlDatabase}/Sql_script_v1.1.sql | 0 docs/{ => SqlDatabase}/Sql_script_v1.2.sql | 0 docs/{ => SqlDatabase}/Sql_scriptv1.0.sql | 0 9 files changed, 0 insertions(+), 0 deletions(-) rename docs/{ => SqlDatabase}/ER-Diagram v1.png (100%) rename docs/{ => SqlDatabase}/ER-Diagram v2.png (100%) rename docs/{ => SqlDatabase}/ER-Diagram v3.png (100%) rename docs/{ => SqlDatabase}/ER-Diagram v4.png (100%) rename docs/{ => SqlDatabase}/ER-DiagramFile.mwb (100%) rename docs/{ => SqlDatabase}/ER-DiagramFile.mwb.bak (100%) rename docs/{ => SqlDatabase}/Sql_script_v1.1.sql (100%) rename docs/{ => SqlDatabase}/Sql_script_v1.2.sql (100%) rename docs/{ => SqlDatabase}/Sql_scriptv1.0.sql (100%) diff --git a/docs/ER-Diagram v1.png b/docs/SqlDatabase/ER-Diagram v1.png similarity index 100% rename from docs/ER-Diagram v1.png rename to docs/SqlDatabase/ER-Diagram v1.png diff --git a/docs/ER-Diagram v2.png b/docs/SqlDatabase/ER-Diagram v2.png similarity index 100% rename from docs/ER-Diagram v2.png rename to docs/SqlDatabase/ER-Diagram v2.png diff --git a/docs/ER-Diagram v3.png b/docs/SqlDatabase/ER-Diagram v3.png similarity index 100% rename from docs/ER-Diagram v3.png rename to docs/SqlDatabase/ER-Diagram v3.png diff --git a/docs/ER-Diagram v4.png b/docs/SqlDatabase/ER-Diagram v4.png similarity index 100% rename from docs/ER-Diagram v4.png rename to docs/SqlDatabase/ER-Diagram v4.png diff --git a/docs/ER-DiagramFile.mwb b/docs/SqlDatabase/ER-DiagramFile.mwb similarity index 100% rename from docs/ER-DiagramFile.mwb rename to docs/SqlDatabase/ER-DiagramFile.mwb diff --git a/docs/ER-DiagramFile.mwb.bak b/docs/SqlDatabase/ER-DiagramFile.mwb.bak similarity index 100% rename from docs/ER-DiagramFile.mwb.bak rename to docs/SqlDatabase/ER-DiagramFile.mwb.bak diff --git a/docs/Sql_script_v1.1.sql b/docs/SqlDatabase/Sql_script_v1.1.sql similarity index 100% rename from docs/Sql_script_v1.1.sql rename to docs/SqlDatabase/Sql_script_v1.1.sql diff --git a/docs/Sql_script_v1.2.sql b/docs/SqlDatabase/Sql_script_v1.2.sql similarity index 100% rename from docs/Sql_script_v1.2.sql rename to docs/SqlDatabase/Sql_script_v1.2.sql diff --git a/docs/Sql_scriptv1.0.sql b/docs/SqlDatabase/Sql_scriptv1.0.sql similarity index 100% rename from docs/Sql_scriptv1.0.sql rename to docs/SqlDatabase/Sql_scriptv1.0.sql From 7503df6d6256946a6755b5a4b949834444429a8b Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 16:58:54 +0200 Subject: [PATCH 24/33] Fix: Refined methods to prevent N+1 loops query for shorter prosessing --- .../team6/database/DatabaseManager.java | 189 +++++++++++++----- 1 file changed, 143 insertions(+), 46 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index b158b39..b414fde 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -406,24 +406,57 @@ public CharityRegistry getCharitiesFromDB() { try { conn = connection.getMySqlConnection(); String sql_query = - "SELECT UUID_charities, org_number, charity_name, charity_link, pre_approved, status FROM Charities"; + """ + SELECT + c.UUID_charities, c.org_number, c.charity_name, c.charity_link, c.pre_approved, c.status, + f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, + u.UUID_user, u.user_name, u.user_email, u.user_password, u.role + FROM Charities c + LEFT JOIN Feedback f ON f.charity_id = c.UUID_charities + LEFT JOIN User u ON f.user_id = u.UUID_user + """; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql_query); + Charity currentCharity = null; + String lastCharity = null; + registry = new CharityRegistry(); while (rs.next()) { - Charity charity = + String currentId = rs.getString("UUID_charities"); + + if (lastCharity == null || !currentId.equals(lastCharity)) { + currentCharity = new Charity( rs.getString("UUID_charities"), rs.getString("org_number"), rs.getString("charity_link"), rs.getString("charity_name"), rs.getBoolean("pre_approved"), - rs.getString("status")); - ArrayList feedbacks = getFeedbackforChairtyUUID(charity.getUUID().toString()); - charity.setFeedbacks(feedbacks); - - registry.addCharity(charity); + rs.getString("status") + ); + registry.addCharity(currentCharity); + lastCharity = currentId; + } + String feedbackId = rs.getString("UUID_feedback"); + if (feedbackId != null){ + User userWithNoSettingsAndInbox = new User( + rs.getString("UUID_User"), + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); + + Feedback feedback = new Feedback( + rs.getString("UUID_feedback"), + userWithNoSettingsAndInbox, + rs.getString("feedback_comment"), + LocalDate.parse(rs.getString("feedback_date")) + ); + + currentCharity.getFeedbacks().add(feedback); + } } } catch (SQLException e) { e.printStackTrace(); @@ -432,30 +465,60 @@ public CharityRegistry getCharitiesFromDB() { return registry; } public UserRegistry getUsersFromDB(){ - UserRegistry registry = null; + UserRegistry registry = new UserRegistry(); Connection conn = null; try { conn = connection.getMySqlConnection(); String sql_query = """ - SELECT UUID_User, user_name, user_email, user_password, role FROM User + SELECT + u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, + s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, + m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id + FROM User u + LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user + LEFT JOIN Messages m ON u.UUID_User = m.user_id """; Statement stmt = conn.createStatement(); ResultSet rs = stmt.executeQuery(sql_query); - while (rs.next()) { - User user = new User( - rs.getString("UUID_User"), - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); - Settings settings = getSettingsForUser(user.getId().toString()); - user.setSettings(settings); + User currentUser = null; + String lastUserid = null; - Inbox inbox = getInboxForUser(user.getId().toString()); - user.setInbox(inbox); + while (rs.next()) { + String userId = rs.getString("UUID_User"); + + if (lastUserid == null || !userId.equals(lastUserid)) { + currentUser = new User( + userId, + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); + if (rs.getString("isAnonymous") != null){ + Settings settings = new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode") + ); + currentUser.setSettings(settings); + } + currentUser.setInbox(new Inbox()); + registry.addUser(currentUser); + lastUserid = userId; + } + String messageId = rs.getString("UUID_message"); + if (messageId != null) { + Message message = new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_content"), + LocalDate.parse(rs.getString("message_date")) + ); + + currentUser.getInbox().addMessage(message); + } } } catch (SQLException e) { e.printStackTrace(); @@ -471,27 +534,52 @@ public User getUserFromDBUuid(String user_id){ conn = connection.getMySqlConnection(); String sql_query = """ - SELECT UUID_User, user_name, user_email, user_password, role FROM User - WHERE UUID_User = ?; + SELECT + u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, + s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, + m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id + FROM User u + LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user + LEFT JOIN Messages m ON u.UUID_User = m.user_id + WHERE u.UUID_User = ?; """; PreparedStatement stmt = conn.prepareStatement(sql_query); stmt.setString(1, user_id); - stmt.setMaxRows(1); ResultSet rs = stmt.executeQuery(); + String lastUserid = null; while (rs.next()) { - user = new User( - rs.getString("UUID_User"), - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); - Settings settings = getSettingsForUser(user.getId().toString()); - user.setSettings(settings); - - Inbox inbox = getInboxForUser(user.getId().toString()); - user.setInbox(inbox); + String userId = rs.getString("UUID_User"); + if (lastUserid == null || !userId.equals(lastUserid)) { + user = new User( + userId, + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); + if (rs.getString("isAnonymous") != null){ + Settings settings = new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode") + ); + user.setSettings(settings); + } + user.setInbox(new Inbox()); + lastUserid = userId; + } + String messageId = rs.getString("UUID_message"); + if (messageId != null) { + Message message = new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_content"), + LocalDate.parse(rs.getString("message_date")) + ); + + user.getInbox().addMessage(message); + } } } catch (SQLException e) { e.printStackTrace(); @@ -531,18 +619,17 @@ public Settings getSettingsForUser(String user_id){ } public Inbox getInboxForUser(String user_id){ - Inbox inbox = null; + Inbox inbox = new Inbox(); Connection conn = null; try { conn = connection.getMySqlConnection(); String sql_query = """ - SELECT UUID_message, message_title, message_content, message_date, sender_user_id, sender_charity_id, user_id FROM Settings - WHERE User_UUID_User = ?; + SELECT UUID_message, message_title, message_content, message_date, sender_user_id, sender_charity_id, user_id FROM Messages + WHERE user_id = ?; """; PreparedStatement stmt = conn.prepareStatement(sql_query); stmt.setString(1, user_id); - stmt.setMaxRows(1); ResultSet rs = stmt.executeQuery(); while (rs.next()) { @@ -613,7 +700,7 @@ public DonationRegistry getDonationFromDB() { return registry; } - public ArrayList getFeedbackforChairtyUUID(String charity_uuid) { + public ArrayList getFeedbackforCharityUUID(String charity_uuid) { ArrayList Feedbacks = new ArrayList<>(); Connection conn = null; try { @@ -621,21 +708,31 @@ public ArrayList getFeedbackforChairtyUUID(String charity_uuid) { String sql_query = """ SELECT - UUID_feedback, feedback_comment, feedback_date, isAnonymous, charity_id, user_id - FROM Feedback + f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, + u.UUID_user, u.user_name, u.user_email, u.user_password, u.role + FROM Feedback f + LEFT JOIN User u ON f.user_id = u.UUID_user WHERE f.charity_id = ?; """; PreparedStatement stmt = conn.prepareStatement(sql_query); stmt.setString(1, charity_uuid); - ResultSet rs = stmt.executeQuery(sql_query); + ResultSet rs = stmt.executeQuery(); - while (rs. next()){ + while (rs.next()){ + User userWithNoSettingsAndInbox = new User( + rs.getString("UUID_User"), + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); Feedback feedback = new Feedback( rs.getString("UUID_feedback"), - getUserFromDBUuid(rs.getString("user_id")), + userWithNoSettingsAndInbox, rs.getString("feedback_comment"), LocalDate.parse(rs.getString("feedback_date")) ); + Feedbacks.add(feedback); } } catch (Exception e) { e.printStackTrace(); From 02fbe15651586859713678c284f6ffb1272999d1 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 19:28:40 +0200 Subject: [PATCH 25/33] Fix: Futher refined methods to avoid n+1 threading and splitted it for more accessibiliy --- .../systemutvikling/team6/HmHApplication.java | 11 +- .../AvailableOrganizationController.java | 4 +- .../team6/controller/FrontpageController.java | 11 +- .../team6/database/APIToDatabaseService.java | 139 ++++ .../team6/database/DatabaseManager.java | 745 ------------------ .../team6/database/DatabaseSetup.java | 284 +++++++ .../team6/database/Readers/CharitySelect.java | 126 +++ .../database/Readers/DonationSelect.java | 68 ++ .../team6/database/Readers/UserSelect.java | 201 +++++ .../team6/models/Feedback.java | 2 +- .../team6/scraper/APICharityData.java | 4 +- .../team6/DAO/DonationDAOTest.java | 4 +- .../team6/database/DatabaseManagerTest.java | 5 +- 13 files changed, 839 insertions(+), 765 deletions(-) create mode 100644 helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/APIToDatabaseService.java delete mode 100644 helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java create mode 100644 helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java create mode 100644 helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java create mode 100644 helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java create mode 100644 helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java index 74bb73c..da9cebb 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java @@ -3,14 +3,11 @@ import static javafx.application.Application.launch; import java.net.http.HttpClient; -import java.util.Objects; + import javafx.application.Application; -import javafx.fxml.FXMLLoader; -import javafx.scene.Scene; -import javafx.scene.image.Image; import javafx.stage.Stage; import ntnu.systemutvikling.team6.database.DatabaseConnection; -import ntnu.systemutvikling.team6.database.DatabaseManager; +import ntnu.systemutvikling.team6.database.DatabaseSetup; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; import ntnu.systemutvikling.team6.scraper.APICharityScraper; @@ -42,7 +39,7 @@ public void init() { /* Test and create tables to MySQL if ain't any */ try { DatabaseConnection conn = new DatabaseConnection(); - DatabaseManager db = new DatabaseManager(conn); + DatabaseSetup db = new DatabaseSetup(conn); db.testConnection(); db.createTables(); } catch (Exception e) { @@ -53,7 +50,7 @@ public void init() { HttpClient https = HttpClient.newHttpClient(); APICharityScraper scraper = new APICharityScraper(https); DatabaseConnection conn = new DatabaseConnection(); - DatabaseManager db = new DatabaseManager(conn); + DatabaseSetup db = new DatabaseSetup(conn); if (scraper.checkConnection()) { CharityRegistry charityRegistry = scraper.parseJSON(scraper.getJSONData()); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java index 1d74e24..139a5d2 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java @@ -10,7 +10,7 @@ import javafx.scene.control.TextField; import javafx.scene.layout.FlowPane; import ntnu.systemutvikling.team6.database.DatabaseConnection; -import ntnu.systemutvikling.team6.database.DatabaseManager; +import ntnu.systemutvikling.team6.database.DatabaseSetup; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; @@ -40,7 +40,7 @@ public class AvailableOrganizationController { @FXML public void initialize() { DatabaseConnection conn = new DatabaseConnection(); - DatabaseManager db = new DatabaseManager(conn); + DatabaseSetup db = new DatabaseSetup(conn); CharityRegistry charities = db.getCharitiesFromDB(); allCharities = charities.getAllCharities(); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java index 1cad4eb..9ce1e2e 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java @@ -13,7 +13,9 @@ import javafx.scene.control.TextField; import javafx.scene.layout.FlowPane; import ntnu.systemutvikling.team6.database.DatabaseConnection; -import ntnu.systemutvikling.team6.database.DatabaseManager; +import ntnu.systemutvikling.team6.database.DatabaseSetup; +import ntnu.systemutvikling.team6.database.Readers.CharitySelect; +import ntnu.systemutvikling.team6.database.Readers.DonationSelect; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; import ntnu.systemutvikling.team6.models.Donation; @@ -54,9 +56,10 @@ public class FrontpageController { public void initialize() { try { DatabaseConnection conn = new DatabaseConnection(); - DatabaseManager db = new DatabaseManager(conn); - CharityRegistry charities = db.getCharitiesFromDB(); - DonationRegistry donations = db.getDonationFromDB(); + CharitySelect cdb = new CharitySelect(conn); + DonationSelect ddb = new DonationSelect(conn); + CharityRegistry charities = cdb.getCharitiesFromDB(); + DonationRegistry donations = ddb.getDonationFromDB(); allCharities = new ArrayList<>(charities.getAllCharities()); displayCharities(allCharities); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/APIToDatabaseService.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/APIToDatabaseService.java new file mode 100644 index 0000000..0bbaa47 --- /dev/null +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/APIToDatabaseService.java @@ -0,0 +1,139 @@ +package ntnu.systemutvikling.team6.database; + +import ntnu.systemutvikling.team6.models.Charity; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; +import java.util.UUID; + +public class APIToDatabaseService { + private final DatabaseConnection connection; + /** + * Contractor for DatabaseManager. It uses a DatabaseConnection object that contains a connection + * credentials. + * + * @param connection + */ + public APIToDatabaseService(DatabaseConnection connection) { + this.connection = connection; + } + + /** + * This method is used to verify the integrity of the data in the {@code charities} table and to + * update it based on the data retrieved from the IK API. The param charities are retrieved from + * the IK API through the APICharityData class. Called in initialize method in + * HmHApplication.java, which is the main class of the application, to ensure that the data is up + * to date when the application starts. Uses a a temp table to ensure that the data in the + * database is consistent with the data from the API. + * + * @param charities + */ + public void addAPIDataToTable(List charities) { + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + conn.setAutoCommit(false); + String sql_query = + """ + INSERT INTO Charities (UUID_charities, org_number, charity_name, charity_description, charity_link, pre_approved, status) + VALUES (?, ?, ?, ?, ?, ?, ?) + ON DUPLICATE KEY UPDATE + charity_name = VALUES(charity_name), + charity_link = VALUES(charity_link), + pre_approved = VALUES(pre_approved), + status = VALUES(status) + """; + + try (PreparedStatement ps = conn.prepareStatement(sql_query)) { + for (Charity charity : charities) { + if (charity.getUUID() == null) { + ps.setString(1, UUID.randomUUID().toString()); + } else { + ps.setString(1, charity.getUUID().toString()); + } + + ps.setString(2, charity.getOrg_number().replaceAll("\\s", "")); + ps.setString(3, charity.getName()); + ps.setString(4, "Blank until webscraber works"); + ps.setString(5, charity.getDescription()); + ps.setBoolean(6, charity.getPreApproved()); // Description is the link + ps.setString(7, charity.getStatus()); + + ps.addBatch(); + } + ps.executeBatch(); + } + + // -- Intergerty Check: + String createTemp = + """ + CREATE TEMPORARY TABLE temp_api_charities ( + org_number VARCHAR(255) PRIMARY KEY + ) + """; + + try (PreparedStatement ps = conn.prepareStatement(createTemp)) { + ps.execute(); + } + + String insertTemp = "INSERT IGNORE INTO temp_api_charities (org_number) VALUES (?)"; + + try (PreparedStatement ps = conn.prepareStatement(insertTemp)) { + + for (Charity charity : charities) { + ps.setString(1, charity.getOrg_number().replaceAll("\\s", "")); + ps.addBatch(); + } + + ps.executeBatch(); + } + + String deleteSql = + """ + DELETE FROM Charities c + WHERE NOT EXISTS ( + SELECT 1 FROM temp_api_charities t + WHERE t.org_number = c.org_number + ) + AND NOT EXISTS ( + SELECT 1 FROM Donations d WHERE d.charity_id = c.UUID_charities + ) + AND NOT EXISTS ( + SELECT 1 FROM Feedback f WHERE f.charity_id = c.UUID_charities + ) + AND NOT EXISTS ( + SELECT 1 FROM CharityUsers cu WHERE cu.Charities_UUID_charities = c.UUID_charities + ); + """; + + try (PreparedStatement ps = conn.prepareStatement(deleteSql)) { + ps.executeUpdate(); + } + + conn.commit(); + + } catch (SQLException e) { + if (conn != null) { + try { + conn.rollback(); + } catch (SQLException ex) { + ex.printStackTrace(); + } + } + e.printStackTrace(); + + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } finally { + if (conn != null) { + try { + conn.setAutoCommit(true); + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } +} diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java deleted file mode 100644 index b414fde..0000000 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ /dev/null @@ -1,745 +0,0 @@ -package ntnu.systemutvikling.team6.database; - -import java.sql.*; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.List; -import java.util.UUID; - -import ntnu.systemutvikling.team6.models.*; -import ntnu.systemutvikling.team6.models.user.*; -import ntnu.systemutvikling.team6.scraper.APICharityData; - -/** - * Manages the Database with MySQL tables and JDBC. - * - *

This class is responsible for creating the tables needed for the application, if not done - * already and maintaining the {@code charities} table based on data retrieved from the IK API. It - * is also responsible for retrieving the data from the database and sending it to the application - * through the CharityRegistry and DonationRegistry. It is used by the FrontpageController to - * retrieve the data needed to display the charities - */ -public class DatabaseManager { - private final DatabaseConnection connection; - - /** - * Contractor for DatabaseManager. It uses a DatabaseConnection object that contains a connection - * credentials. - */ - public DatabaseManager(DatabaseConnection connection) { - this.connection = connection; - } - - /** - * Connection test for the Database. Does a simple SELECT SQL query and returns either true og and - * Exception if failed - * - * @return true if Sucsedd or SQLExepction if failed - */ - public boolean testConnection() { - try (Connection conn = connection.getMySqlConnection(); - Statement stmt = conn.createStatement()) { - - ResultSet rs = stmt.executeQuery("SELECT 1"); - - if (rs.next()) { - System.out.println("Database connection verified."); - return true; - } - - } catch (SQLException e) { - System.out.println("Database connection failed."); - e.printStackTrace(); - } - - return false; - } - - /** - * Creates the {@code Charities} and {@code Donations} tables if they do not already exist. - * - *

The table structure for Charities is based on fields from {@link APICharityData}. - * - * @throws RuntimeException if a {@link SQLException} occurs while creating the table - */ - public void createTables() { - String charitiesTable = - """ - -- ----------------------------------------------------- - -- Table `HelpMeHelp`.`Charities` - -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS `apbaluna`.`Charities` ( - `UUID_charities` CHAR(36) NOT NULL, - `org_number` VARCHAR(255) NOT NULL, - `charity_name` VARCHAR(255) NOT NULL, - `charity_description` VARCHAR(255) NOT NULL, - `charity_link` VARCHAR(255) NOT NULL, - `pre_approved` TINYINT NOT NULL, - `status` VARCHAR(255) NOT NULL, - PRIMARY KEY (`UUID_charities`), - UNIQUE INDEX `org_number_UNIQUE` (`org_number` ASC) VISIBLE) - ENGINE = InnoDB; - - """; - String donationsTable = - """ - -- ----------------------------------------------------- - -- Table `HelpMeHelp`.`Donations` - -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS `apbaluna`.`Donations` ( - `UUID_Donations` CHAR(36) NOT NULL, - `amount` DECIMAL NOT NULL, - `date` DATE NOT NULL, - `charity_id` CHAR(36) NOT NULL, - `user_id` CHAR(36) NOT NULL, - PRIMARY KEY (`UUID_Donations`), - INDEX `fk_Donations_Charities_idx` (`charity_id` ASC) VISIBLE, - INDEX `fk_Donations_User1_idx` (`user_id` ASC) VISIBLE, - CONSTRAINT `fk_Donations_Charities` - FOREIGN KEY (`charity_id`) - REFERENCES `apbaluna`.`Charities` (`UUID_charities`) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_Donations_User1` - FOREIGN KEY (`user_id`) - REFERENCES `apbaluna`.`User` (`UUID_User`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - """; - String userTable = - """ - -- ----------------------------------------------------- - -- Table `apbaluna`.`User` - -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS `apbaluna`.`User` ( - `UUID_User` CHAR(36) NOT NULL, - `user_displayname` VARCHAR(255) NOT NULL, - `user_name` VARCHAR(255) NOT NULL, - `user_email` VARCHAR(255) NOT NULL, - `user_password` VARCHAR(255) NOT NULL, - `role` VARCHAR(45) NOT NULL, - PRIMARY KEY (`UUID_User`)) - ENGINE = InnoDB; - """; - - String settingsTable = - """ - -- ----------------------------------------------------- - -- Table `apbaluna`.`Settings` - -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS `apbaluna`.`Settings` ( - `User_UUID_User` CHAR(36) NOT NULL, - `isAnonymous` TINYINT NOT NULL, - `language` VARCHAR(45) NOT NULL, - `lightmode` TINYINT NOT NULL, - PRIMARY KEY (`User_UUID_User`), - INDEX `fk_Settings_User1_idx` (`User_UUID_User` ASC) VISIBLE, - CONSTRAINT `fk_Settings_User1` - FOREIGN KEY (`User_UUID_User`) - REFERENCES `apbaluna`.`User` (`UUID_User`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - """; - - String messagesTable = - """ - -- ----------------------------------------------------- - -- Table `apbaluna`.`Messages` - -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS `apbaluna`.`Messages` ( - `UUID_message` CHAR(36) NOT NULL, - `message_title` VARCHAR(255) NOT NULL, - `message_content` VARCHAR(255) NOT NULL, - `message_date` DATE NOT NULL, - `sender_user_id` CHAR(36) NULL, - `sender_charity_id` CHAR(36) NULL, - `user_id` CHAR(36) NOT NULL, - PRIMARY KEY (`UUID_message`), - INDEX `fk_Messages_User1_idx` (`sender_user_id` ASC) VISIBLE, - INDEX `fk_Messages_Charities1_idx` (`sender_charity_id` ASC) VISIBLE, - INDEX `fk_Messages_User2_idx` (`user_id` ASC) VISIBLE, - CONSTRAINT `fk_Messages_User1` - FOREIGN KEY (`sender_user_id`) - REFERENCES `apbaluna`.`User` (`UUID_User`) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_Messages_Charities1` - FOREIGN KEY (`sender_charity_id`) - REFERENCES `apbaluna`.`Charities` (`UUID_charities`) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_Messages_User2` - FOREIGN KEY (`user_id`) - REFERENCES `apbaluna`.`User` (`UUID_User`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - """; - - String feedbackTable = - """ - -- ----------------------------------------------------- - -- Table `apbaluna`.`Feedback` - -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS `apbaluna`.`Feedback` ( - `UUID_feedback` CHAR(36) NOT NULL, - `feedback_comment` VARCHAR(255) NOT NULL, - `feedback_date` DATE NOT NULL, - `isAnonymous` TINYINT NOT NULL, - `charity_id` CHAR(36) NOT NULL, - `user_id` CHAR(36) NOT NULL, - PRIMARY KEY (`UUID_feedback`), - INDEX `fk_Feedback_Charities1_idx` (`charity_id` ASC) VISIBLE, - INDEX `fk_Feedback_User1_idx` (`user_id` ASC) VISIBLE, - CONSTRAINT `fk_Feedback_Charities1` - FOREIGN KEY (`charity_id`) - REFERENCES `apbaluna`.`Charities` (`UUID_charities`) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_Feedback_User1` - FOREIGN KEY (`user_id`) - REFERENCES `apbaluna`.`User` (`UUID_User`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - """; - String categoriesTable = - """ - -- ----------------------------------------------------- - -- Table `apbaluna`.`Categories` - -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS `apbaluna`.`Categories` ( - `category_id` INT NOT NULL AUTO_INCREMENT, - `category` VARCHAR(255) NOT NULL, - PRIMARY KEY (`category_id`)) - ENGINE = InnoDB; - """; - - String charityCategoriesTable = - """ - -- ----------------------------------------------------- - -- Table `apbaluna`.`Charity_Categories` - -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS `apbaluna`.`Charity_Categories` ( - `Categories_category_id` INT NOT NULL, - `Charities_UUID_charities` CHAR(36) NOT NULL, - PRIMARY KEY (`Categories_category_id`, `Charities_UUID_charities`), - INDEX `fk_Categories_has_Charities_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, - INDEX `fk_Categories_has_Charities_Categories1_idx` (`Categories_category_id` ASC) VISIBLE, - CONSTRAINT `fk_Categories_has_Charities_Categories1` - FOREIGN KEY (`Categories_category_id`) - REFERENCES `apbaluna`.`Categories` (`category_id`) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_Categories_has_Charities_Charities1` - FOREIGN KEY (`Charities_UUID_charities`) - REFERENCES `apbaluna`.`Charities` (`UUID_charities`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - """; - - String charityUserTable = - """ - -- ----------------------------------------------------- - -- Table `apbaluna`.`CharityUsers` - -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS `apbaluna`.`CharityUsers` ( - `Charities_UUID_charities` CHAR(36) NOT NULL, - `User_UUID_User` CHAR(36) NOT NULL, - PRIMARY KEY (`Charities_UUID_charities`, `User_UUID_User`), - INDEX `fk_Charities_has_User_User1_idx` (`User_UUID_User` ASC) VISIBLE, - INDEX `fk_Charities_has_User_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, - CONSTRAINT `fk_Charities_has_User_Charities1` - FOREIGN KEY (`Charities_UUID_charities`) - REFERENCES `apbaluna`.`Charities` (`UUID_charities`) - ON DELETE NO ACTION - ON UPDATE NO ACTION, - CONSTRAINT `fk_Charities_has_User_User1` - FOREIGN KEY (`User_UUID_User`) - REFERENCES `apbaluna`.`User` (`UUID_User`) - ON DELETE NO ACTION - ON UPDATE NO ACTION) - ENGINE = InnoDB; - """; - - try (Connection conn = connection.getMySqlConnection(); - Statement s = conn.createStatement()) { - - s.execute(charitiesTable); - s.execute(userTable); - s.execute(donationsTable); - s.execute(settingsTable); - s.execute(messagesTable); - s.execute(feedbackTable); - s.execute(categoriesTable); - s.execute(charityCategoriesTable); - s.execute(charityUserTable); - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("Error creating table."); - } - } - - /** - * This method is used to verify the integrity of the data in the {@code charities} table and to - * update it based on the data retrieved from the IK API. The param charities are retrieved from - * the IK API through the APICharityData class. Called in initialize method in - * HmHApplication.java, which is the main class of the application, to ensure that the data is up - * to date when the application starts. Uses a a temp table to ensure that the data in the - * database is consistent with the data from the API. - * - * @param charities - */ - public void addAPIDataToTable(List charities) { - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - conn.setAutoCommit(false); - String sql_query = - """ - INSERT INTO Charities (UUID_charities, org_number, charity_name, charity_description, charity_link, pre_approved, status) - VALUES (?, ?, ?, ?, ?, ?, ?) - ON DUPLICATE KEY UPDATE - charity_name = VALUES(charity_name), - charity_link = VALUES(charity_link), - pre_approved = VALUES(pre_approved), - status = VALUES(status) - """; - - try (PreparedStatement ps = conn.prepareStatement(sql_query)) { - for (Charity charity : charities) { - if (charity.getUUID() == null) { - ps.setString(1, UUID.randomUUID().toString()); - } else { - ps.setString(1, charity.getUUID().toString()); - } - - ps.setString(2, charity.getOrg_number().replaceAll("\\s", "")); - ps.setString(3, charity.getName()); - ps.setString(4, "Blank until webscraber works"); - ps.setString(5, charity.getDescription()); - ps.setBoolean(6, charity.getPreApproved()); // Description is the link - ps.setString(7, charity.getStatus()); - - ps.addBatch(); - } - ps.executeBatch(); - } - - // -- Intergerty Check: - String createTemp = - """ - CREATE TEMPORARY TABLE temp_api_charities ( - org_number VARCHAR(255) PRIMARY KEY - ) - """; - - try (PreparedStatement ps = conn.prepareStatement(createTemp)) { - ps.execute(); - } - - String insertTemp = "INSERT IGNORE INTO temp_api_charities (org_number) VALUES (?)"; - - try (PreparedStatement ps = conn.prepareStatement(insertTemp)) { - - for (Charity charity : charities) { - ps.setString(1, charity.getOrg_number().replaceAll("\\s", "")); - ps.addBatch(); - } - - ps.executeBatch(); - } - - String deleteSql = - """ - DELETE FROM Charities c - WHERE NOT EXISTS ( - SELECT 1 FROM temp_api_charities t - WHERE t.org_number = c.org_number - ) - AND NOT EXISTS ( - SELECT 1 FROM Donations d WHERE d.charity_id = c.UUID_charities - ) - AND NOT EXISTS ( - SELECT 1 FROM Feedback f WHERE f.charity_id = c.UUID_charities - ) - AND NOT EXISTS ( - SELECT 1 FROM CharityUsers cu WHERE cu.Charities_UUID_charities = c.UUID_charities - ); - """; - - try (PreparedStatement ps = conn.prepareStatement(deleteSql)) { - ps.executeUpdate(); - } - - conn.commit(); - - } catch (SQLException e) { - if (conn != null) { - try { - conn.rollback(); - } catch (SQLException ex) { - ex.printStackTrace(); - } - } - e.printStackTrace(); - - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } finally { - if (conn != null) { - try { - conn.setAutoCommit(true); - conn.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - } - - public CharityRegistry getCharitiesFromDB() { - CharityRegistry registry = null; - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT - c.UUID_charities, c.org_number, c.charity_name, c.charity_link, c.pre_approved, c.status, - f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, - u.UUID_user, u.user_name, u.user_email, u.user_password, u.role - FROM Charities c - LEFT JOIN Feedback f ON f.charity_id = c.UUID_charities - LEFT JOIN User u ON f.user_id = u.UUID_user - """; - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(sql_query); - - Charity currentCharity = null; - String lastCharity = null; - - registry = new CharityRegistry(); - while (rs.next()) { - String currentId = rs.getString("UUID_charities"); - - if (lastCharity == null || !currentId.equals(lastCharity)) { - currentCharity = - new Charity( - rs.getString("UUID_charities"), - rs.getString("org_number"), - rs.getString("charity_link"), - rs.getString("charity_name"), - rs.getBoolean("pre_approved"), - rs.getString("status") - ); - registry.addCharity(currentCharity); - lastCharity = currentId; - } - String feedbackId = rs.getString("UUID_feedback"); - if (feedbackId != null){ - User userWithNoSettingsAndInbox = new User( - rs.getString("UUID_User"), - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); - - Feedback feedback = new Feedback( - rs.getString("UUID_feedback"), - userWithNoSettingsAndInbox, - rs.getString("feedback_comment"), - LocalDate.parse(rs.getString("feedback_date")) - ); - - currentCharity.getFeedbacks().add(feedback); - } - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } - return registry; - } - public UserRegistry getUsersFromDB(){ - UserRegistry registry = new UserRegistry(); - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT - u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, - s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, - m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id - FROM User u - LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user - LEFT JOIN Messages m ON u.UUID_User = m.user_id - """; - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(sql_query); - - User currentUser = null; - String lastUserid = null; - - while (rs.next()) { - String userId = rs.getString("UUID_User"); - - if (lastUserid == null || !userId.equals(lastUserid)) { - currentUser = new User( - userId, - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); - if (rs.getString("isAnonymous") != null){ - Settings settings = new Settings( - rs.getBoolean("isAnonymous"), - Language.valueOf(rs.getString("language").toUpperCase()), - rs.getBoolean("lightmode") - ); - currentUser.setSettings(settings); - } - currentUser.setInbox(new Inbox()); - registry.addUser(currentUser); - lastUserid = userId; - } - String messageId = rs.getString("UUID_message"); - if (messageId != null) { - Message message = new Message( - rs.getString("message_title"), - UUID.fromString(rs.getString("sender_charity_id")), - rs.getString("message_content"), - LocalDate.parse(rs.getString("message_date")) - ); - - currentUser.getInbox().addMessage(message); - } - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } - return registry; - } - - public User getUserFromDBUuid(String user_id){ - User user = null; - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT - u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, - s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, - m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id - FROM User u - LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user - LEFT JOIN Messages m ON u.UUID_User = m.user_id - WHERE u.UUID_User = ?; - """; - PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, user_id); - ResultSet rs = stmt.executeQuery(); - - String lastUserid = null; - while (rs.next()) { - String userId = rs.getString("UUID_User"); - if (lastUserid == null || !userId.equals(lastUserid)) { - user = new User( - userId, - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); - if (rs.getString("isAnonymous") != null){ - Settings settings = new Settings( - rs.getBoolean("isAnonymous"), - Language.valueOf(rs.getString("language").toUpperCase()), - rs.getBoolean("lightmode") - ); - user.setSettings(settings); - } - user.setInbox(new Inbox()); - lastUserid = userId; - } - String messageId = rs.getString("UUID_message"); - if (messageId != null) { - Message message = new Message( - rs.getString("message_title"), - UUID.fromString(rs.getString("sender_charity_id")), - rs.getString("message_content"), - LocalDate.parse(rs.getString("message_date")) - ); - - user.getInbox().addMessage(message); - } - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } - return user; - } - - public Settings getSettingsForUser(String user_id){ - Settings settings = null; - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT User_UUID_User, isAnonymous, language, lightmode FROM Settings - WHERE User_UUID_User = ?; - """; - PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, user_id); - stmt.setMaxRows(1); - ResultSet rs = stmt.executeQuery(); - - while (rs.next()) { - settings = new Settings( - rs.getBoolean("isAnonymous"), - Language.valueOf(rs.getString("language").toUpperCase()), - rs.getBoolean("lightmode") - ); - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } - - return settings; - } - - public Inbox getInboxForUser(String user_id){ - Inbox inbox = new Inbox(); - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT UUID_message, message_title, message_content, message_date, sender_user_id, sender_charity_id, user_id FROM Messages - WHERE user_id = ?; - """; - PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, user_id); - ResultSet rs = stmt.executeQuery(); - - while (rs.next()) { - Message message = new Message( - rs.getString("message_title"), - UUID.fromString(rs.getString("sender_charity_id")), - rs.getString("message_date"), - LocalDate.parse(rs.getString("message_date")) - ); - inbox.addMessage(message); - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } - - return inbox; - } - - - public DonationRegistry getDonationFromDB() { - DonationRegistry registry = null; - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT - d.UUID_Donations, - d.amount, - d.date, - c.UUID_charities, - c.org_number, - c.charity_name, - c.charity_link, - c.pre_approved, - c.status - FROM Donations d - JOIN Charities c - ON d.Charities_UUID_charities = c.UUID_charities - """; - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(sql_query); - - registry = new DonationRegistry(); - while (rs.next()) { - Charity charity = - new Charity( - rs.getString("UUID_charities"), - rs.getString("org_number"), - rs.getString("charity_name"), - rs.getString("charity_link"), - rs.getBoolean("pre_approved"), - rs.getString("status")); - - Donation donation = - new Donation( - rs.getString("UUID_Donations"), - rs.getDouble("amount"), - rs.getDate("date").toLocalDate(), - charity); - registry.addDonation(donation); - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } - return registry; - } - - public ArrayList getFeedbackforCharityUUID(String charity_uuid) { - ArrayList Feedbacks = new ArrayList<>(); - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT - f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, - u.UUID_user, u.user_name, u.user_email, u.user_password, u.role - FROM Feedback f - LEFT JOIN User u ON f.user_id = u.UUID_user - WHERE f.charity_id = ?; - """; - PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, charity_uuid); - ResultSet rs = stmt.executeQuery(); - - while (rs.next()){ - User userWithNoSettingsAndInbox = new User( - rs.getString("UUID_User"), - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); - Feedback feedback = new Feedback( - rs.getString("UUID_feedback"), - userWithNoSettingsAndInbox, - rs.getString("feedback_comment"), - LocalDate.parse(rs.getString("feedback_date")) - ); - Feedbacks.add(feedback); - } - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } finally { - conn = null; - } - return Feedbacks; - } -} \ No newline at end of file diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java new file mode 100644 index 0000000..421c8bc --- /dev/null +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java @@ -0,0 +1,284 @@ +package ntnu.systemutvikling.team6.database; + +import java.sql.*; +import java.time.LocalDate; +import java.util.ArrayList; +import java.util.UUID; + +import ntnu.systemutvikling.team6.models.*; +import ntnu.systemutvikling.team6.models.user.*; +import ntnu.systemutvikling.team6.scraper.APICharityData; + +/** + * Manages the Database with MySQL tables and JDBC. + * + *

This class is responsible for creating the tables needed for the application, if not done + * already and maintaining the {@code charities} table based on data retrieved from the IK API. It + * is also responsible for retrieving the data from the database and sending it to the application + * through the CharityRegistry and DonationRegistry. It is used by the FrontpageController to + * retrieve the data needed to display the charities + */ +public class DatabaseSetup { + private final DatabaseConnection connection; + + /** + * Contractor for DatabaseManager. It uses a DatabaseConnection object that contains a connection + * credentials. + */ + public DatabaseSetup(DatabaseConnection connection) { + this.connection = connection; + } + + /** + * Connection test for the Database. Does a simple SELECT SQL query and returns either true og and + * Exception if failed + * + * @return true if Sucsedd or SQLExepction if failed + */ + public boolean testConnection() { + try (Connection conn = connection.getMySqlConnection(); + Statement stmt = conn.createStatement()) { + + ResultSet rs = stmt.executeQuery("SELECT 1"); + + if (rs.next()) { + System.out.println("Database connection verified."); + return true; + } + + } catch (SQLException e) { + System.out.println("Database connection failed."); + e.printStackTrace(); + } + + return false; + } + + /** + * Creates the {@code Charities} and {@code Donations} tables if they do not already exist. + * + *

The table structure for Charities is based on fields from {@link APICharityData}. + * + * @throws RuntimeException if a {@link SQLException} occurs while creating the table + */ + public void createTables() { + String charitiesTable = + """ + -- ----------------------------------------------------- + -- Table `HelpMeHelp`.`Charities` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Charities` ( + `UUID_charities` CHAR(36) NOT NULL, + `org_number` VARCHAR(255) NOT NULL, + `charity_name` VARCHAR(255) NOT NULL, + `charity_description` VARCHAR(255) NOT NULL, + `charity_link` VARCHAR(255) NOT NULL, + `pre_approved` TINYINT NOT NULL, + `status` VARCHAR(255) NOT NULL, + PRIMARY KEY (`UUID_charities`), + UNIQUE INDEX `org_number_UNIQUE` (`org_number` ASC) VISIBLE) + ENGINE = InnoDB; + + """; + String donationsTable = + """ + -- ----------------------------------------------------- + -- Table `HelpMeHelp`.`Donations` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Donations` ( + `UUID_Donations` CHAR(36) NOT NULL, + `amount` DECIMAL NOT NULL, + `date` DATE NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_Donations`), + INDEX `fk_Donations_Charities_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Donations_User1_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Donations_Charities` + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Donations_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + String userTable = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`User` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`User` ( + `UUID_User` CHAR(36) NOT NULL, + `user_displayname` VARCHAR(255) NOT NULL, + `user_name` VARCHAR(255) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + `user_password` VARCHAR(255) NOT NULL, + `role` VARCHAR(45) NOT NULL, + PRIMARY KEY (`UUID_User`)) + ENGINE = InnoDB; + """; + + String settingsTable = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Settings` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Settings` ( + `User_UUID_User` CHAR(36) NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `language` VARCHAR(45) NOT NULL, + `lightmode` TINYINT NOT NULL, + PRIMARY KEY (`User_UUID_User`), + INDEX `fk_Settings_User1_idx` (`User_UUID_User` ASC) VISIBLE, + CONSTRAINT `fk_Settings_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + + String messagesTable = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Messages` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Messages` ( + `UUID_message` CHAR(36) NOT NULL, + `message_title` VARCHAR(255) NOT NULL, + `message_content` VARCHAR(255) NOT NULL, + `message_date` DATE NOT NULL, + `sender_user_id` CHAR(36) NULL, + `sender_charity_id` CHAR(36) NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_message`), + INDEX `fk_Messages_User1_idx` (`sender_user_id` ASC) VISIBLE, + INDEX `fk_Messages_Charities1_idx` (`sender_charity_id` ASC) VISIBLE, + INDEX `fk_Messages_User2_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Messages_User1` + FOREIGN KEY (`sender_user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_Charities1` + FOREIGN KEY (`sender_charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_User2` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + + String feedbackTable = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Feedback` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Feedback` ( + `UUID_feedback` CHAR(36) NOT NULL, + `feedback_comment` VARCHAR(255) NOT NULL, + `feedback_date` DATE NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_feedback`), + INDEX `fk_Feedback_Charities1_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Feedback_User1_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Feedback_Charities1` + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Feedback_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + String categoriesTable = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Categories` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Categories` ( + `category_id` INT NOT NULL AUTO_INCREMENT, + `category` VARCHAR(255) NOT NULL, + PRIMARY KEY (`category_id`)) + ENGINE = InnoDB; + """; + + String charityCategoriesTable = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Charity_Categories` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Charity_Categories` ( + `Categories_category_id` INT NOT NULL, + `Charities_UUID_charities` CHAR(36) NOT NULL, + PRIMARY KEY (`Categories_category_id`, `Charities_UUID_charities`), + INDEX `fk_Categories_has_Charities_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + INDEX `fk_Categories_has_Charities_Categories1_idx` (`Categories_category_id` ASC) VISIBLE, + CONSTRAINT `fk_Categories_has_Charities_Categories1` + FOREIGN KEY (`Categories_category_id`) + REFERENCES `apbaluna`.`Categories` (`category_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Categories_has_Charities_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + + String charityUserTable = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`CharityUsers` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`CharityUsers` ( + `Charities_UUID_charities` CHAR(36) NOT NULL, + `User_UUID_User` CHAR(36) NOT NULL, + PRIMARY KEY (`Charities_UUID_charities`, `User_UUID_User`), + INDEX `fk_Charities_has_User_User1_idx` (`User_UUID_User` ASC) VISIBLE, + INDEX `fk_Charities_has_User_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + CONSTRAINT `fk_Charities_has_User_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Charities_has_User_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + + try (Connection conn = connection.getMySqlConnection(); + Statement s = conn.createStatement()) { + + s.execute(charitiesTable); + s.execute(userTable); + s.execute(donationsTable); + s.execute(settingsTable); + s.execute(messagesTable); + s.execute(feedbackTable); + s.execute(categoriesTable); + s.execute(charityCategoriesTable); + s.execute(charityUserTable); + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("Error creating table."); + } + } +} \ No newline at end of file diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java new file mode 100644 index 0000000..bdc0432 --- /dev/null +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java @@ -0,0 +1,126 @@ +package ntnu.systemutvikling.team6.database.Readers; + +import ntnu.systemutvikling.team6.database.DatabaseConnection; +import ntnu.systemutvikling.team6.models.Charity; +import ntnu.systemutvikling.team6.models.CharityRegistry; +import ntnu.systemutvikling.team6.models.Feedback; +import ntnu.systemutvikling.team6.models.user.User; + +import java.sql.*; +import java.time.LocalDate; +import java.util.ArrayList; + +public class CharitySelect { + private final DatabaseConnection connection; + + public CharitySelect(DatabaseConnection connection){ + this.connection = connection; + } + + public CharityRegistry getCharitiesFromDB() { + CharityRegistry registry = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT + c.UUID_charities, c.org_number, c.charity_name, c.charity_link, c.pre_approved, c.status, + f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, + u.UUID_user, u.user_name, u.user_email, u.user_password, u.role + FROM Charities c + LEFT JOIN Feedback f ON f.charity_id = c.UUID_charities + LEFT JOIN User u ON f.user_id = u.UUID_user + """; + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql_query); + + Charity currentCharity = null; + String lastCharity = null; + + registry = new CharityRegistry(); + while (rs.next()) { + String currentId = rs.getString("UUID_charities"); + + if (lastCharity == null || !currentId.equals(lastCharity)) { + currentCharity = + new Charity( + rs.getString("UUID_charities"), + rs.getString("org_number"), + rs.getString("charity_link"), + rs.getString("charity_name"), + rs.getBoolean("pre_approved"), + rs.getString("status") + ); + registry.addCharity(currentCharity); + lastCharity = currentId; + } + String feedbackId = rs.getString("UUID_feedback"); + if (feedbackId != null){ + User userWithNoSettingsAndInbox = new User( + rs.getString("UUID_User"), + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); + + Feedback feedback = new Feedback( + rs.getString("UUID_feedback"), + userWithNoSettingsAndInbox, + rs.getString("feedback_comment"), + LocalDate.parse(rs.getString("feedback_date")) + ); + + currentCharity.getFeedbacks().add(feedback); + } + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + return registry; + } + public ArrayList getFeedbackforCharityUUID(String charity_uuid) { + ArrayList Feedbacks = new ArrayList<>(); + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT + f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, + u.UUID_user, u.user_name, u.user_email, u.user_password, u.role + FROM Feedback f + LEFT JOIN User u ON f.user_id = u.UUID_user + WHERE f.charity_id = ?; + """; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, charity_uuid); + ResultSet rs = stmt.executeQuery(); + + while (rs.next()){ + User userWithNoSettingsAndInbox = new User( + rs.getString("UUID_User"), + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); + Feedback feedback = new Feedback( + rs.getString("UUID_feedback"), + userWithNoSettingsAndInbox, + rs.getString("feedback_comment"), + LocalDate.parse(rs.getString("feedback_date")) + ); + Feedbacks.add(feedback); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } finally { + conn = null; + } + return Feedbacks; + } +} diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java new file mode 100644 index 0000000..97bc639 --- /dev/null +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java @@ -0,0 +1,68 @@ +package ntnu.systemutvikling.team6.database.Readers; + +import ntnu.systemutvikling.team6.database.DatabaseConnection; +import ntnu.systemutvikling.team6.models.Charity; +import ntnu.systemutvikling.team6.models.Donation; +import ntnu.systemutvikling.team6.models.DonationRegistry; + +import java.sql.Connection; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Statement; + +public class DonationSelect { + private final DatabaseConnection connection; + + public DonationSelect (DatabaseConnection connection){ + this.connection = connection; + } + public DonationRegistry getDonationFromDB() { + DonationRegistry registry = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT + d.UUID_Donations, + d.amount, + d.date, + c.UUID_charities, + c.org_number, + c.charity_name, + c.charity_link, + c.pre_approved, + c.status + FROM Donations d + JOIN Charities c + ON d.Charities_UUID_charities = c.UUID_charities + """; + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql_query); + + registry = new DonationRegistry(); + while (rs.next()) { + Charity charity = + new Charity( + rs.getString("UUID_charities"), + rs.getString("org_number"), + rs.getString("charity_name"), + rs.getString("charity_link"), + rs.getBoolean("pre_approved"), + rs.getString("status")); + + Donation donation = + new Donation( + rs.getString("UUID_Donations"), + rs.getDouble("amount"), + rs.getDate("date").toLocalDate(), + charity); + registry.addDonation(donation); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + return registry; + } +} diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java new file mode 100644 index 0000000..e232d08 --- /dev/null +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java @@ -0,0 +1,201 @@ +package ntnu.systemutvikling.team6.database.Readers; + +import ntnu.systemutvikling.team6.database.DatabaseConnection; +import ntnu.systemutvikling.team6.models.UserRegistry; +import ntnu.systemutvikling.team6.models.user.*; + +import java.sql.*; +import java.time.LocalDate; +import java.util.UUID; + +public class UserSelect { + private final DatabaseConnection connection; + + public UserSelect(DatabaseConnection connection){ + this.connection = connection; + } + + public User getUserFromDBUuid(String user_id){ + User user = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT + u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, + s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, + m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id + FROM User u + LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user + LEFT JOIN Messages m ON u.UUID_User = m.user_id + WHERE u.UUID_User = ?; + """; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, user_id); + ResultSet rs = stmt.executeQuery(); + + String lastUserid = null; + while (rs.next()) { + String userId = rs.getString("UUID_User"); + if (lastUserid == null || !userId.equals(lastUserid)) { + user = new User( + userId, + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); + if (rs.getString("isAnonymous") != null){ + Settings settings = new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode") + ); + user.setSettings(settings); + } + user.setInbox(new Inbox()); + lastUserid = userId; + } + String messageId = rs.getString("UUID_message"); + if (messageId != null) { + Message message = new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_content"), + LocalDate.parse(rs.getString("message_date")) + ); + + user.getInbox().addMessage(message); + } + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + return user; + } + + public UserRegistry getUsersFromDB(){ + UserRegistry registry = new UserRegistry(); + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT + u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, + s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, + m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id + FROM User u + LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user + LEFT JOIN Messages m ON u.UUID_User = m.user_id + """; + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql_query); + + User currentUser = null; + String lastUserid = null; + + while (rs.next()) { + String userId = rs.getString("UUID_User"); + + if (lastUserid == null || !userId.equals(lastUserid)) { + currentUser = new User( + userId, + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role") + ); + if (rs.getString("isAnonymous") != null){ + Settings settings = new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode") + ); + currentUser.setSettings(settings); + } + currentUser.setInbox(new Inbox()); + registry.addUser(currentUser); + lastUserid = userId; + } + String messageId = rs.getString("UUID_message"); + if (messageId != null) { + Message message = new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_content"), + LocalDate.parse(rs.getString("message_date")) + ); + + currentUser.getInbox().addMessage(message); + } + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + return registry; + } + + public Settings getSettingsForUser(String user_id){ + Settings settings = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT User_UUID_User, isAnonymous, language, lightmode FROM Settings + WHERE User_UUID_User = ?; + """; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, user_id); + stmt.setMaxRows(1); + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + settings = new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode") + ); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + + return settings; + } + + public Inbox getInboxForUser(String user_id){ + Inbox inbox = new Inbox(); + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT UUID_message, message_title, message_content, message_date, sender_user_id, sender_charity_id, user_id FROM Messages + WHERE user_id = ?; + """; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, user_id); + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + Message message = new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_date"), + LocalDate.parse(rs.getString("message_date")) + ); + inbox.addMessage(message); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } + return inbox; + } +} diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java index 6d071cf..75ce7bd 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java @@ -47,7 +47,7 @@ public Feedback(User user, String comment) { public Feedback(String feedback_id, User user, String feedback_comment, LocalDate feedback_date) { this.feedbackId = UUID.fromString(feedback_id); this.user = user; - this.comment = comment; + this.comment = feedback_comment; this.date = feedback_date; this.isAnonymous = user.getSettings().isAnonymous(); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/scraper/APICharityData.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/scraper/APICharityData.java index 10a489d..0cf6da8 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/scraper/APICharityData.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/scraper/APICharityData.java @@ -1,6 +1,6 @@ package ntnu.systemutvikling.team6.scraper; -import ntnu.systemutvikling.team6.database.DatabaseManager; +import ntnu.systemutvikling.team6.database.DatabaseSetup; /** * Represents data parsed from the IK API JSON response. Instances are immutable; to update any @@ -9,7 +9,7 @@ *

Receives data directly from {@link APICharityScraper}. * *

{@code org_number} should be a unique number, as it is used as a primary key in {@link - * DatabaseManager}. + * DatabaseSetup}. */ public class APICharityData { private final String org_number; diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java index b0f1acc..988f97e 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java @@ -6,7 +6,7 @@ import java.sql.PreparedStatement; import java.sql.ResultSet; import ntnu.systemutvikling.team6.database.DatabaseConnection; -import ntnu.systemutvikling.team6.database.DatabaseManager; +import ntnu.systemutvikling.team6.database.DatabaseSetup; import ntnu.systemutvikling.team6.models.Charity; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -18,7 +18,7 @@ class DonationDAOTest { @BeforeEach void setUp() { DatabaseConnection conn = new DatabaseConnection(); - DatabaseManager manager = new DatabaseManager(conn); + DatabaseSetup manager = new DatabaseSetup(conn); manager.createTables(); charity = new Charity("123456", "https://test.org", "Test Charity", true, "approved"); diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java index 25c214e..689048a 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java @@ -5,18 +5,19 @@ import java.sql.*; import java.util.ArrayList; import java.util.List; + import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; import org.junit.jupiter.api.*; class DatabaseManagerTest { - private DatabaseManager dbManager; + private DatabaseSetup dbManager; @BeforeEach public void setUp() throws SQLException { DatabaseConnection conn = new DatabaseConnection(); - this.dbManager = new DatabaseManager(conn); + this.dbManager = new DatabaseSetup(conn); } // Make sure you're connected to the NTNU network for this to work From 0b6f9d2357f67a8971dd4bf319b450720c44918e Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 20:32:30 +0200 Subject: [PATCH 26/33] Fix: Moved ApiToDatabaseService thing to service folder as it fits, but doesnt work --- .../team6/database/APIToDatabaseService.java | 139 ----------------- .../team6/service/APIToDatabaseService.java | 140 ++++++++++++++++++ 2 files changed, 140 insertions(+), 139 deletions(-) delete mode 100644 helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/APIToDatabaseService.java create mode 100644 helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/APIToDatabaseService.java diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/APIToDatabaseService.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/APIToDatabaseService.java deleted file mode 100644 index 0bbaa47..0000000 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/APIToDatabaseService.java +++ /dev/null @@ -1,139 +0,0 @@ -package ntnu.systemutvikling.team6.database; - -import ntnu.systemutvikling.team6.models.Charity; - -import java.sql.Connection; -import java.sql.PreparedStatement; -import java.sql.SQLException; -import java.util.List; -import java.util.UUID; - -public class APIToDatabaseService { - private final DatabaseConnection connection; - /** - * Contractor for DatabaseManager. It uses a DatabaseConnection object that contains a connection - * credentials. - * - * @param connection - */ - public APIToDatabaseService(DatabaseConnection connection) { - this.connection = connection; - } - - /** - * This method is used to verify the integrity of the data in the {@code charities} table and to - * update it based on the data retrieved from the IK API. The param charities are retrieved from - * the IK API through the APICharityData class. Called in initialize method in - * HmHApplication.java, which is the main class of the application, to ensure that the data is up - * to date when the application starts. Uses a a temp table to ensure that the data in the - * database is consistent with the data from the API. - * - * @param charities - */ - public void addAPIDataToTable(List charities) { - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - conn.setAutoCommit(false); - String sql_query = - """ - INSERT INTO Charities (UUID_charities, org_number, charity_name, charity_description, charity_link, pre_approved, status) - VALUES (?, ?, ?, ?, ?, ?, ?) - ON DUPLICATE KEY UPDATE - charity_name = VALUES(charity_name), - charity_link = VALUES(charity_link), - pre_approved = VALUES(pre_approved), - status = VALUES(status) - """; - - try (PreparedStatement ps = conn.prepareStatement(sql_query)) { - for (Charity charity : charities) { - if (charity.getUUID() == null) { - ps.setString(1, UUID.randomUUID().toString()); - } else { - ps.setString(1, charity.getUUID().toString()); - } - - ps.setString(2, charity.getOrg_number().replaceAll("\\s", "")); - ps.setString(3, charity.getName()); - ps.setString(4, "Blank until webscraber works"); - ps.setString(5, charity.getDescription()); - ps.setBoolean(6, charity.getPreApproved()); // Description is the link - ps.setString(7, charity.getStatus()); - - ps.addBatch(); - } - ps.executeBatch(); - } - - // -- Intergerty Check: - String createTemp = - """ - CREATE TEMPORARY TABLE temp_api_charities ( - org_number VARCHAR(255) PRIMARY KEY - ) - """; - - try (PreparedStatement ps = conn.prepareStatement(createTemp)) { - ps.execute(); - } - - String insertTemp = "INSERT IGNORE INTO temp_api_charities (org_number) VALUES (?)"; - - try (PreparedStatement ps = conn.prepareStatement(insertTemp)) { - - for (Charity charity : charities) { - ps.setString(1, charity.getOrg_number().replaceAll("\\s", "")); - ps.addBatch(); - } - - ps.executeBatch(); - } - - String deleteSql = - """ - DELETE FROM Charities c - WHERE NOT EXISTS ( - SELECT 1 FROM temp_api_charities t - WHERE t.org_number = c.org_number - ) - AND NOT EXISTS ( - SELECT 1 FROM Donations d WHERE d.charity_id = c.UUID_charities - ) - AND NOT EXISTS ( - SELECT 1 FROM Feedback f WHERE f.charity_id = c.UUID_charities - ) - AND NOT EXISTS ( - SELECT 1 FROM CharityUsers cu WHERE cu.Charities_UUID_charities = c.UUID_charities - ); - """; - - try (PreparedStatement ps = conn.prepareStatement(deleteSql)) { - ps.executeUpdate(); - } - - conn.commit(); - - } catch (SQLException e) { - if (conn != null) { - try { - conn.rollback(); - } catch (SQLException ex) { - ex.printStackTrace(); - } - } - e.printStackTrace(); - - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } finally { - if (conn != null) { - try { - conn.setAutoCommit(true); - conn.close(); - } catch (SQLException e) { - e.printStackTrace(); - } - } - } - } -} diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/APIToDatabaseService.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/APIToDatabaseService.java new file mode 100644 index 0000000..ac7b918 --- /dev/null +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/APIToDatabaseService.java @@ -0,0 +1,140 @@ +package ntnu.systemutvikling.team6.service; + +import java.sql.Connection; +import java.sql.PreparedStatement; +import java.sql.SQLException; +import java.util.List; +import java.util.UUID; +import ntnu.systemutvikling.team6.database.DatabaseConnection; +import ntnu.systemutvikling.team6.models.Charity; + +public class APIToDatabaseService { + private final DatabaseConnection connection; + + /** + * Contractor for DatabaseManager. It uses a DatabaseConnection object that contains a connection + * credentials. + * + * @param connection + */ + public APIToDatabaseService(DatabaseConnection connection) { + this.connection = connection; + } + + /** + * This method is used to verify the integrity of the data in the {@code charities} table and to + * update it based on the data retrieved from the IK API. The param charities are retrieved from + * the IK API through the APICharityData class. Called in initialize method in + * HmHApplication.java, which is the main class of the application, to ensure that the data is up + * to date when the application starts. Uses a a temp table to ensure that the data in the + * database is consistent with the data from the API. + * + * @param charities + */ + public void addAPIDataToTable(List charities) { + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + conn.setAutoCommit(false); + String sql_query = + """ + INSERT INTO Charities (UUID_charities, org_number, charity_name, charity_description, charity_link, pre_approved, status) + VALUES (?, ?, ?, ?, ?, ?, ?) + ON DUPLICATE KEY UPDATE + charity_name = VALUES(charity_name), + charity_link = VALUES(charity_link), + pre_approved = VALUES(pre_approved), + status = VALUES(status) + """; + + try (PreparedStatement ps = conn.prepareStatement(sql_query)) { + for (Charity charity : charities) { + if (charity.getUUID() == null) { + ps.setString(1, UUID.randomUUID().toString()); + } else { + ps.setString(1, charity.getUUID().toString()); + } + + ps.setString(2, charity.getOrg_number().replaceAll("\\s", "")); + ps.setString(3, charity.getName()); + ps.setString(4, "Blank until webscraber works"); + ps.setString(5, charity.getDescription()); + ps.setBoolean(6, charity.getPreApproved()); // Description is the link + ps.setString(7, charity.getStatus()); + + ps.addBatch(); + } + ps.executeBatch(); + } + + // -- Intergerty Check: + String createTemp = + """ + CREATE TEMPORARY TABLE temp_api_charities ( + org_number VARCHAR(255) PRIMARY KEY + ) + """; + + try (PreparedStatement ps = conn.prepareStatement(createTemp)) { + ps.execute(); + } + + String insertTemp = "INSERT IGNORE INTO temp_api_charities (org_number) VALUES (?)"; + + try (PreparedStatement ps = conn.prepareStatement(insertTemp)) { + + for (Charity charity : charities) { + ps.setString(1, charity.getOrg_number().replaceAll("\\s", "")); + ps.addBatch(); + } + + ps.executeBatch(); + } + + String deleteSql = + """ + DELETE FROM Charities c + WHERE NOT EXISTS ( + SELECT 1 FROM temp_api_charities t + WHERE t.org_number = c.org_number + ) + AND NOT EXISTS ( + SELECT 1 FROM Donations d WHERE d.charity_id = c.UUID_charities + ) + AND NOT EXISTS ( + SELECT 1 FROM Feedback f WHERE f.charity_id = c.UUID_charities + ) + AND NOT EXISTS ( + SELECT 1 FROM CharityUsers cu WHERE cu.Charities_UUID_charities = c.UUID_charities + ); + """; + + try (PreparedStatement ps = conn.prepareStatement(deleteSql)) { + ps.executeUpdate(); + } + + conn.commit(); + + } catch (SQLException e) { + if (conn != null) { + try { + conn.rollback(); + } catch (SQLException ex) { + ex.printStackTrace(); + } + } + e.printStackTrace(); + + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } finally { + if (conn != null) { + try { + conn.setAutoCommit(true); + conn.close(); + } catch (SQLException e) { + e.printStackTrace(); + } + } + } + } +} From 2bc2a185d4551d34e8e5ccd1693a137fe5d761cf Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 20:35:35 +0200 Subject: [PATCH 27/33] Fix: Updated previous tests --- helpmehelpapplication/pom.xml | 7 ++++++ .../team6/DAO/DonationDAOTest.java | 4 +++- .../team6/database/DatabaseManagerTest.java | 22 +++++++++++++------ .../team6/models/FeedbackTest.java | 5 ++++- .../team6/models/user/InboxTest.java | 4 ++-- .../team6/models/user/MessegeTest.java | 19 ++++++++-------- 6 files changed, 40 insertions(+), 21 deletions(-) diff --git a/helpmehelpapplication/pom.xml b/helpmehelpapplication/pom.xml index 2fdce09..7b2f137 100644 --- a/helpmehelpapplication/pom.xml +++ b/helpmehelpapplication/pom.xml @@ -62,6 +62,13 @@ 2.4.240 test + + + org.mockito + mockito-junit-jupiter + 5.23.0 + test + diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java index 988f97e..00970bb 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java @@ -8,6 +8,7 @@ import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.database.DatabaseSetup; import ntnu.systemutvikling.team6.models.Charity; +import ntnu.systemutvikling.team6.service.APIToDatabaseService; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -23,7 +24,8 @@ void setUp() { charity = new Charity("123456", "https://test.org", "Test Charity", true, "approved"); - manager.addAPIDataToTable(java.util.List.of(charity)); + APIToDatabaseService service = new APIToDatabaseService(conn); + service.addAPIDataToTable(java.util.List.of(charity)); } @Test diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java index 689048a..2ef32eb 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java @@ -5,19 +5,27 @@ import java.sql.*; import java.util.ArrayList; import java.util.List; - +import ntnu.systemutvikling.team6.database.Readers.CharitySelect; +import ntnu.systemutvikling.team6.database.Readers.DonationSelect; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; +import ntnu.systemutvikling.team6.service.APIToDatabaseService; import org.junit.jupiter.api.*; class DatabaseManagerTest { private DatabaseSetup dbManager; + private APIToDatabaseService service; + private CharitySelect charitySelect; + private DonationSelect donationSelect; @BeforeEach public void setUp() throws SQLException { DatabaseConnection conn = new DatabaseConnection(); this.dbManager = new DatabaseSetup(conn); + this.service = new APIToDatabaseService(conn); + this.charitySelect = new CharitySelect(conn); + this.donationSelect = new DonationSelect(conn); } // Make sure you're connected to the NTNU network for this to work @@ -48,14 +56,14 @@ void updateCharitiesShouldInsertCorrectData() throws SQLException { boolean is_pre_approved = false; Charity charity = new Charity(org_number, url, name, is_pre_approved, status); - dbManager.addAPIDataToTable(List.of(charity)); + service.addAPIDataToTable(List.of(charity)); Charity charity2 = new Charity(org_number, url, name + " Updated", is_pre_approved, status); - dbManager.addAPIDataToTable(List.of(charity2)); + service.addAPIDataToTable(List.of(charity2)); dbManager.createTables(); - CharityRegistry registry = dbManager.getCharitiesFromDB(); + CharityRegistry registry = charitySelect.getCharitiesFromDB(); Charity insertedCharity = registry.findCharityByOrgnumber("12345").get(); assertEquals("Test Charity Updated", insertedCharity.getName()); } @@ -91,13 +99,13 @@ void updateCharitiesShouldRemoveDataNotInList() throws SQLException { charityListBefore.add(charity2); charityListBefore.add(charity3); - dbManager.addAPIDataToTable(charityListBefore); + service.addAPIDataToTable(charityListBefore); List charityListNew = new ArrayList<>(); charityListNew.add(charity1); charityListNew.add(charity3); - dbManager.addAPIDataToTable(charityListNew); + service.addAPIDataToTable(charityListNew); try (Connection conn = new DatabaseConnection().getMySqlConnection()) { PreparedStatement stmt = @@ -117,7 +125,7 @@ void updateCharitiesShouldRemoveDataNotInList() throws SQLException { void tempTableShouldNotExistAfterUpdating() throws SQLException { Charity charity = new Charity("99999", "https://temp.no", "Temp Charity", false, "approved"); - dbManager.addAPIDataToTable(List.of(charity)); + service.addAPIDataToTable(List.of(charity)); try (Connection conn = new DatabaseConnection().getMySqlConnection()) { PreparedStatement stmt = conn.prepareStatement("SELECT * FROM temp_api_charities"); diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/FeedbackTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/FeedbackTest.java index 222e29b..29fd72e 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/FeedbackTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/FeedbackTest.java @@ -3,6 +3,7 @@ import static org.junit.jupiter.api.Assertions.*; import java.time.LocalDateTime; +import java.time.chrono.ChronoLocalDate; import ntnu.systemutvikling.team6.models.user.Inbox; import ntnu.systemutvikling.team6.models.user.Role; import ntnu.systemutvikling.team6.models.user.Settings; @@ -36,7 +37,9 @@ void testFeedbackInitialization() { assertEquals(user, feedback.getUser()); // Date should be between before and after - assertTrue(!feedback.getDate().isBefore(before) && !feedback.getDate().isAfter(after)); + assertTrue( + !feedback.getDate().isBefore(ChronoLocalDate.from(before)) + && !feedback.getDate().isAfter(ChronoLocalDate.from(after))); } @Test diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/user/InboxTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/user/InboxTest.java index 2dc7fa2..f3dc6ad 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/user/InboxTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/user/InboxTest.java @@ -16,8 +16,8 @@ public class InboxTest { @BeforeEach public void setup() { inbox = new Inbox(); - newMessage = new Message("Title", "Someone", "Somewhere"); - newMessage2 = new Message("Title2", "Someone2", "Somewhere2"); + newMessage = new Message("Title", UUID.randomUUID(), "Somewhere"); + newMessage2 = new Message("Title2", UUID.randomUUID(), "Somewhere2"); } @Test diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/user/MessegeTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/user/MessegeTest.java index faae3ad..1faa986 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/user/MessegeTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/models/user/MessegeTest.java @@ -11,10 +11,10 @@ public class MessegeTest { void shouldThrowExceptionIfNameIsNullOrEmpty() { assertThrows( IllegalArgumentException.class, - () -> new Message(null, "Someone", "Something Somewhere Somehow")); + () -> new Message(null, UUID.randomUUID(), "Something Somewhere Somehow")); assertThrows( IllegalArgumentException.class, - () -> new Message("", "Someone", "Something Somewhere Somehow")); + () -> new Message("", UUID.randomUUID(), "Something Somewhere Somehow")); } @Test @@ -22,24 +22,23 @@ void shouldThrowExceptionIfFromIsNullOrEmpty() { assertThrows( IllegalArgumentException.class, () -> new Message("Title", null, "Something Somewhere Somehow")); - assertThrows( - IllegalArgumentException.class, - () -> new Message("Title", "", "Something Somewhere Somehow")); } @Test void shouldThrowExceptionIfContentIsNullOrEmpty() { - assertThrows(IllegalArgumentException.class, () -> new Message("Title", "Someone", null)); - assertThrows(IllegalArgumentException.class, () -> new Message("Title", "Someone", "")); + assertThrows( + IllegalArgumentException.class, () -> new Message("Title", UUID.randomUUID(), null)); + assertThrows(IllegalArgumentException.class, () -> new Message("Title", UUID.randomUUID(), "")); } @Test void GettersWork() { - Message newMessage = new Message("Title", "Someone", "Somewhere"); + UUID uuid = UUID.randomUUID(); + Message newMessage = new Message("Title", uuid, "Somewhere"); assertInstanceOf(UUID.class, newMessage.getId()); assertEquals("Title", newMessage.getTitle()); - assertEquals("Someone", newMessage.getFrom()); + assertEquals(uuid, newMessage.getFrom()); assertEquals("Somewhere", newMessage.getContent()); - assertEquals(LocalDate.now(), newMessage.getTimeAndDate().toLocalDate()); + assertEquals(LocalDate.now(), newMessage.getTimeAndDate()); } } From 8d3c6f17474b721a90aeb3745a43950eb31ce6c5 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 20:36:10 +0200 Subject: [PATCH 28/33] Feat: Added JavaDoc to CharitySelect and Test file --- .../team6/database/Readers/CharitySelect.java | 228 ++++++++------ .../database/Readers/CharitySelectTest.java | 290 ++++++++++++++++++ 2 files changed, 425 insertions(+), 93 deletions(-) create mode 100644 helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/CharitySelectTest.java diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java index bdc0432..4c9ffb1 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java @@ -1,30 +1,57 @@ package ntnu.systemutvikling.team6.database.Readers; +import java.sql.*; +import java.time.LocalDate; +import java.util.ArrayList; import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; import ntnu.systemutvikling.team6.models.Feedback; import ntnu.systemutvikling.team6.models.user.User; -import java.sql.*; -import java.time.LocalDate; -import java.util.ArrayList; - +/** + * Data access class responsible for reading charity-related data from the database. + * + *

Provides methods to retrieve all charities (with their associated feedback and users) as well + * as feedback entries for a specific charity by UUID. + * + *

All queries are executed against a MySQL database via a {@link DatabaseConnection}. + */ public class CharitySelect { - private final DatabaseConnection connection; + private final DatabaseConnection connection; - public CharitySelect(DatabaseConnection connection){ - this.connection = connection; - } + /** + * Constructs a new {@code CharitySelect} with the given database connection. + * + * @param connection the {@link DatabaseConnection} to use for executing queries; must not be + * {@code null} + */ + public CharitySelect(DatabaseConnection connection) { + this.connection = connection; + } - public CharityRegistry getCharitiesFromDB() { - CharityRegistry registry = null; - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT + /** + * Retrieves all charities from the database, including their associated feedback and the users + * who submitted each piece of feedback. + * + *

The query performs a LEFT JOIN between the {@code Charities}, {@code Feedback}, and {@code + * User} tables. Each unique charity is added once to the registry; any feedback rows found for + * that charity are appended to its feedback list. + * + *

Note: charities with no feedback are still included in the result due to the LEFT JOIN. + * + * @return a {@link CharityRegistry} containing all charities found in the database, each + * populated with its associated {@link Feedback} objects (if any) + * @throws RuntimeException if a {@link SQLException} occurs while executing the query + */ + public CharityRegistry getCharitiesFromDB() { + CharityRegistry registry = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT c.UUID_charities, c.org_number, c.charity_name, c.charity_link, c.pre_approved, c.status, f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, u.UUID_user, u.user_name, u.user_email, u.user_password, u.role @@ -32,95 +59,110 @@ public CharityRegistry getCharitiesFromDB() { LEFT JOIN Feedback f ON f.charity_id = c.UUID_charities LEFT JOIN User u ON f.user_id = u.UUID_user """; - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(sql_query); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql_query); - Charity currentCharity = null; - String lastCharity = null; + Charity currentCharity = null; + String lastCharity = null; - registry = new CharityRegistry(); - while (rs.next()) { - String currentId = rs.getString("UUID_charities"); + registry = new CharityRegistry(); + while (rs.next()) { + String currentId = rs.getString("UUID_charities"); - if (lastCharity == null || !currentId.equals(lastCharity)) { - currentCharity = - new Charity( - rs.getString("UUID_charities"), - rs.getString("org_number"), - rs.getString("charity_link"), - rs.getString("charity_name"), - rs.getBoolean("pre_approved"), - rs.getString("status") - ); - registry.addCharity(currentCharity); - lastCharity = currentId; - } - String feedbackId = rs.getString("UUID_feedback"); - if (feedbackId != null){ - User userWithNoSettingsAndInbox = new User( - rs.getString("UUID_User"), - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); + if (lastCharity == null || !currentId.equals(lastCharity)) { + currentCharity = + new Charity( + rs.getString("UUID_charities"), + rs.getString("org_number"), + rs.getString("charity_link"), + rs.getString("charity_name"), + rs.getBoolean("pre_approved"), + rs.getString("status")); + registry.addCharity(currentCharity); + lastCharity = currentId; + } + String feedbackId = rs.getString("UUID_feedback"); + if (feedbackId != null) { + User userWithNoSettingsAndInbox = + new User( + rs.getString("UUID_User"), + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role")); - Feedback feedback = new Feedback( - rs.getString("UUID_feedback"), - userWithNoSettingsAndInbox, - rs.getString("feedback_comment"), - LocalDate.parse(rs.getString("feedback_date")) - ); + Feedback feedback = + new Feedback( + rs.getString("UUID_feedback"), + userWithNoSettingsAndInbox, + rs.getString("feedback_comment"), + LocalDate.parse(rs.getString("feedback_date"))); - currentCharity.getFeedbacks().add(feedback); - } - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + currentCharity.getFeedbacks().add(feedback); } - return registry; + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); } - public ArrayList getFeedbackforCharityUUID(String charity_uuid) { - ArrayList Feedbacks = new ArrayList<>(); - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ + return registry; + } + + /** + * A helper function that retrieves all feedback entries associated with a specific charity, + * identified by its UUID. Currently, has no use. + * + *

Each {@link Feedback} object is populated with the associated {@link User} (without settings + * or inbox data). The query uses a LEFT JOIN between the {@code Feedback} and {@code User} + * tables, filtered by {@code charity_id}. + * + * @param charity_uuid the UUID of the charity whose feedback should be retrieved; must not be + * {@code null} + * @return an {@link ArrayList} of {@link Feedback} objects for the given charity; returns an + * empty list if no feedback exists for that charity + * @throws RuntimeException if any exception occurs while executing the query, wrapping the + * original cause + */ + public ArrayList getFeedbackforCharityUUID(String charity_uuid) { + ArrayList Feedbacks = new ArrayList<>(); + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ SELECT f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, - u.UUID_user, u.user_name, u.user_email, u.user_password, u.role + u.UUID_user, u.user_name, u.user_email, u.user_password, u.role FROM Feedback f - LEFT JOIN User u ON f.user_id = u.UUID_user + LEFT JOIN User u ON f.user_id = u.UUID_user WHERE f.charity_id = ?; """; - PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, charity_uuid); - ResultSet rs = stmt.executeQuery(); + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, charity_uuid); + ResultSet rs = stmt.executeQuery(); - while (rs.next()){ - User userWithNoSettingsAndInbox = new User( - rs.getString("UUID_User"), - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); - Feedback feedback = new Feedback( - rs.getString("UUID_feedback"), - userWithNoSettingsAndInbox, - rs.getString("feedback_comment"), - LocalDate.parse(rs.getString("feedback_date")) - ); - Feedbacks.add(feedback); - } - } catch (Exception e) { - e.printStackTrace(); - throw new RuntimeException(e); - } finally { - conn = null; - } - return Feedbacks; + while (rs.next()) { + User userWithNoSettingsAndInbox = + new User( + rs.getString("UUID_User"), + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role")); + Feedback feedback = + new Feedback( + rs.getString("UUID_feedback"), + userWithNoSettingsAndInbox, + rs.getString("feedback_comment"), + LocalDate.parse(rs.getString("feedback_date"))); + Feedbacks.add(feedback); + } + } catch (Exception e) { + e.printStackTrace(); + throw new RuntimeException(e); + } finally { + conn = null; } + return Feedbacks; + } } diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/CharitySelectTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/CharitySelectTest.java new file mode 100644 index 0000000..7e4bad0 --- /dev/null +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/CharitySelectTest.java @@ -0,0 +1,290 @@ +package ntnu.systemutvikling.team6.database.Readers; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +import java.sql.*; +import java.util.ArrayList; +import ntnu.systemutvikling.team6.database.DatabaseConnection; +import ntnu.systemutvikling.team6.models.Charity; +import ntnu.systemutvikling.team6.models.CharityRegistry; +import ntnu.systemutvikling.team6.models.Feedback; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +/** + * Unit tests for {@link CharitySelect}. + * + *

Uses Mockito to mock {@link DatabaseConnection}, {@link Connection}, {@link Statement}, {@link + * PreparedStatement}, and {@link ResultSet} so that no real database connection is required. + */ +@ExtendWith(MockitoExtension.class) +class CharitySelectTest { + + @Mock private DatabaseConnection mockDatabaseConnection; + @Mock private Connection mockConnection; + @Mock private Statement mockStatement; + @Mock private PreparedStatement mockPreparedStatement; + @Mock private ResultSet mockResultSet; + + private CharitySelect charitySelect; + + @BeforeEach + void setUp() { + charitySelect = new CharitySelect(mockDatabaseConnection); + } + + // ------------------------------------------------------------------------- + // getCharitiesFromDB + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getCharitiesFromDB – empty result set returns an empty registry") + void getCharitiesFromDB_emptyResultSet_returnsEmptyRegistry() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + CharityRegistry registry = charitySelect.getCharitiesFromDB(); + + assertNotNull(registry); + assertTrue( + registry.getAllCharities().isEmpty(), + "Registry should contain no charities when the result set is empty"); + } + + @Test + @DisplayName("getCharitiesFromDB – single charity with no feedback is added once") + void getCharitiesFromDB_singleCharityNoFeedback_addedOnce() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + // One row, no feedback + when(mockResultSet.next()).thenReturn(true, false); + when(mockResultSet.getString("UUID_charities")).thenReturn("charity-uuid-1"); + when(mockResultSet.getString("org_number")).thenReturn("123456789"); + when(mockResultSet.getString("charity_link")).thenReturn("https://example.org"); + when(mockResultSet.getString("charity_name")).thenReturn("Test Charity"); + when(mockResultSet.getBoolean("pre_approved")).thenReturn(true); + when(mockResultSet.getString("status")).thenReturn("ACTIVE"); + when(mockResultSet.getString("UUID_feedback")).thenReturn(null); + + CharityRegistry registry = charitySelect.getCharitiesFromDB(); + + assertEquals( + 1, registry.getAllCharities().size(), "Registry should contain exactly one charity"); + Charity charity = registry.getAllCharities().get(0); + assertEquals("Test Charity", charity.getName()); + assertTrue(charity.getFeedbacks().isEmpty(), "Charity should have no feedback"); + } + + @Test + @DisplayName("getCharitiesFromDB – single charity with one feedback entry is populated correctly") + void getCharitiesFromDB_singleCharityWithFeedback_feedbackAdded() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + // One row with feedback + when(mockResultSet.next()).thenReturn(true, false); + when(mockResultSet.getString("UUID_charities")).thenReturn("charity-uuid-1"); + when(mockResultSet.getString("org_number")).thenReturn("123456789"); + when(mockResultSet.getString("charity_link")).thenReturn("https://example.org"); + when(mockResultSet.getString("charity_name")).thenReturn("Test Charity"); + when(mockResultSet.getBoolean("pre_approved")).thenReturn(false); + when(mockResultSet.getString("status")).thenReturn("PENDING"); + + when(mockResultSet.getString("UUID_feedback")).thenReturn("feedback-uuid-1"); + when(mockResultSet.getString("UUID_User")).thenReturn("user-uuid-1"); + when(mockResultSet.getString("user_name")).thenReturn("Alice"); + when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); + when(mockResultSet.getString("role")).thenReturn("USER"); + when(mockResultSet.getString("feedback_comment")).thenReturn("Great work!"); + when(mockResultSet.getString("feedback_date")).thenReturn("2024-03-15"); + + CharityRegistry registry = charitySelect.getCharitiesFromDB(); + + assertEquals(1, registry.getAllCharities().size()); + Charity charity = registry.getAllCharities().get(0); + assertEquals( + 1, charity.getFeedbacks().size(), "Charity should have exactly one feedback entry"); + + Feedback feedback = charity.getFeedbacks().get(0); + assertEquals("feedback-uuid-1", feedback.getFeedbackId()); + assertEquals("Great work!", feedback.getComment()); + } + + @Test + @DisplayName("getCharitiesFromDB – two different charities across two rows are both added") + void getCharitiesFromDB_twoCharities_bothAdded() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + // First row: charity A, no feedback + // Second row: charity B, no feedback + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("UUID_charities")).thenReturn("charity-uuid-A", "charity-uuid-B"); + when(mockResultSet.getString("org_number")).thenReturn("111111111", "222222222"); + when(mockResultSet.getString("charity_link")).thenReturn("https://a.org", "https://b.org"); + when(mockResultSet.getString("charity_name")).thenReturn("Charity A", "Charity B"); + when(mockResultSet.getBoolean("pre_approved")).thenReturn(true, false); + when(mockResultSet.getString("status")).thenReturn("ACTIVE", "INACTIVE"); + when(mockResultSet.getString("UUID_feedback")).thenReturn(null, null); + + CharityRegistry registry = charitySelect.getCharitiesFromDB(); + + assertEquals(2, registry.getAllCharities().size(), "Registry should contain two charities"); + } + + @Test + @DisplayName( + "getCharitiesFromDB – same charity UUID across two rows adds feedback without duplicating the charity") + void getCharitiesFromDB_sameCharityTwoRows_onlyOneCharityWithTwoFeedbacks() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + // Both rows share the same charity UUID + when(mockResultSet.getString("UUID_charities")).thenReturn("charity-uuid-1"); + when(mockResultSet.getString("org_number")).thenReturn("123456789"); + when(mockResultSet.getString("charity_link")).thenReturn("https://example.org"); + when(mockResultSet.getString("charity_name")).thenReturn("Test Charity"); + when(mockResultSet.getBoolean("pre_approved")).thenReturn(true); + when(mockResultSet.getString("status")).thenReturn("ACTIVE"); + + when(mockResultSet.getString("UUID_feedback")).thenReturn("feedback-uuid-1", "feedback-uuid-2"); + when(mockResultSet.getString("UUID_User")).thenReturn("user-uuid-1"); + when(mockResultSet.getString("user_name")).thenReturn("Alice"); + when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); + when(mockResultSet.getString("role")).thenReturn("USER"); + when(mockResultSet.getString("feedback_comment")).thenReturn("First comment", "Second comment"); + when(mockResultSet.getString("feedback_date")).thenReturn("2024-03-15"); + + CharityRegistry registry = charitySelect.getCharitiesFromDB(); + + assertEquals(1, registry.getAllCharities().size(), "The same charity should not be duplicated"); + assertEquals( + 2, + registry.getAllCharities().get(0).getFeedbacks().size(), + "Both feedback entries should be attached to the single charity"); + } + + @Test + @DisplayName("getCharitiesFromDB – SQLException is wrapped in RuntimeException") + void getCharitiesFromDB_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); + + assertThrows( + RuntimeException.class, + () -> charitySelect.getCharitiesFromDB(), + "A SQLException should be rethrown as a RuntimeException"); + } + + // ------------------------------------------------------------------------- + // getFeedbackforCharityUUID + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getFeedbackforCharityUUID – empty result set returns empty list") + void getFeedbackforCharityUUID_emptyResultSet_returnsEmptyList() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + ArrayList result = charitySelect.getFeedbackforCharityUUID("charity-uuid-1"); + + assertNotNull(result); + assertTrue( + result.isEmpty(), "Should return an empty list when no feedback exists for the given UUID"); + } + + @Test + @DisplayName("getFeedbackforCharityUUID – one row returns one Feedback with correct data") + void getFeedbackforCharityUUID_oneRow_returnsSingleFeedback() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + when(mockResultSet.getString("UUID_feedback")).thenReturn("feedback-uuid-1"); + when(mockResultSet.getString("UUID_User")).thenReturn("user-uuid-1"); + when(mockResultSet.getString("user_name")).thenReturn("Bob"); + when(mockResultSet.getString("user_email")).thenReturn("bob@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("secret"); + when(mockResultSet.getString("role")).thenReturn("ADMIN"); + when(mockResultSet.getString("feedback_comment")).thenReturn("Very helpful!"); + when(mockResultSet.getString("feedback_date")).thenReturn("2024-06-01"); + + ArrayList result = charitySelect.getFeedbackforCharityUUID("charity-uuid-1"); + + assertEquals(1, result.size()); + Feedback feedback = result.get(0); + assertEquals("feedback-uuid-1", feedback.getFeedbackId()); + assertEquals("Very helpful!", feedback.getComment()); + assertEquals("Bob", feedback.getUser().getName()); + } + + @Test + @DisplayName("getFeedbackforCharityUUID – two rows returns two Feedback objects") + void getFeedbackforCharityUUID_twoRows_returnsTwoFeedbacks() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("UUID_feedback")).thenReturn("fb-uuid-1", "fb-uuid-2"); + when(mockResultSet.getString("UUID_User")).thenReturn("user-uuid-1"); + when(mockResultSet.getString("user_name")).thenReturn("Carol"); + when(mockResultSet.getString("user_email")).thenReturn("carol@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("pw"); + when(mockResultSet.getString("role")).thenReturn("USER"); + when(mockResultSet.getString("feedback_comment")).thenReturn("Comment one", "Comment two"); + when(mockResultSet.getString("feedback_date")).thenReturn("2024-07-10"); + + ArrayList result = charitySelect.getFeedbackforCharityUUID("charity-uuid-1"); + + assertEquals( + 2, result.size(), "Should return exactly two Feedback objects for two result rows"); + } + + @Test + @DisplayName("getFeedbackforCharityUUID – UUID is bound to the PreparedStatement parameter") + void getFeedbackforCharityUUID_correctUUIDBindingVerified() throws Exception { + String targetUuid = "charity-uuid-XYZ"; + + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + charitySelect.getFeedbackforCharityUUID(targetUuid); + + verify(mockPreparedStatement).setString(1, targetUuid); + } + + @Test + @DisplayName("getFeedbackforCharityUUID – exception during query is wrapped in RuntimeException") + void getFeedbackforCharityUUID_exception_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())) + .thenThrow(new SQLException("Prepared statement failed")); + + assertThrows( + RuntimeException.class, + () -> charitySelect.getFeedbackforCharityUUID("charity-uuid-1"), + "Any exception during query execution should be rethrown as RuntimeException"); + } +} From 7d0960ccb57c30d229f5cab8997700ceb6d65522 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 20:36:22 +0200 Subject: [PATCH 29/33] Maven: mvn clean --- .../systemutvikling/team6/HmHApplication.java | 4 +- .../AvailableOrganizationController.java | 4 +- .../team6/controller/FrontpageController.java | 1 - .../team6/database/DatabaseSetup.java | 18 +- .../database/Readers/DonationSelect.java | 82 ++-- .../team6/database/Readers/UserSelect.java | 400 +++++++++++------- .../systemutvikling/team6/models/Charity.java | 5 +- .../team6/models/Feedback.java | 3 - .../team6/models/UserRegistry.java | 49 +-- .../team6/models/user/Message.java | 4 +- .../team6/models/user/Settings.java | 1 - .../team6/models/user/User.java | 19 +- 12 files changed, 322 insertions(+), 268 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java index da9cebb..b910eb3 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java @@ -3,7 +3,6 @@ import static javafx.application.Application.launch; import java.net.http.HttpClient; - import javafx.application.Application; import javafx.stage.Stage; import ntnu.systemutvikling.team6.database.DatabaseConnection; @@ -11,6 +10,7 @@ import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; import ntnu.systemutvikling.team6.scraper.APICharityScraper; +import ntnu.systemutvikling.team6.service.APIToDatabaseService; public class HmHApplication extends Application { @Override @@ -50,7 +50,7 @@ public void init() { HttpClient https = HttpClient.newHttpClient(); APICharityScraper scraper = new APICharityScraper(https); DatabaseConnection conn = new DatabaseConnection(); - DatabaseSetup db = new DatabaseSetup(conn); + APIToDatabaseService db = new APIToDatabaseService(conn); if (scraper.checkConnection()) { CharityRegistry charityRegistry = scraper.parseJSON(scraper.getJSONData()); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java index 139a5d2..f29ee61 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java @@ -10,7 +10,7 @@ import javafx.scene.control.TextField; import javafx.scene.layout.FlowPane; import ntnu.systemutvikling.team6.database.DatabaseConnection; -import ntnu.systemutvikling.team6.database.DatabaseSetup; +import ntnu.systemutvikling.team6.database.Readers.CharitySelect; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; @@ -40,7 +40,7 @@ public class AvailableOrganizationController { @FXML public void initialize() { DatabaseConnection conn = new DatabaseConnection(); - DatabaseSetup db = new DatabaseSetup(conn); + CharitySelect db = new CharitySelect(conn); CharityRegistry charities = db.getCharitiesFromDB(); allCharities = charities.getAllCharities(); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java index 9ce1e2e..7fa2b6c 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java @@ -13,7 +13,6 @@ import javafx.scene.control.TextField; import javafx.scene.layout.FlowPane; import ntnu.systemutvikling.team6.database.DatabaseConnection; -import ntnu.systemutvikling.team6.database.DatabaseSetup; import ntnu.systemutvikling.team6.database.Readers.CharitySelect; import ntnu.systemutvikling.team6.database.Readers.DonationSelect; import ntnu.systemutvikling.team6.models.Charity; diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java index 421c8bc..62de2e8 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java @@ -1,22 +1,14 @@ package ntnu.systemutvikling.team6.database; import java.sql.*; -import java.time.LocalDate; -import java.util.ArrayList; -import java.util.UUID; - import ntnu.systemutvikling.team6.models.*; import ntnu.systemutvikling.team6.models.user.*; -import ntnu.systemutvikling.team6.scraper.APICharityData; /** - * Manages the Database with MySQL tables and JDBC. + * Manages the Database with MySQL tables and test connection. * - *

This class is responsible for creating the tables needed for the application, if not done - * already and maintaining the {@code charities} table based on data retrieved from the IK API. It - * is also responsible for retrieving the data from the database and sending it to the application - * through the CharityRegistry and DonationRegistry. It is used by the FrontpageController to - * retrieve the data needed to display the charities + *

This class object is able to create MySQL to ntnu localized database and able to + * testConnection to it. */ public class DatabaseSetup { private final DatabaseConnection connection; @@ -57,8 +49,6 @@ public boolean testConnection() { /** * Creates the {@code Charities} and {@code Donations} tables if they do not already exist. * - *

The table structure for Charities is based on fields from {@link APICharityData}. - * * @throws RuntimeException if a {@link SQLException} occurs while creating the table */ public void createTables() { @@ -281,4 +271,4 @@ FOREIGN KEY (`User_UUID_User`) throw new RuntimeException("Error creating table."); } } -} \ No newline at end of file +} diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java index 97bc639..abcca9a 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java @@ -1,28 +1,28 @@ package ntnu.systemutvikling.team6.database.Readers; -import ntnu.systemutvikling.team6.database.DatabaseConnection; -import ntnu.systemutvikling.team6.models.Charity; -import ntnu.systemutvikling.team6.models.Donation; -import ntnu.systemutvikling.team6.models.DonationRegistry; - import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; +import ntnu.systemutvikling.team6.database.DatabaseConnection; +import ntnu.systemutvikling.team6.models.Charity; +import ntnu.systemutvikling.team6.models.Donation; +import ntnu.systemutvikling.team6.models.DonationRegistry; public class DonationSelect { - private final DatabaseConnection connection; + private final DatabaseConnection connection; - public DonationSelect (DatabaseConnection connection){ - this.connection = connection; - } - public DonationRegistry getDonationFromDB() { - DonationRegistry registry = null; - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ + public DonationSelect(DatabaseConnection connection) { + this.connection = connection; + } + + public DonationRegistry getDonationFromDB() { + DonationRegistry registry = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ SELECT d.UUID_Donations, d.amount, @@ -37,32 +37,32 @@ public DonationRegistry getDonationFromDB() { JOIN Charities c ON d.Charities_UUID_charities = c.UUID_charities """; - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(sql_query); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql_query); - registry = new DonationRegistry(); - while (rs.next()) { - Charity charity = - new Charity( - rs.getString("UUID_charities"), - rs.getString("org_number"), - rs.getString("charity_name"), - rs.getString("charity_link"), - rs.getBoolean("pre_approved"), - rs.getString("status")); + registry = new DonationRegistry(); + while (rs.next()) { + Charity charity = + new Charity( + rs.getString("UUID_charities"), + rs.getString("org_number"), + rs.getString("charity_name"), + rs.getString("charity_link"), + rs.getBoolean("pre_approved"), + rs.getString("status")); - Donation donation = - new Donation( - rs.getString("UUID_Donations"), - rs.getDouble("amount"), - rs.getDate("date").toLocalDate(), - charity); - registry.addDonation(donation); - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } - return registry; + Donation donation = + new Donation( + rs.getString("UUID_Donations"), + rs.getDouble("amount"), + rs.getDate("date").toLocalDate(), + charity); + registry.addDonation(donation); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); } + return registry; + } } diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java index e232d08..b62ebae 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java @@ -1,89 +1,159 @@ package ntnu.systemutvikling.team6.database.Readers; -import ntnu.systemutvikling.team6.database.DatabaseConnection; -import ntnu.systemutvikling.team6.models.UserRegistry; -import ntnu.systemutvikling.team6.models.user.*; - import java.sql.*; import java.time.LocalDate; import java.util.UUID; +import ntnu.systemutvikling.team6.database.DatabaseConnection; +import ntnu.systemutvikling.team6.models.UserRegistry; +import ntnu.systemutvikling.team6.models.user.*; +import ntnu.systemutvikling.team6.security.PasswordHasher; public class UserSelect { - private final DatabaseConnection connection; + private final DatabaseConnection connection; + + public UserSelect(DatabaseConnection connection) { + this.connection = connection; + } + + public User getUserFromDBUsernameAndPassword(String username, String password) { + PasswordHasher hasher = new PasswordHasher(); + String hashedpassword = hasher.getHashPassword(password); + + User user = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT + u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, + s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, + m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id + FROM User u + LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user + LEFT JOIN Messages m ON u.UUID_User = m.user_id + WHERE u.user_password = ? AND u.user_password = ?; + """; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, username); + stmt.setString(2, hashedpassword); - public UserSelect(DatabaseConnection connection){ - this.connection = connection; + ResultSet rs = stmt.executeQuery(); + + String lastUserid = null; + while (rs.next()) { + String userId = rs.getString("UUID_User"); + if (lastUserid == null || !userId.equals(lastUserid)) { + user = + new User( + userId, + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role")); + if (rs.getString("isAnonymous") != null) { + Settings settings = + new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode")); + user.setSettings(settings); + } + user.setInbox(new Inbox()); + lastUserid = userId; + } + String messageId = rs.getString("UUID_message"); + if (messageId != null) { + Message message = + new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_content"), + LocalDate.parse(rs.getString("message_date"))); + + user.getInbox().addMessage(message); + } + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } finally { + conn = null; } + return user; + } - public User getUserFromDBUuid(String user_id){ - User user = null; - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT + public User getUserFromDBUuid(String user_id) { + User user = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id FROM User u LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user LEFT JOIN Messages m ON u.UUID_User = m.user_id - WHERE u.UUID_User = ?; + WHERE u.UUID_User = ?; """; - PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, user_id); - ResultSet rs = stmt.executeQuery(); - - String lastUserid = null; - while (rs.next()) { - String userId = rs.getString("UUID_User"); - if (lastUserid == null || !userId.equals(lastUserid)) { - user = new User( - userId, - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); - if (rs.getString("isAnonymous") != null){ - Settings settings = new Settings( - rs.getBoolean("isAnonymous"), - Language.valueOf(rs.getString("language").toUpperCase()), - rs.getBoolean("lightmode") - ); - user.setSettings(settings); - } - user.setInbox(new Inbox()); - lastUserid = userId; - } - String messageId = rs.getString("UUID_message"); - if (messageId != null) { - Message message = new Message( - rs.getString("message_title"), - UUID.fromString(rs.getString("sender_charity_id")), - rs.getString("message_content"), - LocalDate.parse(rs.getString("message_date")) - ); - - user.getInbox().addMessage(message); - } - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, user_id); + ResultSet rs = stmt.executeQuery(); + + String lastUserid = null; + while (rs.next()) { + String userId = rs.getString("UUID_User"); + if (lastUserid == null || !userId.equals(lastUserid)) { + user = + new User( + userId, + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role")); + if (rs.getString("isAnonymous") != null) { + Settings settings = + new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode")); + user.setSettings(settings); + } + user.setInbox(new Inbox()); + lastUserid = userId; + } + String messageId = rs.getString("UUID_message"); + if (messageId != null) { + Message message = + new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_content"), + LocalDate.parse(rs.getString("message_date"))); + + user.getInbox().addMessage(message); } - return user; + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } finally { + conn = null; } + return user; + } - public UserRegistry getUsersFromDB(){ - UserRegistry registry = new UserRegistry(); - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ - SELECT + public UserRegistry getUsersFromDB() { + UserRegistry registry = new UserRegistry(); + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ + SELECT u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id @@ -91,111 +161,117 @@ public UserRegistry getUsersFromDB(){ LEFT JOIN Settings s ON u.UUID_User = s.User_UUID_user LEFT JOIN Messages m ON u.UUID_User = m.user_id """; - Statement stmt = conn.createStatement(); - ResultSet rs = stmt.executeQuery(sql_query); - - User currentUser = null; - String lastUserid = null; - - while (rs.next()) { - String userId = rs.getString("UUID_User"); - - if (lastUserid == null || !userId.equals(lastUserid)) { - currentUser = new User( - userId, - rs.getString("user_name"), - rs.getString("user_email"), - rs.getString("user_password"), - rs.getString("role") - ); - if (rs.getString("isAnonymous") != null){ - Settings settings = new Settings( - rs.getBoolean("isAnonymous"), - Language.valueOf(rs.getString("language").toUpperCase()), - rs.getBoolean("lightmode") - ); - currentUser.setSettings(settings); - } - currentUser.setInbox(new Inbox()); - registry.addUser(currentUser); - lastUserid = userId; - } - String messageId = rs.getString("UUID_message"); - if (messageId != null) { - Message message = new Message( - rs.getString("message_title"), - UUID.fromString(rs.getString("sender_charity_id")), - rs.getString("message_content"), - LocalDate.parse(rs.getString("message_date")) - ); - - currentUser.getInbox().addMessage(message); - } - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + Statement stmt = conn.createStatement(); + ResultSet rs = stmt.executeQuery(sql_query); + + User currentUser = null; + String lastUserid = null; + + while (rs.next()) { + String userId = rs.getString("UUID_User"); + + if (lastUserid == null || !userId.equals(lastUserid)) { + currentUser = + new User( + userId, + rs.getString("user_name"), + rs.getString("user_email"), + rs.getString("user_password"), + rs.getString("role")); + if (rs.getString("isAnonymous") != null) { + Settings settings = + new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode")); + currentUser.setSettings(settings); + } + currentUser.setInbox(new Inbox()); + registry.addUser(currentUser); + lastUserid = userId; + } + String messageId = rs.getString("UUID_message"); + if (messageId != null) { + Message message = + new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_content"), + LocalDate.parse(rs.getString("message_date"))); + + currentUser.getInbox().addMessage(message); } - return registry; + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } finally { + conn = null; } + return registry; + } - public Settings getSettingsForUser(String user_id){ - Settings settings = null; - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ + public Settings getSettingsForUser(String user_id) { + Settings settings = null; + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ SELECT User_UUID_User, isAnonymous, language, lightmode FROM Settings - WHERE User_UUID_User = ?; + WHERE User_UUID_User = ?; """; - PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, user_id); - stmt.setMaxRows(1); - ResultSet rs = stmt.executeQuery(); - - while (rs.next()) { - settings = new Settings( - rs.getBoolean("isAnonymous"), - Language.valueOf(rs.getString("language").toUpperCase()), - rs.getBoolean("lightmode") - ); - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, user_id); + stmt.setMaxRows(1); + ResultSet rs = stmt.executeQuery(); - return settings; + while (rs.next()) { + settings = + new Settings( + rs.getBoolean("isAnonymous"), + Language.valueOf(rs.getString("language").toUpperCase()), + rs.getBoolean("lightmode")); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } finally { + conn = null; } - public Inbox getInboxForUser(String user_id){ - Inbox inbox = new Inbox(); - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - String sql_query = - """ + return settings; + } + + public Inbox getInboxForUser(String user_id) { + Inbox inbox = new Inbox(); + Connection conn = null; + try { + conn = connection.getMySqlConnection(); + String sql_query = + """ SELECT UUID_message, message_title, message_content, message_date, sender_user_id, sender_charity_id, user_id FROM Messages - WHERE user_id = ?; + WHERE user_id = ?; """; - PreparedStatement stmt = conn.prepareStatement(sql_query); - stmt.setString(1, user_id); - ResultSet rs = stmt.executeQuery(); - - while (rs.next()) { - Message message = new Message( - rs.getString("message_title"), - UUID.fromString(rs.getString("sender_charity_id")), - rs.getString("message_date"), - LocalDate.parse(rs.getString("message_date")) - ); - inbox.addMessage(message); - } - } catch (SQLException e) { - e.printStackTrace(); - throw new RuntimeException("ERROR: Something went wrong during updating charities table."); - } - return inbox; + PreparedStatement stmt = conn.prepareStatement(sql_query); + stmt.setString(1, user_id); + ResultSet rs = stmt.executeQuery(); + + while (rs.next()) { + Message message = + new Message( + rs.getString("message_title"), + UUID.fromString(rs.getString("sender_charity_id")), + rs.getString("message_date"), + LocalDate.parse(rs.getString("message_date"))); + inbox.addMessage(message); + } + } catch (SQLException e) { + e.printStackTrace(); + throw new RuntimeException("ERROR: Something went wrong during updating charities table."); + } finally { + conn = null; } + return inbox; + } } diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Charity.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Charity.java index eaae882..fdae199 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Charity.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Charity.java @@ -125,12 +125,11 @@ public void setUnverified() { } /** - * Set method for feedbacks. - * Primarily will be used to set feedbacks taken from database. + * Set method for feedbacks. Primarily will be used to set feedbacks taken from database. * * @param feedbacks */ - public void setFeedbacks(ArrayList feedbacks){ + public void setFeedbacks(ArrayList feedbacks) { this.feedbacks = feedbacks; } } diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java index 75ce7bd..6e78c3b 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/Feedback.java @@ -1,8 +1,6 @@ package ntnu.systemutvikling.team6.models; import java.time.LocalDate; -import java.time.LocalDateTime; -import java.util.Date; import java.util.UUID; import ntnu.systemutvikling.team6.models.user.User; @@ -42,7 +40,6 @@ public Feedback(User user, String comment) { * @param user The user who gives the feedback. * @param comment The content of the feedback. * @param feedback_date The content of the feedback. - */ public Feedback(String feedback_id, User user, String feedback_comment, LocalDate feedback_date) { this.feedbackId = UUID.fromString(feedback_id); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/UserRegistry.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/UserRegistry.java index 3035d48..454fc11 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/UserRegistry.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/UserRegistry.java @@ -1,40 +1,37 @@ package ntnu.systemutvikling.team6.models; -import ntnu.systemutvikling.team6.models.user.User; - import java.util.*; +import ntnu.systemutvikling.team6.models.user.User; public class UserRegistry { - private final List Users; + private final List Users; - public UserRegistry() { - this.Users = new ArrayList<>(); - } + public UserRegistry() { + this.Users = new ArrayList<>(); + } - public List getAllUsers() { - return Collections.unmodifiableList(Users); - } + public List getAllUsers() { + return Collections.unmodifiableList(Users); + } - public Optional findUserById(UUID userUUID) { - if (userUUID == null) { - throw new IllegalArgumentException("DonationId can not be null."); - } - return Users.stream() - .filter(u -> userUUID.equals(u.getId())) - .findFirst(); + public Optional findUserById(UUID userUUID) { + if (userUUID == null) { + throw new IllegalArgumentException("DonationId can not be null."); } + return Users.stream().filter(u -> userUUID.equals(u.getId())).findFirst(); + } - public void addUser(User user) { - if (user == null) { - throw new IllegalArgumentException("Donation can not be null."); - } - Users.add(user); + public void addUser(User user) { + if (user == null) { + throw new IllegalArgumentException("Donation can not be null."); } + Users.add(user); + } - public boolean removeUserByUUID(UUID userUUID) { - if (userUUID == null) { - throw new IllegalArgumentException("DonationId can not be null."); - } - return Users.removeIf(user -> userUUID.equals(user.getId())); + public boolean removeUserByUUID(UUID userUUID) { + if (userUUID == null) { + throw new IllegalArgumentException("DonationId can not be null."); } + return Users.removeIf(user -> userUUID.equals(user.getId())); + } } diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Message.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Message.java index 3f0fe44..3a2a75d 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Message.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Message.java @@ -1,7 +1,6 @@ package ntnu.systemutvikling.team6.models.user; import java.time.LocalDate; -import java.time.LocalDateTime; import java.util.UUID; // Enhetstester mangler @@ -50,8 +49,7 @@ public Message(String title, UUID from, String content) { /** * Creates a message with a unique identifier. The message includes a title, a string who it's - * from, content and the time and date. - * This one creates a message that has been created before. + * from, content and the time and date. This one creates a message that has been created before. * * @param title the title of the message * @param from who the message is from diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Settings.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Settings.java index 36d049b..d814283 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Settings.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Settings.java @@ -33,7 +33,6 @@ public Settings(boolean lightMode, Language language, boolean anonymous) { this.anonymous = anonymous; } - /** Toggles between light and dark mode */ public void toggleLightMode() { lightMode = !lightMode; diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java index 4c3f108..ed375dc 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java @@ -67,9 +67,10 @@ public User( this.settings = settings; this.inbox = inbox; } + /** - * Creates a new user taylored for getting info from DATABASE. - * Settings and inbox can be set on a later date throught another method in databaseManager class + * Creates a new user taylored for getting info from DATABASE. Settings and inbox can be set on a + * later date throught another method in databaseManager class * * @param uuid gives the user a unique identifier with UUID * @param name the name of the user @@ -78,8 +79,7 @@ public User( * @param role users role * @throws IllegalArgumentException if any required argument is invalid. */ - public User( - String uuid, String name, String email, String password, String role) { + public User(String uuid, String name, String email, String password, String role) { if (uuid == null || uuid.isBlank()) { throw new IllegalArgumentException("UUID cannot be null or blank."); @@ -91,14 +91,13 @@ public User( if (email == null || email.isBlank() || !email.contains("@") || !email.contains(".")) { throw new IllegalArgumentException( - "Email cannot be null or blank," + " and must contain '@' and '.'"); + "Email cannot be null or blank," + " and must contain '@' and '.'"); } if (role == null) { throw new IllegalArgumentException("Role cannot be null"); } - this.id = UUID.fromString(uuid); this.name = name; this.email = email; @@ -186,15 +185,15 @@ public boolean checkPassword(String password) { return passwordHasher.isValidPassword(password, passwordHash); } - public void setSettings(Settings settings){ - if (settings == null){ + public void setSettings(Settings settings) { + if (settings == null) { throw new IllegalArgumentException("Settings cannot be null"); } this.settings = settings; } - public void setInbox(Inbox inbox){ - if (inbox == null){ + public void setInbox(Inbox inbox) { + if (inbox == null) { throw new IllegalArgumentException("Inbox cannot be null"); } this.inbox = inbox; From f6d44f76c2237f1e541a826c915618ee060b4ef7 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 20:41:20 +0200 Subject: [PATCH 30/33] Fix: Fixed DatabaseSetupTest --- .../team6/database/DatabaseManagerTest.java | 140 ------------------ .../team6/database/DatabaseSetupTest.java | 65 ++++++++ 2 files changed, 65 insertions(+), 140 deletions(-) delete mode 100644 helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java create mode 100644 helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseSetupTest.java diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java deleted file mode 100644 index 2ef32eb..0000000 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseManagerTest.java +++ /dev/null @@ -1,140 +0,0 @@ -package ntnu.systemutvikling.team6.database; - -import static org.junit.jupiter.api.Assertions.*; - -import java.sql.*; -import java.util.ArrayList; -import java.util.List; -import ntnu.systemutvikling.team6.database.Readers.CharitySelect; -import ntnu.systemutvikling.team6.database.Readers.DonationSelect; -import ntnu.systemutvikling.team6.models.Charity; -import ntnu.systemutvikling.team6.models.CharityRegistry; -import ntnu.systemutvikling.team6.service.APIToDatabaseService; -import org.junit.jupiter.api.*; - -class DatabaseManagerTest { - - private DatabaseSetup dbManager; - private APIToDatabaseService service; - private CharitySelect charitySelect; - private DonationSelect donationSelect; - - @BeforeEach - public void setUp() throws SQLException { - DatabaseConnection conn = new DatabaseConnection(); - this.dbManager = new DatabaseSetup(conn); - this.service = new APIToDatabaseService(conn); - this.charitySelect = new CharitySelect(conn); - this.donationSelect = new DonationSelect(conn); - } - - // Make sure you're connected to the NTNU network for this to work - @Test - public void testConnectionShouldReturnTrue() { - assertTrue(dbManager.testConnection()); - } - - @Test - void createCharitiesTableShouldCreateTableSuccessfully() throws SQLException { - dbManager.createTables(); - - try (Connection conn = new DatabaseConnection().getMySqlConnection()) { - ResultSet rs = conn.getMetaData().getTables(null, null, "Charities", null); - - assertTrue(rs.next()); - } - } - - @Test - void updateCharitiesShouldInsertCorrectData() throws SQLException { - dbManager.createTables(); - - String org_number = "12345"; - String name = "Test Charity"; - String status = "approved"; - String url = "https://www.svindel.no"; - boolean is_pre_approved = false; - - Charity charity = new Charity(org_number, url, name, is_pre_approved, status); - service.addAPIDataToTable(List.of(charity)); - - Charity charity2 = new Charity(org_number, url, name + " Updated", is_pre_approved, status); - service.addAPIDataToTable(List.of(charity2)); - - dbManager.createTables(); - - CharityRegistry registry = charitySelect.getCharitiesFromDB(); - Charity insertedCharity = registry.findCharityByOrgnumber("12345").get(); - assertEquals("Test Charity Updated", insertedCharity.getName()); - } - - @Test - void updateCharitiesShouldRemoveDataNotInList() throws SQLException { - String org_number = "12345"; - String name = "Svindelorg"; - String status = "approved"; - String url = "https://www.svindel.no"; - boolean is_pre_approved = false; - - var charity1 = new Charity(org_number, url, name, is_pre_approved, status); - - org_number = "23456"; - name = "SvindelKoin"; - status = "approved"; - url = "https://www.svindel.net"; - is_pre_approved = true; - - var charity2 = new Charity(org_number, url, name, is_pre_approved, status); - - org_number = "345672"; - name = "Arme Svindlere"; - status = "approved"; - url = "https://www.armesvindlere.com"; - is_pre_approved = false; - - var charity3 = new Charity(org_number, url, name, is_pre_approved, status); - - List charityListBefore = new ArrayList<>(); - charityListBefore.add(charity1); - charityListBefore.add(charity2); - charityListBefore.add(charity3); - - service.addAPIDataToTable(charityListBefore); - - List charityListNew = new ArrayList<>(); - charityListNew.add(charity1); - charityListNew.add(charity3); - - service.addAPIDataToTable(charityListNew); - - try (Connection conn = new DatabaseConnection().getMySqlConnection()) { - PreparedStatement stmt = - conn.prepareStatement("SELECT COUNT(org_number) AS number_a FROM Charities"); - - ResultSet rs = stmt.executeQuery(); - - assertTrue(rs.next(), "Charities count row should exist."); - assertEquals( - 2, - rs.getInt("number_a"), - "The amount of org_numbers in the table" + "should be 2 due to removal of 1 table."); - } - } - - @Test - void tempTableShouldNotExistAfterUpdating() throws SQLException { - Charity charity = new Charity("99999", "https://temp.no", "Temp Charity", false, "approved"); - - service.addAPIDataToTable(List.of(charity)); - - try (Connection conn = new DatabaseConnection().getMySqlConnection()) { - PreparedStatement stmt = conn.prepareStatement("SELECT * FROM temp_api_charities"); - - assertThrows( - java.sql.SQLSyntaxErrorException.class, - () -> { - ResultSet rs = stmt.executeQuery(); - }); - } - } -} diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseSetupTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseSetupTest.java new file mode 100644 index 0000000..4501cd8 --- /dev/null +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseSetupTest.java @@ -0,0 +1,65 @@ +package ntnu.systemutvikling.team6.database; + +import static org.junit.jupiter.api.Assertions.*; + +import java.sql.*; +import java.util.ArrayList; +import java.util.List; +import ntnu.systemutvikling.team6.database.Readers.CharitySelect; +import ntnu.systemutvikling.team6.database.Readers.DonationSelect; +import ntnu.systemutvikling.team6.models.Charity; +import ntnu.systemutvikling.team6.models.CharityRegistry; +import ntnu.systemutvikling.team6.service.APIToDatabaseService; +import org.junit.jupiter.api.*; + +class DatabaseSetupTest { + + private DatabaseSetup dbManager; + private APIToDatabaseService service; + private CharitySelect charitySelect; + private DonationSelect donationSelect; + + @BeforeEach + public void setUp() throws SQLException { + DatabaseConnection conn = new DatabaseConnection(); + this.dbManager = new DatabaseSetup(conn); + this.service = new APIToDatabaseService(conn); + this.charitySelect = new CharitySelect(conn); + this.donationSelect = new DonationSelect(conn); + } + + // Make sure you're connected to the NTNU network for this to work + @Test + public void testConnectionShouldReturnTrue() { + assertTrue(dbManager.testConnection()); + } + + @Test + void createCharitiesTableShouldCreateTableSuccessfully() throws SQLException { + dbManager.createTables(); + + try (Connection conn = new DatabaseConnection().getMySqlConnection()) { + ResultSet rs = conn.getMetaData().getTables(null, null, "Charities", null); + + assertTrue(rs.next()); + } + } + + + @Test + void tempTableShouldNotExistAfterUpdating() throws SQLException { + Charity charity = new Charity("99999", "https://temp.no", "Temp Charity", false, "approved"); + + service.addAPIDataToTable(List.of(charity)); + + try (Connection conn = new DatabaseConnection().getMySqlConnection()) { + PreparedStatement stmt = conn.prepareStatement("SELECT * FROM temp_api_charities"); + + assertThrows( + java.sql.SQLSyntaxErrorException.class, + () -> { + ResultSet rs = stmt.executeQuery(); + }); + } + } +} From c1c1b7fb5cc628d738166e6dfb848d4d6531d79c Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 20:46:16 +0200 Subject: [PATCH 31/33] Feat: Added DonationSelect JavaDoc And Junit test --- .../database/Readers/DonationSelect.java | 28 +++ .../database/Readers/DonationSelectTest.java | 218 ++++++++++++++++++ 2 files changed, 246 insertions(+) create mode 100644 helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/DonationSelectTest.java diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java index abcca9a..075e0d0 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java @@ -9,13 +9,41 @@ import ntnu.systemutvikling.team6.models.Donation; import ntnu.systemutvikling.team6.models.DonationRegistry; +/** + * Data access class responsible for reading donation data from the database. + * + *

Retrieves donations along with their associated charity information by + * performing an INNER JOIN between the {@code Donations} and {@code Charities} tables. + * Only donations that have a matching charity record are returned.

+ */ + public class DonationSelect { + + /** The database connection used for all queries in this class. */ private final DatabaseConnection connection; + /** + * Constructs a new {@code DonationSelect} with the given database connection. + * + * @param connection the {@link DatabaseConnection} to use for executing queries; + * must not be {@code null} + */ public DonationSelect(DatabaseConnection connection) { this.connection = connection; } + /** + * Retrieves all donations from the database, each populated with its associated + * {@link Charity}. + * + *

The query performs an INNER JOIN between the {@code Donations} and + * {@code Charities} tables on the charity UUID foreign key. Donations without a + * matching charity are excluded from the result.

+ * + * @return a {@link DonationRegistry} containing all matched donations; + * never {@code null}, but may be empty if no rows are returned + * @throws RuntimeException if a {@link SQLException} occurs while executing the query + */ public DonationRegistry getDonationFromDB() { DonationRegistry registry = null; Connection conn = null; diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/DonationSelectTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/DonationSelectTest.java new file mode 100644 index 0000000..f7d8b36 --- /dev/null +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/DonationSelectTest.java @@ -0,0 +1,218 @@ +package ntnu.systemutvikling.team6.database.Readers; + +import ntnu.systemutvikling.team6.database.DatabaseConnection; +import ntnu.systemutvikling.team6.models.Donation; +import ntnu.systemutvikling.team6.models.DonationRegistry; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.sql.*; +import java.time.LocalDate; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +/** + * Unit tests for {@link DonationSelect}. + * + *

Uses Mockito to mock the entire JDBC stack so no real database + * connection is required.

+ */ +@ExtendWith(MockitoExtension.class) +class DonationSelectTest { + + @Mock private DatabaseConnection mockDatabaseConnection; + @Mock private Connection mockConnection; + @Mock private Statement mockStatement; + @Mock private ResultSet mockResultSet; + @Mock private Date mockSqlDate; + + private DonationSelect donationSelect; + + @BeforeEach + void setUp() { + donationSelect = new DonationSelect(mockDatabaseConnection); + } + + // ------------------------------------------------------------------------- + // getDonationFromDB + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getDonationFromDB – empty result set returns an empty registry") + void getDonationFromDB_emptyResultSet_returnsEmptyRegistry() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertNotNull(registry); + assertTrue(registry.getDonations().isEmpty(), + "Registry should be empty when the result set has no rows"); + } + + @Test + @DisplayName("getDonationFromDB – single row returns one Donation with correct data") + void getDonationFromDB_singleRow_returnsSingleDonation() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCharityColumns("charity-uuid-1", "123456789", "Test Charity", + "https://example.org", true, "ACTIVE"); + stubDonationColumns("donation-uuid-1", 250.0, LocalDate.of(2024, 5, 20)); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertEquals(1, registry.getDonations().size()); + Donation donation = registry.getDonations().get(0); + assertEquals("donation-uuid-1", donation.getUUID()); + assertEquals(250.0, donation.getAmount()); + assertEquals(LocalDate.of(2024, 5, 20), donation.getDate()); + } + + @Test + @DisplayName("getDonationFromDB – single row maps charity fields onto the Donation correctly") + void getDonationFromDB_singleRow_charityMappedCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCharityColumns("charity-uuid-1", "987654321", "Help Fund", + "https://helpfund.org", false, "PENDING"); + stubDonationColumns("donation-uuid-1", 100.0, LocalDate.of(2024, 1, 1)); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + Donation donation = registry.getDonations().get(0); + assertEquals("charity-uuid-1", donation.getCharity().getUUID()); + assertEquals("987654321", donation.getCharity().getOrgNumber()); + assertEquals("Help Fund", donation.getCharity().getCharityName()); + assertEquals("https://helpfund.org", donation.getCharity().getCharityLink()); + assertFalse(donation.getCharity().isPreApproved()); + assertEquals("PENDING", donation.getCharity().getStatus()); + } + + @Test + @DisplayName("getDonationFromDB – two rows returns two Donation objects") + void getDonationFromDB_twoRows_returnsTwoDonations() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + + when(mockResultSet.getString("UUID_charities")).thenReturn("charity-uuid-1", "charity-uuid-2"); + when(mockResultSet.getString("org_number")).thenReturn("111111111", "222222222"); + when(mockResultSet.getString("charity_name")).thenReturn("Charity A", "Charity B"); + when(mockResultSet.getString("charity_link")).thenReturn("https://a.org", "https://b.org"); + when(mockResultSet.getBoolean("pre_approved")).thenReturn(true, false); + when(mockResultSet.getString("status")).thenReturn("ACTIVE", "INACTIVE"); + + when(mockResultSet.getString("UUID_Donations")).thenReturn("donation-uuid-1", "donation-uuid-2"); + when(mockResultSet.getDouble("amount")).thenReturn(500.0, 750.0); + + Date sqlDate = Date.valueOf(LocalDate.of(2024, 8, 10)); + when(mockResultSet.getDate("date")).thenReturn(sqlDate); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertEquals(2, registry.getDonations().size(), + "Registry should contain two donations for two result rows"); + } + + @Test + @DisplayName("getDonationFromDB – donation amount of zero is stored correctly") + void getDonationFromDB_zeroAmount_storedCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCharityColumns("charity-uuid-1", "123456789", "Test Charity", + "https://example.org", true, "ACTIVE"); + stubDonationColumns("donation-uuid-zero", 0.0, LocalDate.of(2024, 1, 1)); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertEquals(0.0, registry.getDonations().get(0).getAmount()); + } + + @Test + @DisplayName("getDonationFromDB – large donation amount is stored correctly") + void getDonationFromDB_largeAmount_storedCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCharityColumns("charity-uuid-1", "123456789", "Test Charity", + "https://example.org", true, "ACTIVE"); + stubDonationColumns("donation-uuid-big", 1_000_000.99, LocalDate.of(2024, 12, 31)); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertEquals(1_000_000.99, registry.getDonations().get(0).getAmount(), 0.001); + } + + @Test + @DisplayName("getDonationFromDB – SQLException is wrapped in RuntimeException") + void getDonationFromDB_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); + + assertThrows(RuntimeException.class, () -> donationSelect.getDonationFromDB(), + "A SQLException should be rethrown as a RuntimeException"); + } + + @Test + @DisplayName("getDonationFromDB – RuntimeException message contains expected error text") + void getDonationFromDB_sqlException_runtimeExceptionHasExpectedMessage() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); + + RuntimeException ex = assertThrows(RuntimeException.class, + () -> donationSelect.getDonationFromDB()); + assertTrue(ex.getMessage().contains("ERROR"), + "RuntimeException message should contain 'ERROR'"); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + /** + * Stubs all charity-related columns on the mock ResultSet. + */ + private void stubCharityColumns(String uuid, String orgNumber, String name, + String link, boolean preApproved, String status) + throws SQLException { + when(mockResultSet.getString("UUID_charities")).thenReturn(uuid); + when(mockResultSet.getString("org_number")).thenReturn(orgNumber); + when(mockResultSet.getString("charity_name")).thenReturn(name); + when(mockResultSet.getString("charity_link")).thenReturn(link); + when(mockResultSet.getBoolean("pre_approved")).thenReturn(preApproved); + when(mockResultSet.getString("status")).thenReturn(status); + } + + /** + * Stubs all donation-related columns on the mock ResultSet. + */ + private void stubDonationColumns(String uuid, double amount, LocalDate date) + throws SQLException { + when(mockResultSet.getString("UUID_Donations")).thenReturn(uuid); + when(mockResultSet.getDouble("amount")).thenReturn(amount); + Date sqlDate = Date.valueOf(date); + when(mockResultSet.getDate("date")).thenReturn(sqlDate); + } +} \ No newline at end of file From 8d265375766f99b9b8d3c216f58d7303b8ab01dc Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 21:11:54 +0200 Subject: [PATCH 32/33] Feat: Added UserSelect JavaDoc And Junit test --- .../team6/database/Readers/UserSelect.java | 84 ++++ .../database/Readers/UserSelectTest.java | 406 ++++++++++++++++++ 2 files changed, 490 insertions(+) create mode 100644 helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/UserSelectTest.java diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java index b62ebae..36d2f0b 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java @@ -8,13 +8,49 @@ import ntnu.systemutvikling.team6.models.user.*; import ntnu.systemutvikling.team6.security.PasswordHasher; +/** + * Data access class responsible for reading user-related data from the database. + * + *

Provides methods to retrieve individual users (by credentials or UUID), + * all users, a user's settings, and a user's inbox. Queries use LEFT JOINs + * across the {@code User}, {@code Settings}, and {@code Messages} tables to + * assemble fully populated {@link User} objects in a single round trip where + * possible.

+ */ + public class UserSelect { + /** The database connection used for all queries in this class. */ private final DatabaseConnection connection; + /** + * Constructs a new {@code UserSelect} with the given database connection. + * + * @param connection the {@link DatabaseConnection} to use for executing queries; + * must not be {@code null} + */ public UserSelect(DatabaseConnection connection) { this.connection = connection; } + /** + * Retrieves a single {@link User} from the database matching the given username + * and password. + * + *

The password is hashed via {@link PasswordHasher} before being compared + * against the stored value. If a matching user is found, their {@link Settings} + * (when present) and {@link Inbox} (including any {@link Message} objects) are + * also populated. Returns {@code null} if no matching user is found.

+ * + *

Note: the current SQL query compares both parameters against + * {@code user_password}; the {@code user_name} column is not yet included in the + * WHERE clause, which may be a bug.

+ * + * @param username the plain-text username to look up + * @param password the plain-text password; hashed internally before the query runs + * @return the matching {@link User} with settings and inbox populated, + * or {@code null} if no match is found + * @throws RuntimeException if a {@link SQLException} occurs while executing the query + */ public User getUserFromDBUsernameAndPassword(String username, String password) { PasswordHasher hasher = new PasswordHasher(); String hashedpassword = hasher.getHashPassword(password); @@ -83,6 +119,18 @@ public User getUserFromDBUsernameAndPassword(String username, String password) { return user; } + /** + * Retrieves a single {@link User} from the database by their UUID. + * + *

The returned user is fully populated with {@link Settings} (when present) + * and an {@link Inbox} containing any associated {@link Message} objects. + * Returns {@code null} if no user with the given UUID exists.

+ * + * @param user_id the UUID string of the user to retrieve; must not be {@code null} + * @return the matching {@link User} with settings and inbox populated, + * or {@code null} if no user is found + * @throws RuntimeException if a {@link SQLException} occurs while executing the query + */ public User getUserFromDBUuid(String user_id) { User user = null; Connection conn = null; @@ -146,6 +194,18 @@ public User getUserFromDBUuid(String user_id) { return user; } + /** + * Retrieves all users from the database, each fully populated with their + * {@link Settings} and {@link Inbox}. + * + *

The query LEFT JOINs {@code User}, {@code Settings}, and {@code Messages}. + * Multiple rows for the same user UUID (due to multiple messages) are collapsed + * into a single {@link User} object with all messages appended to its inbox.

+ * + * @return a {@link UserRegistry} containing all users found in the database; + * never {@code null}, but may be empty if no users exist + * @throws RuntimeException if a {@link SQLException} occurs while executing the query + */ public UserRegistry getUsersFromDB() { UserRegistry registry = new UserRegistry(); Connection conn = null; @@ -211,6 +271,17 @@ public UserRegistry getUsersFromDB() { return registry; } + /** + * Retrieves the {@link Settings} for a specific user by their UUID. + * + *

At most one row is fetched (via {@code setMaxRows(1)}). Returns {@code null} + * if no settings row exists for the given user.

+ * + * @param user_id the UUID string of the user whose settings should be retrieved; + * must not be {@code null} + * @return the user's {@link Settings}, or {@code null} if none are found + * @throws RuntimeException if a {@link SQLException} occurs while executing the query + */ public Settings getSettingsForUser(String user_id) { Settings settings = null; Connection conn = null; @@ -243,6 +314,19 @@ public Settings getSettingsForUser(String user_id) { return settings; } + /** + * Retrieves the {@link Inbox} for a specific user by their UUID, populated with + * all of their {@link Message} objects. + * + *

Returns an empty {@link Inbox} (never {@code null}) if no messages exist + * for the given user.

+ * + * @param user_id the UUID string of the user whose inbox should be retrieved; + * must not be {@code null} + * @return an {@link Inbox} containing all messages for the user; + * empty if no messages are found + * @throws RuntimeException if a {@link SQLException} occurs while executing the query + */ public Inbox getInboxForUser(String user_id) { Inbox inbox = new Inbox(); Connection conn = null; diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/UserSelectTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/UserSelectTest.java new file mode 100644 index 0000000..b736459 --- /dev/null +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/UserSelectTest.java @@ -0,0 +1,406 @@ +package ntnu.systemutvikling.team6.database.Readers; + +import ntnu.systemutvikling.team6.database.DatabaseConnection; +import ntnu.systemutvikling.team6.models.UserRegistry; +import ntnu.systemutvikling.team6.models.user.*; + +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.DisplayName; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.extension.ExtendWith; +import org.mockito.Mock; +import org.mockito.junit.jupiter.MockitoExtension; + +import java.sql.*; +import java.util.UUID; + +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +/** + * Unit tests for {@link UserSelect}. + * + *

Uses Mockito to mock the entire JDBC stack ({@link DatabaseConnection}, + * {@link Connection}, {@link Statement}, {@link PreparedStatement}, {@link ResultSet}) + * so that no real database connection is required.

+ */ +@ExtendWith(MockitoExtension.class) +class UserSelectTest { + + @Mock private DatabaseConnection mockDatabaseConnection; + @Mock private Connection mockConnection; + @Mock private Statement mockStatement; + @Mock private PreparedStatement mockPreparedStatement; + @Mock private ResultSet mockResultSet; + + private static final String USER_UUID = "user-uuid-1"; + private static final String CHARITY_UUID = UUID.randomUUID().toString(); + private static final String MESSAGE_UUID = "msg-uuid-1"; + + private UserSelect userSelect; + + @BeforeEach + void setUp() { + userSelect = new UserSelect(mockDatabaseConnection); + } + + // ------------------------------------------------------------------------- + // getUserFromDBUuid + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getUserFromDBUuid – no matching row returns null") + void getUserFromDBUuid_noRow_returnsNull() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertNull(result, "Should return null when no user is found"); + } + + @Test + @DisplayName("getUserFromDBUuid – single row without settings returns User with null settings") + void getUserFromDBUuid_noSettings_userSettingsNull() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCoreUserColumns(); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + when(mockResultSet.getString("UUID_message")).thenReturn(null); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertNotNull(result); + assertNull(result.getSettings(), "Settings should be null when isAnonymous is null"); + assertNotNull(result.getInbox(), "Inbox should always be initialised"); + } + + @Test + @DisplayName("getUserFromDBUuid – single row with settings populates Settings correctly") + void getUserFromDBUuid_withSettings_settingsPopulated() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCoreUserColumns(); + stubSettingsColumns(false, "ENGLISH", true); + when(mockResultSet.getString("UUID_message")).thenReturn(null); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertNotNull(result.getSettings()); + assertFalse(result.getSettings().isAnonymous()); + assertEquals(Language.ENGLISH, result.getSettings().getLanguage()); + assertTrue(result.getSettings().isLightmode()); + } + + @Test + @DisplayName("getUserFromDBUuid – row with a message adds it to the inbox") + void getUserFromDBUuid_withMessage_messageAddedToInbox() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCoreUserColumns(); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + stubMessageColumns(); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertEquals(1, result.getInbox().getMessages().size(), + "Inbox should contain exactly one message"); + } + + @Test + @DisplayName("getUserFromDBUuid – two rows for same UUID adds two messages, one User") + void getUserFromDBUuid_twoRowsSameUuid_oneUserTwoMessages() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("UUID_User")).thenReturn(USER_UUID); + when(mockResultSet.getString("user_name")).thenReturn("Alice"); + when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); + when(mockResultSet.getString("role")).thenReturn("USER"); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + when(mockResultSet.getString("UUID_message")).thenReturn("msg-1", "msg-2"); + when(mockResultSet.getString("message_title")).thenReturn("Title 1", "Title 2"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_content")).thenReturn("Content"); + when(mockResultSet.getString("message_date")).thenReturn("2024-04-01"); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertEquals(2, result.getInbox().getMessages().size()); + } + + @Test + @DisplayName("getUserFromDBUuid – UUID is bound to PreparedStatement parameter 1") + void getUserFromDBUuid_uuidBoundCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + userSelect.getUserFromDBUuid(USER_UUID); + + verify(mockPreparedStatement).setString(1, USER_UUID); + } + + @Test + @DisplayName("getUserFromDBUuid – SQLException is wrapped in RuntimeException") + void getUserFromDBUuid_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenThrow(new SQLException("DB error")); + + assertThrows(RuntimeException.class, () -> userSelect.getUserFromDBUuid(USER_UUID)); + } + + // ------------------------------------------------------------------------- + // getUsersFromDB + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getUsersFromDB – empty result set returns empty registry") + void getUsersFromDB_emptyResultSet_returnsEmptyRegistry() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + UserRegistry registry = userSelect.getUsersFromDB(); + + assertNotNull(registry); + assertTrue(registry.getUsers().isEmpty()); + } + + @Test + @DisplayName("getUsersFromDB – two distinct UUIDs produce two User objects") + void getUsersFromDB_twoDistinctUuids_twoUsersInRegistry() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("UUID_User")).thenReturn("uuid-A", "uuid-B"); + when(mockResultSet.getString("user_name")).thenReturn("Alice", "Bob"); + when(mockResultSet.getString("user_email")).thenReturn("a@x.com", "b@x.com"); + when(mockResultSet.getString("user_password")).thenReturn("pw1", "pw2"); + when(mockResultSet.getString("role")).thenReturn("USER", "ADMIN"); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + when(mockResultSet.getString("UUID_message")).thenReturn(null); + + UserRegistry registry = userSelect.getUsersFromDB(); + + assertEquals(2, registry.getUsers().size()); + } + + @Test + @DisplayName("getUsersFromDB – same UUID across two rows deduplicates to one User") + void getUsersFromDB_sameUuidTwoRows_oneUserWithTwoMessages() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("UUID_User")).thenReturn(USER_UUID); + when(mockResultSet.getString("user_name")).thenReturn("Alice"); + when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); + when(mockResultSet.getString("role")).thenReturn("USER"); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + when(mockResultSet.getString("UUID_message")).thenReturn("msg-1", "msg-2"); + when(mockResultSet.getString("message_title")).thenReturn("T1", "T2"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_content")).thenReturn("Body"); + when(mockResultSet.getString("message_date")).thenReturn("2024-05-01"); + + UserRegistry registry = userSelect.getUsersFromDB(); + + assertEquals(1, registry.getUsers().size(), "Same UUID should not produce duplicate users"); + assertEquals(2, registry.getUsers().get(0).getInbox().getMessages().size()); + } + + @Test + @DisplayName("getUsersFromDB – SQLException is wrapped in RuntimeException") + void getUsersFromDB_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); + + assertThrows(RuntimeException.class, () -> userSelect.getUsersFromDB()); + } + + // ------------------------------------------------------------------------- + // getSettingsForUser + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getSettingsForUser – no row returns null") + void getSettingsForUser_noRow_returnsNull() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + Settings result = userSelect.getSettingsForUser(USER_UUID); + + assertNull(result, "Should return null when no settings row exists"); + } + + @Test + @DisplayName("getSettingsForUser – matching row returns populated Settings") + void getSettingsForUser_matchingRow_returnsSettings() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubSettingsColumns(true, "NORWEGIAN", false); + + Settings result = userSelect.getSettingsForUser(USER_UUID); + + assertNotNull(result); + assertTrue(result.isAnonymous()); + assertEquals(Language.NORWEGIAN, result.getLanguage()); + assertFalse(result.isLightmode()); + } + + @Test + @DisplayName("getSettingsForUser – UUID is bound to PreparedStatement and maxRows set to 1") + void getSettingsForUser_correctBindingAndMaxRows() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + userSelect.getSettingsForUser(USER_UUID); + + verify(mockPreparedStatement).setString(1, USER_UUID); + verify(mockPreparedStatement).setMaxRows(1); + } + + @Test + @DisplayName("getSettingsForUser – SQLException is wrapped in RuntimeException") + void getSettingsForUser_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenThrow(new SQLException("DB error")); + + assertThrows(RuntimeException.class, () -> userSelect.getSettingsForUser(USER_UUID)); + } + + // ------------------------------------------------------------------------- + // getInboxForUser + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getInboxForUser – no messages returns empty Inbox (never null)") + void getInboxForUser_noMessages_returnsEmptyInbox() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + Inbox result = userSelect.getInboxForUser(USER_UUID); + + assertNotNull(result, "Inbox should never be null"); + assertTrue(result.getMessages().isEmpty()); + } + + @Test + @DisplayName("getInboxForUser – one message row returns Inbox with one Message") + void getInboxForUser_oneRow_inboxContainsOneMessage() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + when(mockResultSet.getString("message_title")).thenReturn("Hello"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_date")).thenReturn("2024-06-15"); + + Inbox result = userSelect.getInboxForUser(USER_UUID); + + assertEquals(1, result.getMessages().size()); + assertEquals("Hello", result.getMessages().get(0).getTitle()); + } + + @Test + @DisplayName("getInboxForUser – two message rows returns Inbox with two Messages") + void getInboxForUser_twoRows_inboxContainsTwoMessages() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("message_title")).thenReturn("Msg 1", "Msg 2"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_date")).thenReturn("2024-06-15"); + + Inbox result = userSelect.getInboxForUser(USER_UUID); + + assertEquals(2, result.getMessages().size()); + } + + @Test + @DisplayName("getInboxForUser – UUID is bound to PreparedStatement parameter 1") + void getInboxForUser_uuidBoundCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + userSelect.getInboxForUser(USER_UUID); + + verify(mockPreparedStatement).setString(1, USER_UUID); + } + + @Test + @DisplayName("getInboxForUser – SQLException is wrapped in RuntimeException") + void getInboxForUser_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenThrow(new SQLException("DB error")); + + assertThrows(RuntimeException.class, () -> userSelect.getInboxForUser(USER_UUID)); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + /** Stubs the core User columns on the mock ResultSet. */ + private void stubCoreUserColumns() throws SQLException { + when(mockResultSet.getString("UUID_User")).thenReturn(USER_UUID); + when(mockResultSet.getString("user_name")).thenReturn("Alice"); + when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); + when(mockResultSet.getString("role")).thenReturn("USER"); + } + + /** Stubs the Settings columns on the mock ResultSet. */ + private void stubSettingsColumns(boolean isAnonymous, String language, boolean lightmode) + throws SQLException { + when(mockResultSet.getString("isAnonymous")).thenReturn(String.valueOf(isAnonymous)); + when(mockResultSet.getBoolean("isAnonymous")).thenReturn(isAnonymous); + when(mockResultSet.getString("language")).thenReturn(language); + when(mockResultSet.getBoolean("lightmode")).thenReturn(lightmode); + } + + /** Stubs the Message columns on the mock ResultSet for a single message row. */ + private void stubMessageColumns() throws SQLException { + when(mockResultSet.getString("UUID_message")).thenReturn(MESSAGE_UUID); + when(mockResultSet.getString("message_title")).thenReturn("Test Message"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_content")).thenReturn("Hello!"); + when(mockResultSet.getString("message_date")).thenReturn("2024-03-01"); + } +} \ No newline at end of file From a9d8680f368d69c172566de96906e26e6d0b9a2c Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 12 Apr 2026 22:08:07 +0200 Subject: [PATCH 33/33] Fix: Maven clean and correct functions --- .../database/Readers/DonationSelect.java | 24 +- .../team6/database/Readers/UserSelect.java | 81 +- .../team6/models/user/Language.java | 1 + .../team6/database/DatabaseSetupTest.java | 3 - .../database/Readers/DonationSelectTest.java | 396 +++++---- .../database/Readers/UserSelectTest.java | 772 +++++++++--------- 6 files changed, 632 insertions(+), 645 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java index 075e0d0..26690ab 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java @@ -12,11 +12,10 @@ /** * Data access class responsible for reading donation data from the database. * - *

Retrieves donations along with their associated charity information by - * performing an INNER JOIN between the {@code Donations} and {@code Charities} tables. - * Only donations that have a matching charity record are returned.

+ *

Retrieves donations along with their associated charity information by performing an INNER + * JOIN between the {@code Donations} and {@code Charities} tables. Only donations that have a + * matching charity record are returned. */ - public class DonationSelect { /** The database connection used for all queries in this class. */ @@ -25,23 +24,22 @@ public class DonationSelect { /** * Constructs a new {@code DonationSelect} with the given database connection. * - * @param connection the {@link DatabaseConnection} to use for executing queries; - * must not be {@code null} + * @param connection the {@link DatabaseConnection} to use for executing queries; must not be + * {@code null} */ public DonationSelect(DatabaseConnection connection) { this.connection = connection; } /** - * Retrieves all donations from the database, each populated with its associated - * {@link Charity}. + * Retrieves all donations from the database, each populated with its associated {@link Charity}. * - *

The query performs an INNER JOIN between the {@code Donations} and - * {@code Charities} tables on the charity UUID foreign key. Donations without a - * matching charity are excluded from the result.

+ *

The query performs an INNER JOIN between the {@code Donations} and {@code Charities} tables + * on the charity UUID foreign key. Donations without a matching charity are excluded from the + * result. * - * @return a {@link DonationRegistry} containing all matched donations; - * never {@code null}, but may be empty if no rows are returned + * @return a {@link DonationRegistry} containing all matched donations; never {@code null}, but + * may be empty if no rows are returned * @throws RuntimeException if a {@link SQLException} occurs while executing the query */ public DonationRegistry getDonationFromDB() { diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java index 36d2f0b..ce41742 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java @@ -11,13 +11,11 @@ /** * Data access class responsible for reading user-related data from the database. * - *

Provides methods to retrieve individual users (by credentials or UUID), - * all users, a user's settings, and a user's inbox. Queries use LEFT JOINs - * across the {@code User}, {@code Settings}, and {@code Messages} tables to - * assemble fully populated {@link User} objects in a single round trip where - * possible.

+ *

Provides methods to retrieve individual users (by credentials or UUID), all users, a user's + * settings, and a user's inbox. Queries use LEFT JOINs across the {@code User}, {@code Settings}, + * and {@code Messages} tables to assemble fully populated {@link User} objects in a single round + * trip where possible. */ - public class UserSelect { /** The database connection used for all queries in this class. */ private final DatabaseConnection connection; @@ -25,30 +23,29 @@ public class UserSelect { /** * Constructs a new {@code UserSelect} with the given database connection. * - * @param connection the {@link DatabaseConnection} to use for executing queries; - * must not be {@code null} + * @param connection the {@link DatabaseConnection} to use for executing queries; must not be + * {@code null} */ public UserSelect(DatabaseConnection connection) { this.connection = connection; } /** - * Retrieves a single {@link User} from the database matching the given username - * and password. + * Retrieves a single {@link User} from the database matching the given username and password. * - *

The password is hashed via {@link PasswordHasher} before being compared - * against the stored value. If a matching user is found, their {@link Settings} - * (when present) and {@link Inbox} (including any {@link Message} objects) are - * also populated. Returns {@code null} if no matching user is found.

+ *

The password is hashed via {@link PasswordHasher} before being compared against the stored + * value. If a matching user is found, their {@link Settings} (when present) and {@link Inbox} + * (including any {@link Message} objects) are also populated. Returns {@code null} if no matching + * user is found. * - *

Note: the current SQL query compares both parameters against - * {@code user_password}; the {@code user_name} column is not yet included in the - * WHERE clause, which may be a bug.

+ *

Note: the current SQL query compares both parameters against {@code + * user_password}; the {@code user_name} column is not yet included in the WHERE clause, which may + * be a bug. * * @param username the plain-text username to look up * @param password the plain-text password; hashed internally before the query runs - * @return the matching {@link User} with settings and inbox populated, - * or {@code null} if no match is found + * @return the matching {@link User} with settings and inbox populated, or {@code null} if no + * match is found * @throws RuntimeException if a {@link SQLException} occurs while executing the query */ public User getUserFromDBUsernameAndPassword(String username, String password) { @@ -122,13 +119,13 @@ public User getUserFromDBUsernameAndPassword(String username, String password) { /** * Retrieves a single {@link User} from the database by their UUID. * - *

The returned user is fully populated with {@link Settings} (when present) - * and an {@link Inbox} containing any associated {@link Message} objects. - * Returns {@code null} if no user with the given UUID exists.

+ *

The returned user is fully populated with {@link Settings} (when present) and an {@link + * Inbox} containing any associated {@link Message} objects. Returns {@code null} if no user with + * the given UUID exists. * * @param user_id the UUID string of the user to retrieve; must not be {@code null} - * @return the matching {@link User} with settings and inbox populated, - * or {@code null} if no user is found + * @return the matching {@link User} with settings and inbox populated, or {@code null} if no user + * is found * @throws RuntimeException if a {@link SQLException} occurs while executing the query */ public User getUserFromDBUuid(String user_id) { @@ -195,15 +192,15 @@ public User getUserFromDBUuid(String user_id) { } /** - * Retrieves all users from the database, each fully populated with their - * {@link Settings} and {@link Inbox}. + * Retrieves all users from the database, each fully populated with their {@link Settings} and + * {@link Inbox}. * - *

The query LEFT JOINs {@code User}, {@code Settings}, and {@code Messages}. - * Multiple rows for the same user UUID (due to multiple messages) are collapsed - * into a single {@link User} object with all messages appended to its inbox.

+ *

The query LEFT JOINs {@code User}, {@code Settings}, and {@code Messages}. Multiple rows for + * the same user UUID (due to multiple messages) are collapsed into a single {@link User} object + * with all messages appended to its inbox. * - * @return a {@link UserRegistry} containing all users found in the database; - * never {@code null}, but may be empty if no users exist + * @return a {@link UserRegistry} containing all users found in the database; never {@code null}, + * but may be empty if no users exist * @throws RuntimeException if a {@link SQLException} occurs while executing the query */ public UserRegistry getUsersFromDB() { @@ -274,11 +271,11 @@ public UserRegistry getUsersFromDB() { /** * Retrieves the {@link Settings} for a specific user by their UUID. * - *

At most one row is fetched (via {@code setMaxRows(1)}). Returns {@code null} - * if no settings row exists for the given user.

+ *

At most one row is fetched (via {@code setMaxRows(1)}). Returns {@code null} if no settings + * row exists for the given user. * - * @param user_id the UUID string of the user whose settings should be retrieved; - * must not be {@code null} + * @param user_id the UUID string of the user whose settings should be retrieved; must not be + * {@code null} * @return the user's {@link Settings}, or {@code null} if none are found * @throws RuntimeException if a {@link SQLException} occurs while executing the query */ @@ -315,16 +312,14 @@ public Settings getSettingsForUser(String user_id) { } /** - * Retrieves the {@link Inbox} for a specific user by their UUID, populated with - * all of their {@link Message} objects. + * Retrieves the {@link Inbox} for a specific user by their UUID, populated with all of their + * {@link Message} objects. * - *

Returns an empty {@link Inbox} (never {@code null}) if no messages exist - * for the given user.

+ *

Returns an empty {@link Inbox} (never {@code null}) if no messages exist for the given user. * - * @param user_id the UUID string of the user whose inbox should be retrieved; - * must not be {@code null} - * @return an {@link Inbox} containing all messages for the user; - * empty if no messages are found + * @param user_id the UUID string of the user whose inbox should be retrieved; must not be {@code + * null} + * @return an {@link Inbox} containing all messages for the user; empty if no messages are found * @throws RuntimeException if a {@link SQLException} occurs while executing the query */ public Inbox getInboxForUser(String user_id) { diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Language.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Language.java index c568ede..cbd66cf 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Language.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/Language.java @@ -6,5 +6,6 @@ * @author Robin Strand Prestmo */ public enum Language { + NORWEGIAN, ENGLISH } diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseSetupTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseSetupTest.java index 4501cd8..809d251 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseSetupTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DatabaseSetupTest.java @@ -3,12 +3,10 @@ import static org.junit.jupiter.api.Assertions.*; import java.sql.*; -import java.util.ArrayList; import java.util.List; import ntnu.systemutvikling.team6.database.Readers.CharitySelect; import ntnu.systemutvikling.team6.database.Readers.DonationSelect; import ntnu.systemutvikling.team6.models.Charity; -import ntnu.systemutvikling.team6.models.CharityRegistry; import ntnu.systemutvikling.team6.service.APIToDatabaseService; import org.junit.jupiter.api.*; @@ -45,7 +43,6 @@ void createCharitiesTableShouldCreateTableSuccessfully() throws SQLException { } } - @Test void tempTableShouldNotExistAfterUpdating() throws SQLException { Charity charity = new Charity("99999", "https://temp.no", "Temp Charity", false, "approved"); diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/DonationSelectTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/DonationSelectTest.java index f7d8b36..5c3545c 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/DonationSelectTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/DonationSelectTest.java @@ -1,9 +1,14 @@ package ntnu.systemutvikling.team6.database.Readers; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +import java.sql.*; +import java.time.LocalDate; import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.models.Donation; import ntnu.systemutvikling.team6.models.DonationRegistry; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -11,208 +16,201 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.sql.*; -import java.time.LocalDate; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - /** * Unit tests for {@link DonationSelect}. * - *

Uses Mockito to mock the entire JDBC stack so no real database - * connection is required.

+ *

Uses Mockito to mock the entire JDBC stack so no real database connection is required. */ @ExtendWith(MockitoExtension.class) class DonationSelectTest { - @Mock private DatabaseConnection mockDatabaseConnection; - @Mock private Connection mockConnection; - @Mock private Statement mockStatement; - @Mock private ResultSet mockResultSet; - @Mock private Date mockSqlDate; - - private DonationSelect donationSelect; - - @BeforeEach - void setUp() { - donationSelect = new DonationSelect(mockDatabaseConnection); - } - - // ------------------------------------------------------------------------- - // getDonationFromDB - // ------------------------------------------------------------------------- - - @Test - @DisplayName("getDonationFromDB – empty result set returns an empty registry") - void getDonationFromDB_emptyResultSet_returnsEmptyRegistry() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenReturn(mockStatement); - when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); - when(mockResultSet.next()).thenReturn(false); - - DonationRegistry registry = donationSelect.getDonationFromDB(); - - assertNotNull(registry); - assertTrue(registry.getDonations().isEmpty(), - "Registry should be empty when the result set has no rows"); - } - - @Test - @DisplayName("getDonationFromDB – single row returns one Donation with correct data") - void getDonationFromDB_singleRow_returnsSingleDonation() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenReturn(mockStatement); - when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, false); - stubCharityColumns("charity-uuid-1", "123456789", "Test Charity", - "https://example.org", true, "ACTIVE"); - stubDonationColumns("donation-uuid-1", 250.0, LocalDate.of(2024, 5, 20)); - - DonationRegistry registry = donationSelect.getDonationFromDB(); - - assertEquals(1, registry.getDonations().size()); - Donation donation = registry.getDonations().get(0); - assertEquals("donation-uuid-1", donation.getUUID()); - assertEquals(250.0, donation.getAmount()); - assertEquals(LocalDate.of(2024, 5, 20), donation.getDate()); - } - - @Test - @DisplayName("getDonationFromDB – single row maps charity fields onto the Donation correctly") - void getDonationFromDB_singleRow_charityMappedCorrectly() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenReturn(mockStatement); - when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, false); - stubCharityColumns("charity-uuid-1", "987654321", "Help Fund", - "https://helpfund.org", false, "PENDING"); - stubDonationColumns("donation-uuid-1", 100.0, LocalDate.of(2024, 1, 1)); - - DonationRegistry registry = donationSelect.getDonationFromDB(); - - Donation donation = registry.getDonations().get(0); - assertEquals("charity-uuid-1", donation.getCharity().getUUID()); - assertEquals("987654321", donation.getCharity().getOrgNumber()); - assertEquals("Help Fund", donation.getCharity().getCharityName()); - assertEquals("https://helpfund.org", donation.getCharity().getCharityLink()); - assertFalse(donation.getCharity().isPreApproved()); - assertEquals("PENDING", donation.getCharity().getStatus()); - } - - @Test - @DisplayName("getDonationFromDB – two rows returns two Donation objects") - void getDonationFromDB_twoRows_returnsTwoDonations() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenReturn(mockStatement); - when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, true, false); - - when(mockResultSet.getString("UUID_charities")).thenReturn("charity-uuid-1", "charity-uuid-2"); - when(mockResultSet.getString("org_number")).thenReturn("111111111", "222222222"); - when(mockResultSet.getString("charity_name")).thenReturn("Charity A", "Charity B"); - when(mockResultSet.getString("charity_link")).thenReturn("https://a.org", "https://b.org"); - when(mockResultSet.getBoolean("pre_approved")).thenReturn(true, false); - when(mockResultSet.getString("status")).thenReturn("ACTIVE", "INACTIVE"); - - when(mockResultSet.getString("UUID_Donations")).thenReturn("donation-uuid-1", "donation-uuid-2"); - when(mockResultSet.getDouble("amount")).thenReturn(500.0, 750.0); - - Date sqlDate = Date.valueOf(LocalDate.of(2024, 8, 10)); - when(mockResultSet.getDate("date")).thenReturn(sqlDate); - - DonationRegistry registry = donationSelect.getDonationFromDB(); - - assertEquals(2, registry.getDonations().size(), - "Registry should contain two donations for two result rows"); - } - - @Test - @DisplayName("getDonationFromDB – donation amount of zero is stored correctly") - void getDonationFromDB_zeroAmount_storedCorrectly() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenReturn(mockStatement); - when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, false); - stubCharityColumns("charity-uuid-1", "123456789", "Test Charity", - "https://example.org", true, "ACTIVE"); - stubDonationColumns("donation-uuid-zero", 0.0, LocalDate.of(2024, 1, 1)); - - DonationRegistry registry = donationSelect.getDonationFromDB(); - - assertEquals(0.0, registry.getDonations().get(0).getAmount()); - } - - @Test - @DisplayName("getDonationFromDB – large donation amount is stored correctly") - void getDonationFromDB_largeAmount_storedCorrectly() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenReturn(mockStatement); - when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, false); - stubCharityColumns("charity-uuid-1", "123456789", "Test Charity", - "https://example.org", true, "ACTIVE"); - stubDonationColumns("donation-uuid-big", 1_000_000.99, LocalDate.of(2024, 12, 31)); - - DonationRegistry registry = donationSelect.getDonationFromDB(); - - assertEquals(1_000_000.99, registry.getDonations().get(0).getAmount(), 0.001); - } - - @Test - @DisplayName("getDonationFromDB – SQLException is wrapped in RuntimeException") - void getDonationFromDB_sqlException_throwsRuntimeException() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); - - assertThrows(RuntimeException.class, () -> donationSelect.getDonationFromDB(), - "A SQLException should be rethrown as a RuntimeException"); - } - - @Test - @DisplayName("getDonationFromDB – RuntimeException message contains expected error text") - void getDonationFromDB_sqlException_runtimeExceptionHasExpectedMessage() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); - - RuntimeException ex = assertThrows(RuntimeException.class, - () -> donationSelect.getDonationFromDB()); - assertTrue(ex.getMessage().contains("ERROR"), - "RuntimeException message should contain 'ERROR'"); - } - - // ------------------------------------------------------------------------- - // Helpers - // ------------------------------------------------------------------------- - - /** - * Stubs all charity-related columns on the mock ResultSet. - */ - private void stubCharityColumns(String uuid, String orgNumber, String name, - String link, boolean preApproved, String status) - throws SQLException { - when(mockResultSet.getString("UUID_charities")).thenReturn(uuid); - when(mockResultSet.getString("org_number")).thenReturn(orgNumber); - when(mockResultSet.getString("charity_name")).thenReturn(name); - when(mockResultSet.getString("charity_link")).thenReturn(link); - when(mockResultSet.getBoolean("pre_approved")).thenReturn(preApproved); - when(mockResultSet.getString("status")).thenReturn(status); - } - - /** - * Stubs all donation-related columns on the mock ResultSet. - */ - private void stubDonationColumns(String uuid, double amount, LocalDate date) - throws SQLException { - when(mockResultSet.getString("UUID_Donations")).thenReturn(uuid); - when(mockResultSet.getDouble("amount")).thenReturn(amount); - Date sqlDate = Date.valueOf(date); - when(mockResultSet.getDate("date")).thenReturn(sqlDate); - } -} \ No newline at end of file + @Mock private DatabaseConnection mockDatabaseConnection; + @Mock private Connection mockConnection; + @Mock private Statement mockStatement; + @Mock private ResultSet mockResultSet; + @Mock private Date mockSqlDate; + + private DonationSelect donationSelect; + + @BeforeEach + void setUp() { + donationSelect = new DonationSelect(mockDatabaseConnection); + } + + // ------------------------------------------------------------------------- + // getDonationFromDB + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getDonationFromDB – empty result set returns an empty registry") + void getDonationFromDB_emptyResultSet_returnsEmptyRegistry() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertNotNull(registry); + assertTrue( + registry.getAllDonations().isEmpty(), + "Registry should be empty when the result set has no rows"); + } + + @Test + @DisplayName("getDonationFromDB – single row returns one Donation with correct data") + void getDonationFromDB_singleRow_returnsSingleDonation() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCharityColumns( + "charity-uuid-1", "123456789", "Test Charity", "https://example.org", true, "ACTIVE"); + stubDonationColumns("donation-uuid-1", 250.0, LocalDate.of(2024, 5, 20)); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertEquals(1, registry.getAllDonations().size()); + Donation donation = registry.getAllDonations().get(0); + assertEquals("donation-uuid-1", donation.getCharityId()); + assertEquals(250.0, donation.getAmount()); + assertEquals(LocalDate.of(2024, 5, 20), donation.getDate()); + } + + @Test + @DisplayName("getDonationFromDB – single row maps charity fields onto the Donation correctly") + void getDonationFromDB_singleRow_charityMappedCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCharityColumns( + "charity-uuid-1", "987654321", "Help Fund", "https://helpfund.org", false, "PENDING"); + stubDonationColumns("donation-uuid-1", 100.0, LocalDate.of(2024, 1, 1)); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + Donation donation = registry.getAllDonations().get(0); + assertEquals("charity-uuid-1", donation.getCharity().getUUID()); + assertEquals("987654321", donation.getCharity().getOrg_number()); + assertEquals("Help Fund", donation.getCharity().getName()); + assertEquals("https://helpfund.org", donation.getCharity().getDescription()); + assertFalse(donation.getCharity().getPreApproved()); + assertEquals("PENDING", donation.getCharity().getStatus()); + } + + @Test + @DisplayName("getDonationFromDB – two rows returns two Donation objects") + void getDonationFromDB_twoRows_returnsTwoDonations() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + + when(mockResultSet.getString("UUID_charities")).thenReturn("charity-uuid-1", "charity-uuid-2"); + when(mockResultSet.getString("org_number")).thenReturn("111111111", "222222222"); + when(mockResultSet.getString("charity_name")).thenReturn("Charity A", "Charity B"); + when(mockResultSet.getString("charity_link")).thenReturn("https://a.org", "https://b.org"); + when(mockResultSet.getBoolean("pre_approved")).thenReturn(true, false); + when(mockResultSet.getString("status")).thenReturn("ACTIVE", "INACTIVE"); + + when(mockResultSet.getString("UUID_Donations")) + .thenReturn("donation-uuid-1", "donation-uuid-2"); + when(mockResultSet.getDouble("amount")).thenReturn(500.0, 750.0); + + Date sqlDate = Date.valueOf(LocalDate.of(2024, 8, 10)); + when(mockResultSet.getDate("date")).thenReturn(sqlDate); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertEquals( + 2, + registry.getAllDonations().size(), + "Registry should contain two donations for two result rows"); + } + + @Test + @DisplayName("getDonationFromDB – donation amount of zero is stored correctly") + void getDonationFromDB_zeroAmount_storedCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCharityColumns( + "charity-uuid-1", "123456789", "Test Charity", "https://example.org", true, "ACTIVE"); + stubDonationColumns("donation-uuid-zero", 0.0, LocalDate.of(2024, 1, 1)); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertEquals(0.0, registry.getAllDonations().get(0).getAmount()); + } + + @Test + @DisplayName("getDonationFromDB – large donation amount is stored correctly") + void getDonationFromDB_largeAmount_storedCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCharityColumns( + "charity-uuid-1", "123456789", "Test Charity", "https://example.org", true, "ACTIVE"); + stubDonationColumns("donation-uuid-big", 1_000_000.99, LocalDate.of(2024, 12, 31)); + + DonationRegistry registry = donationSelect.getDonationFromDB(); + + assertEquals(1_000_000.99, registry.getAllDonations().get(0).getAmount(), 0.001); + } + + @Test + @DisplayName("getDonationFromDB – SQLException is wrapped in RuntimeException") + void getDonationFromDB_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); + + assertThrows( + RuntimeException.class, + () -> donationSelect.getDonationFromDB(), + "A SQLException should be rethrown as a RuntimeException"); + } + + @Test + @DisplayName("getDonationFromDB – RuntimeException message contains expected error text") + void getDonationFromDB_sqlException_runtimeExceptionHasExpectedMessage() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); + + RuntimeException ex = + assertThrows(RuntimeException.class, () -> donationSelect.getDonationFromDB()); + assertTrue( + ex.getMessage().contains("ERROR"), "RuntimeException message should contain 'ERROR'"); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + /** Stubs all charity-related columns on the mock ResultSet. */ + private void stubCharityColumns( + String uuid, String orgNumber, String name, String link, boolean preApproved, String status) + throws SQLException { + when(mockResultSet.getString("UUID_charities")).thenReturn(uuid); + when(mockResultSet.getString("org_number")).thenReturn(orgNumber); + when(mockResultSet.getString("charity_name")).thenReturn(name); + when(mockResultSet.getString("charity_link")).thenReturn(link); + when(mockResultSet.getBoolean("pre_approved")).thenReturn(preApproved); + when(mockResultSet.getString("status")).thenReturn(status); + } + + /** Stubs all donation-related columns on the mock ResultSet. */ + private void stubDonationColumns(String uuid, double amount, LocalDate date) throws SQLException { + when(mockResultSet.getString("UUID_Donations")).thenReturn(uuid); + when(mockResultSet.getDouble("amount")).thenReturn(amount); + Date sqlDate = Date.valueOf(date); + when(mockResultSet.getDate("date")).thenReturn(sqlDate); + } +} diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/UserSelectTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/UserSelectTest.java index b736459..5394fa1 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/UserSelectTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/Readers/UserSelectTest.java @@ -1,9 +1,14 @@ package ntnu.systemutvikling.team6.database.Readers; +import static org.junit.jupiter.api.Assertions.*; +import static org.mockito.ArgumentMatchers.anyString; +import static org.mockito.Mockito.*; + +import java.sql.*; +import java.util.UUID; import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.models.UserRegistry; import ntnu.systemutvikling.team6.models.user.*; - import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.DisplayName; import org.junit.jupiter.api.Test; @@ -11,396 +16,389 @@ import org.mockito.Mock; import org.mockito.junit.jupiter.MockitoExtension; -import java.sql.*; -import java.util.UUID; - -import static org.junit.jupiter.api.Assertions.*; -import static org.mockito.ArgumentMatchers.anyString; -import static org.mockito.Mockito.*; - /** * Unit tests for {@link UserSelect}. * - *

Uses Mockito to mock the entire JDBC stack ({@link DatabaseConnection}, - * {@link Connection}, {@link Statement}, {@link PreparedStatement}, {@link ResultSet}) - * so that no real database connection is required.

+ *

Uses Mockito to mock the entire JDBC stack ({@link DatabaseConnection}, {@link Connection}, + * {@link Statement}, {@link PreparedStatement}, {@link ResultSet}) so that no real database + * connection is required. */ @ExtendWith(MockitoExtension.class) class UserSelectTest { - @Mock private DatabaseConnection mockDatabaseConnection; - @Mock private Connection mockConnection; - @Mock private Statement mockStatement; - @Mock private PreparedStatement mockPreparedStatement; - @Mock private ResultSet mockResultSet; - - private static final String USER_UUID = "user-uuid-1"; - private static final String CHARITY_UUID = UUID.randomUUID().toString(); - private static final String MESSAGE_UUID = "msg-uuid-1"; - - private UserSelect userSelect; - - @BeforeEach - void setUp() { - userSelect = new UserSelect(mockDatabaseConnection); - } - - // ------------------------------------------------------------------------- - // getUserFromDBUuid - // ------------------------------------------------------------------------- - - @Test - @DisplayName("getUserFromDBUuid – no matching row returns null") - void getUserFromDBUuid_noRow_returnsNull() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - when(mockResultSet.next()).thenReturn(false); - - User result = userSelect.getUserFromDBUuid(USER_UUID); - - assertNull(result, "Should return null when no user is found"); - } - - @Test - @DisplayName("getUserFromDBUuid – single row without settings returns User with null settings") - void getUserFromDBUuid_noSettings_userSettingsNull() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, false); - stubCoreUserColumns(); - when(mockResultSet.getString("isAnonymous")).thenReturn(null); - when(mockResultSet.getString("UUID_message")).thenReturn(null); - - User result = userSelect.getUserFromDBUuid(USER_UUID); - - assertNotNull(result); - assertNull(result.getSettings(), "Settings should be null when isAnonymous is null"); - assertNotNull(result.getInbox(), "Inbox should always be initialised"); - } - - @Test - @DisplayName("getUserFromDBUuid – single row with settings populates Settings correctly") - void getUserFromDBUuid_withSettings_settingsPopulated() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, false); - stubCoreUserColumns(); - stubSettingsColumns(false, "ENGLISH", true); - when(mockResultSet.getString("UUID_message")).thenReturn(null); - - User result = userSelect.getUserFromDBUuid(USER_UUID); - - assertNotNull(result.getSettings()); - assertFalse(result.getSettings().isAnonymous()); - assertEquals(Language.ENGLISH, result.getSettings().getLanguage()); - assertTrue(result.getSettings().isLightmode()); - } - - @Test - @DisplayName("getUserFromDBUuid – row with a message adds it to the inbox") - void getUserFromDBUuid_withMessage_messageAddedToInbox() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, false); - stubCoreUserColumns(); - when(mockResultSet.getString("isAnonymous")).thenReturn(null); - stubMessageColumns(); - - User result = userSelect.getUserFromDBUuid(USER_UUID); - - assertEquals(1, result.getInbox().getMessages().size(), - "Inbox should contain exactly one message"); - } - - @Test - @DisplayName("getUserFromDBUuid – two rows for same UUID adds two messages, one User") - void getUserFromDBUuid_twoRowsSameUuid_oneUserTwoMessages() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, true, false); - when(mockResultSet.getString("UUID_User")).thenReturn(USER_UUID); - when(mockResultSet.getString("user_name")).thenReturn("Alice"); - when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); - when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); - when(mockResultSet.getString("role")).thenReturn("USER"); - when(mockResultSet.getString("isAnonymous")).thenReturn(null); - when(mockResultSet.getString("UUID_message")).thenReturn("msg-1", "msg-2"); - when(mockResultSet.getString("message_title")).thenReturn("Title 1", "Title 2"); - when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); - when(mockResultSet.getString("message_content")).thenReturn("Content"); - when(mockResultSet.getString("message_date")).thenReturn("2024-04-01"); - - User result = userSelect.getUserFromDBUuid(USER_UUID); - - assertEquals(2, result.getInbox().getMessages().size()); - } - - @Test - @DisplayName("getUserFromDBUuid – UUID is bound to PreparedStatement parameter 1") - void getUserFromDBUuid_uuidBoundCorrectly() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - when(mockResultSet.next()).thenReturn(false); - - userSelect.getUserFromDBUuid(USER_UUID); - - verify(mockPreparedStatement).setString(1, USER_UUID); - } - - @Test - @DisplayName("getUserFromDBUuid – SQLException is wrapped in RuntimeException") - void getUserFromDBUuid_sqlException_throwsRuntimeException() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenThrow(new SQLException("DB error")); - - assertThrows(RuntimeException.class, () -> userSelect.getUserFromDBUuid(USER_UUID)); - } - - // ------------------------------------------------------------------------- - // getUsersFromDB - // ------------------------------------------------------------------------- - - @Test - @DisplayName("getUsersFromDB – empty result set returns empty registry") - void getUsersFromDB_emptyResultSet_returnsEmptyRegistry() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenReturn(mockStatement); - when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); - when(mockResultSet.next()).thenReturn(false); - - UserRegistry registry = userSelect.getUsersFromDB(); - - assertNotNull(registry); - assertTrue(registry.getUsers().isEmpty()); - } - - @Test - @DisplayName("getUsersFromDB – two distinct UUIDs produce two User objects") - void getUsersFromDB_twoDistinctUuids_twoUsersInRegistry() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenReturn(mockStatement); - when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, true, false); - when(mockResultSet.getString("UUID_User")).thenReturn("uuid-A", "uuid-B"); - when(mockResultSet.getString("user_name")).thenReturn("Alice", "Bob"); - when(mockResultSet.getString("user_email")).thenReturn("a@x.com", "b@x.com"); - when(mockResultSet.getString("user_password")).thenReturn("pw1", "pw2"); - when(mockResultSet.getString("role")).thenReturn("USER", "ADMIN"); - when(mockResultSet.getString("isAnonymous")).thenReturn(null); - when(mockResultSet.getString("UUID_message")).thenReturn(null); - - UserRegistry registry = userSelect.getUsersFromDB(); - - assertEquals(2, registry.getUsers().size()); - } - - @Test - @DisplayName("getUsersFromDB – same UUID across two rows deduplicates to one User") - void getUsersFromDB_sameUuidTwoRows_oneUserWithTwoMessages() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenReturn(mockStatement); - when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, true, false); - when(mockResultSet.getString("UUID_User")).thenReturn(USER_UUID); - when(mockResultSet.getString("user_name")).thenReturn("Alice"); - when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); - when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); - when(mockResultSet.getString("role")).thenReturn("USER"); - when(mockResultSet.getString("isAnonymous")).thenReturn(null); - when(mockResultSet.getString("UUID_message")).thenReturn("msg-1", "msg-2"); - when(mockResultSet.getString("message_title")).thenReturn("T1", "T2"); - when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); - when(mockResultSet.getString("message_content")).thenReturn("Body"); - when(mockResultSet.getString("message_date")).thenReturn("2024-05-01"); - - UserRegistry registry = userSelect.getUsersFromDB(); - - assertEquals(1, registry.getUsers().size(), "Same UUID should not produce duplicate users"); - assertEquals(2, registry.getUsers().get(0).getInbox().getMessages().size()); - } - - @Test - @DisplayName("getUsersFromDB – SQLException is wrapped in RuntimeException") - void getUsersFromDB_sqlException_throwsRuntimeException() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); - - assertThrows(RuntimeException.class, () -> userSelect.getUsersFromDB()); - } - - // ------------------------------------------------------------------------- - // getSettingsForUser - // ------------------------------------------------------------------------- - - @Test - @DisplayName("getSettingsForUser – no row returns null") - void getSettingsForUser_noRow_returnsNull() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - when(mockResultSet.next()).thenReturn(false); - - Settings result = userSelect.getSettingsForUser(USER_UUID); - - assertNull(result, "Should return null when no settings row exists"); - } - - @Test - @DisplayName("getSettingsForUser – matching row returns populated Settings") - void getSettingsForUser_matchingRow_returnsSettings() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, false); - stubSettingsColumns(true, "NORWEGIAN", false); - - Settings result = userSelect.getSettingsForUser(USER_UUID); - - assertNotNull(result); - assertTrue(result.isAnonymous()); - assertEquals(Language.NORWEGIAN, result.getLanguage()); - assertFalse(result.isLightmode()); - } - - @Test - @DisplayName("getSettingsForUser – UUID is bound to PreparedStatement and maxRows set to 1") - void getSettingsForUser_correctBindingAndMaxRows() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - when(mockResultSet.next()).thenReturn(false); - - userSelect.getSettingsForUser(USER_UUID); - - verify(mockPreparedStatement).setString(1, USER_UUID); - verify(mockPreparedStatement).setMaxRows(1); - } - - @Test - @DisplayName("getSettingsForUser – SQLException is wrapped in RuntimeException") - void getSettingsForUser_sqlException_throwsRuntimeException() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenThrow(new SQLException("DB error")); - - assertThrows(RuntimeException.class, () -> userSelect.getSettingsForUser(USER_UUID)); - } - - // ------------------------------------------------------------------------- - // getInboxForUser - // ------------------------------------------------------------------------- - - @Test - @DisplayName("getInboxForUser – no messages returns empty Inbox (never null)") - void getInboxForUser_noMessages_returnsEmptyInbox() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - when(mockResultSet.next()).thenReturn(false); - - Inbox result = userSelect.getInboxForUser(USER_UUID); - - assertNotNull(result, "Inbox should never be null"); - assertTrue(result.getMessages().isEmpty()); - } - - @Test - @DisplayName("getInboxForUser – one message row returns Inbox with one Message") - void getInboxForUser_oneRow_inboxContainsOneMessage() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, false); - when(mockResultSet.getString("message_title")).thenReturn("Hello"); - when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); - when(mockResultSet.getString("message_date")).thenReturn("2024-06-15"); - - Inbox result = userSelect.getInboxForUser(USER_UUID); - - assertEquals(1, result.getMessages().size()); - assertEquals("Hello", result.getMessages().get(0).getTitle()); - } - - @Test - @DisplayName("getInboxForUser – two message rows returns Inbox with two Messages") - void getInboxForUser_twoRows_inboxContainsTwoMessages() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - - when(mockResultSet.next()).thenReturn(true, true, false); - when(mockResultSet.getString("message_title")).thenReturn("Msg 1", "Msg 2"); - when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); - when(mockResultSet.getString("message_date")).thenReturn("2024-06-15"); - - Inbox result = userSelect.getInboxForUser(USER_UUID); - - assertEquals(2, result.getMessages().size()); - } - - @Test - @DisplayName("getInboxForUser – UUID is bound to PreparedStatement parameter 1") - void getInboxForUser_uuidBoundCorrectly() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); - when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); - when(mockResultSet.next()).thenReturn(false); - - userSelect.getInboxForUser(USER_UUID); - - verify(mockPreparedStatement).setString(1, USER_UUID); - } - - @Test - @DisplayName("getInboxForUser – SQLException is wrapped in RuntimeException") - void getInboxForUser_sqlException_throwsRuntimeException() throws Exception { - when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); - when(mockConnection.prepareStatement(anyString())).thenThrow(new SQLException("DB error")); - - assertThrows(RuntimeException.class, () -> userSelect.getInboxForUser(USER_UUID)); - } - - // ------------------------------------------------------------------------- - // Helpers - // ------------------------------------------------------------------------- - - /** Stubs the core User columns on the mock ResultSet. */ - private void stubCoreUserColumns() throws SQLException { - when(mockResultSet.getString("UUID_User")).thenReturn(USER_UUID); - when(mockResultSet.getString("user_name")).thenReturn("Alice"); - when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); - when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); - when(mockResultSet.getString("role")).thenReturn("USER"); - } - - /** Stubs the Settings columns on the mock ResultSet. */ - private void stubSettingsColumns(boolean isAnonymous, String language, boolean lightmode) - throws SQLException { - when(mockResultSet.getString("isAnonymous")).thenReturn(String.valueOf(isAnonymous)); - when(mockResultSet.getBoolean("isAnonymous")).thenReturn(isAnonymous); - when(mockResultSet.getString("language")).thenReturn(language); - when(mockResultSet.getBoolean("lightmode")).thenReturn(lightmode); - } - - /** Stubs the Message columns on the mock ResultSet for a single message row. */ - private void stubMessageColumns() throws SQLException { - when(mockResultSet.getString("UUID_message")).thenReturn(MESSAGE_UUID); - when(mockResultSet.getString("message_title")).thenReturn("Test Message"); - when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); - when(mockResultSet.getString("message_content")).thenReturn("Hello!"); - when(mockResultSet.getString("message_date")).thenReturn("2024-03-01"); - } -} \ No newline at end of file + @Mock private DatabaseConnection mockDatabaseConnection; + @Mock private Connection mockConnection; + @Mock private Statement mockStatement; + @Mock private PreparedStatement mockPreparedStatement; + @Mock private ResultSet mockResultSet; + + private static final String USER_UUID = "user-uuid-1"; + private static final String CHARITY_UUID = UUID.randomUUID().toString(); + private static final String MESSAGE_UUID = "msg-uuid-1"; + + private UserSelect userSelect; + + @BeforeEach + void setUp() { + userSelect = new UserSelect(mockDatabaseConnection); + } + + // ------------------------------------------------------------------------- + // getUserFromDBUuid + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getUserFromDBUuid – no matching row returns null") + void getUserFromDBUuid_noRow_returnsNull() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertNull(result, "Should return null when no user is found"); + } + + @Test + @DisplayName("getUserFromDBUuid – single row without settings returns User with null settings") + void getUserFromDBUuid_noSettings_userSettingsNull() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCoreUserColumns(); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + when(mockResultSet.getString("UUID_message")).thenReturn(null); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertNotNull(result); + assertNull(result.getSettings(), "Settings should be null when isAnonymous is null"); + assertNotNull(result.getInbox(), "Inbox should always be initialised"); + } + + @Test + @DisplayName("getUserFromDBUuid – single row with settings populates Settings correctly") + void getUserFromDBUuid_withSettings_settingsPopulated() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCoreUserColumns(); + stubSettingsColumns(false, "ENGLISH", true); + when(mockResultSet.getString("UUID_message")).thenReturn(null); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertNotNull(result.getSettings()); + assertFalse(result.getSettings().isAnonymous()); + assertEquals(Language.ENGLISH, result.getSettings().getLanguage()); + assertTrue(result.getSettings().isLightMode()); + } + + @Test + @DisplayName("getUserFromDBUuid – row with a message adds it to the inbox") + void getUserFromDBUuid_withMessage_messageAddedToInbox() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubCoreUserColumns(); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + stubMessageColumns(); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertEquals( + 1, result.getInbox().getMessages().size(), "Inbox should contain exactly one message"); + } + + @Test + @DisplayName("getUserFromDBUuid – two rows for same UUID adds two messages, one User") + void getUserFromDBUuid_twoRowsSameUuid_oneUserTwoMessages() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("UUID_User")).thenReturn(USER_UUID); + when(mockResultSet.getString("user_name")).thenReturn("Alice"); + when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); + when(mockResultSet.getString("role")).thenReturn("USER"); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + when(mockResultSet.getString("UUID_message")).thenReturn("msg-1", "msg-2"); + when(mockResultSet.getString("message_title")).thenReturn("Title 1", "Title 2"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_content")).thenReturn("Content"); + when(mockResultSet.getString("message_date")).thenReturn("2024-04-01"); + + User result = userSelect.getUserFromDBUuid(USER_UUID); + + assertEquals(2, result.getInbox().getMessages().size()); + } + + @Test + @DisplayName("getUserFromDBUuid – UUID is bound to PreparedStatement parameter 1") + void getUserFromDBUuid_uuidBoundCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + userSelect.getUserFromDBUuid(USER_UUID); + + verify(mockPreparedStatement).setString(1, USER_UUID); + } + + @Test + @DisplayName("getUserFromDBUuid – SQLException is wrapped in RuntimeException") + void getUserFromDBUuid_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenThrow(new SQLException("DB error")); + + assertThrows(RuntimeException.class, () -> userSelect.getUserFromDBUuid(USER_UUID)); + } + + // ------------------------------------------------------------------------- + // getUsersFromDB + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getUsersFromDB – empty result set returns empty registry") + void getUsersFromDB_emptyResultSet_returnsEmptyRegistry() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + UserRegistry registry = userSelect.getUsersFromDB(); + + assertNotNull(registry); + assertTrue(registry.getAllUsers().isEmpty()); + } + + @Test + @DisplayName("getUsersFromDB – two distinct UUIDs produce two User objects") + void getUsersFromDB_twoDistinctUuids_twoUsersInRegistry() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("UUID_User")).thenReturn("uuid-A", "uuid-B"); + when(mockResultSet.getString("user_name")).thenReturn("Alice", "Bob"); + when(mockResultSet.getString("user_email")).thenReturn("a@x.com", "b@x.com"); + when(mockResultSet.getString("user_password")).thenReturn("pw1", "pw2"); + when(mockResultSet.getString("role")).thenReturn("USER", "ADMIN"); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + when(mockResultSet.getString("UUID_message")).thenReturn(null); + + UserRegistry registry = userSelect.getUsersFromDB(); + + assertEquals(2, registry.getAllUsers().size()); + } + + @Test + @DisplayName("getUsersFromDB – same UUID across two rows deduplicates to one User") + void getUsersFromDB_sameUuidTwoRows_oneUserWithTwoMessages() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenReturn(mockStatement); + when(mockStatement.executeQuery(anyString())).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("UUID_User")).thenReturn(USER_UUID); + when(mockResultSet.getString("user_name")).thenReturn("Alice"); + when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); + when(mockResultSet.getString("role")).thenReturn("USER"); + when(mockResultSet.getString("isAnonymous")).thenReturn(null); + when(mockResultSet.getString("UUID_message")).thenReturn("msg-1", "msg-2"); + when(mockResultSet.getString("message_title")).thenReturn("T1", "T2"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_content")).thenReturn("Body"); + when(mockResultSet.getString("message_date")).thenReturn("2024-05-01"); + + UserRegistry registry = userSelect.getUsersFromDB(); + + assertEquals(1, registry.getAllUsers().size(), "Same UUID should not produce duplicate users"); + assertEquals(2, registry.getAllUsers().get(0).getInbox().getMessages().size()); + } + + @Test + @DisplayName("getUsersFromDB – SQLException is wrapped in RuntimeException") + void getUsersFromDB_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.createStatement()).thenThrow(new SQLException("DB error")); + + assertThrows(RuntimeException.class, () -> userSelect.getUsersFromDB()); + } + + // ------------------------------------------------------------------------- + // getSettingsForUser + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getSettingsForUser – no row returns null") + void getSettingsForUser_noRow_returnsNull() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + Settings result = userSelect.getSettingsForUser(USER_UUID); + + assertNull(result, "Should return null when no settings row exists"); + } + + @Test + @DisplayName("getSettingsForUser – matching row returns populated Settings") + void getSettingsForUser_matchingRow_returnsSettings() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + stubSettingsColumns(true, "NORWEGIAN", false); + + Settings result = userSelect.getSettingsForUser(USER_UUID); + + assertNotNull(result); + assertTrue(result.isAnonymous()); + assertEquals(Language.NORWEGIAN, result.getLanguage()); + assertFalse(result.isLightMode()); + } + + @Test + @DisplayName("getSettingsForUser – UUID is bound to PreparedStatement and maxRows set to 1") + void getSettingsForUser_correctBindingAndMaxRows() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + userSelect.getSettingsForUser(USER_UUID); + + verify(mockPreparedStatement).setString(1, USER_UUID); + verify(mockPreparedStatement).setMaxRows(1); + } + + @Test + @DisplayName("getSettingsForUser – SQLException is wrapped in RuntimeException") + void getSettingsForUser_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenThrow(new SQLException("DB error")); + + assertThrows(RuntimeException.class, () -> userSelect.getSettingsForUser(USER_UUID)); + } + + // ------------------------------------------------------------------------- + // getInboxForUser + // ------------------------------------------------------------------------- + + @Test + @DisplayName("getInboxForUser – no messages returns empty Inbox (never null)") + void getInboxForUser_noMessages_returnsEmptyInbox() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + Inbox result = userSelect.getInboxForUser(USER_UUID); + + assertNotNull(result, "Inbox should never be null"); + assertTrue(result.getMessages().isEmpty()); + } + + @Test + @DisplayName("getInboxForUser – one message row returns Inbox with one Message") + void getInboxForUser_oneRow_inboxContainsOneMessage() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, false); + when(mockResultSet.getString("message_title")).thenReturn("Hello"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_date")).thenReturn("2024-06-15"); + + Inbox result = userSelect.getInboxForUser(USER_UUID); + + assertEquals(1, result.getMessages().size()); + assertEquals("Hello", result.getMessages().get(0).getTitle()); + } + + @Test + @DisplayName("getInboxForUser – two message rows returns Inbox with two Messages") + void getInboxForUser_twoRows_inboxContainsTwoMessages() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + + when(mockResultSet.next()).thenReturn(true, true, false); + when(mockResultSet.getString("message_title")).thenReturn("Msg 1", "Msg 2"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_date")).thenReturn("2024-06-15"); + + Inbox result = userSelect.getInboxForUser(USER_UUID); + + assertEquals(2, result.getMessages().size()); + } + + @Test + @DisplayName("getInboxForUser – UUID is bound to PreparedStatement parameter 1") + void getInboxForUser_uuidBoundCorrectly() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenReturn(mockPreparedStatement); + when(mockPreparedStatement.executeQuery()).thenReturn(mockResultSet); + when(mockResultSet.next()).thenReturn(false); + + userSelect.getInboxForUser(USER_UUID); + + verify(mockPreparedStatement).setString(1, USER_UUID); + } + + @Test + @DisplayName("getInboxForUser – SQLException is wrapped in RuntimeException") + void getInboxForUser_sqlException_throwsRuntimeException() throws Exception { + when(mockDatabaseConnection.getMySqlConnection()).thenReturn(mockConnection); + when(mockConnection.prepareStatement(anyString())).thenThrow(new SQLException("DB error")); + + assertThrows(RuntimeException.class, () -> userSelect.getInboxForUser(USER_UUID)); + } + + // ------------------------------------------------------------------------- + // Helpers + // ------------------------------------------------------------------------- + + /** Stubs the core User columns on the mock ResultSet. */ + private void stubCoreUserColumns() throws SQLException { + when(mockResultSet.getString("UUID_User")).thenReturn(USER_UUID); + when(mockResultSet.getString("user_name")).thenReturn("Alice"); + when(mockResultSet.getString("user_email")).thenReturn("alice@example.com"); + when(mockResultSet.getString("user_password")).thenReturn("hashedpw"); + when(mockResultSet.getString("role")).thenReturn("USER"); + } + + /** Stubs the Settings columns on the mock ResultSet. */ + private void stubSettingsColumns(boolean isAnonymous, String language, boolean lightmode) + throws SQLException { + when(mockResultSet.getString("isAnonymous")).thenReturn(String.valueOf(isAnonymous)); + when(mockResultSet.getBoolean("isAnonymous")).thenReturn(isAnonymous); + when(mockResultSet.getString("language")).thenReturn(language); + when(mockResultSet.getBoolean("lightmode")).thenReturn(lightmode); + } + + /** Stubs the Message columns on the mock ResultSet for a single message row. */ + private void stubMessageColumns() throws SQLException { + when(mockResultSet.getString("UUID_message")).thenReturn(MESSAGE_UUID); + when(mockResultSet.getString("message_title")).thenReturn("Test Message"); + when(mockResultSet.getString("sender_charity_id")).thenReturn(CHARITY_UUID); + when(mockResultSet.getString("message_content")).thenReturn("Hello!"); + when(mockResultSet.getString("message_date")).thenReturn("2024-03-01"); + } +}

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 literal 0 HcmV?d00001 From 46e2efa2e46b127ae4fd1326679348e49a016859 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 5 Apr 2026 14:30:51 +0200 Subject: [PATCH 04/33] Feat: Added trigger. So when a user is added, an settings row is automatically added --- docs/ER-DiagramFile.mwb | Bin 16658 -> 16759 bytes docs/ER-DiagramFile.mwb.bak | Bin 13090 -> 16658 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/ER-DiagramFile.mwb b/docs/ER-DiagramFile.mwb index f3d247210e1dbf19a6fc5862ea5dc3fa9e4aa42b..82221d237b1c5b7f28539a233eaaf617b5b61404 100644 GIT binary patch delta 14430 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 B8W8{h From f69f2d8e49a048bf1af33360cff90e78764053da Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Sun, 5 Apr 2026 17:18:38 +0200 Subject: [PATCH 05/33] Fix: Trigger is not premittable (i dont have privilege) and added back unqiue to org_number. --- docs/ER-DiagramFile.mwb.bak | Bin 16658 -> 16420 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/ER-DiagramFile.mwb.bak b/docs/ER-DiagramFile.mwb.bak index f3d247210e1dbf19a6fc5862ea5dc3fa9e4aa42b..7b4776f764e886437753d587db8d163f21070a61 100644 GIT binary patch delta 14190 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%0A(EeNq?4VS~5-jMBqB21OKr$Stqb62aV#l8< zJxh64jA4myFd3XWeuHqmnY^!9{~#RnAT?`G2hWb7koNeQvWPGM&LIO~IK6S`d$D|v z8Uydkst(1ImBIc5V(|AFIltaf7YRk zr}ibUs@xp_Ifv#)o;Rq1kors3<0`Yk|6j{p$lGkq;NH7aN2`HORbA@^hw{w-4210r zIosD3eoP5uT;M}jYCq`ZQ=NQZ&q+b(#zYhhL#R#)%Mp5{5ajJ0V3egGkBK{0B8MGf zBr{BieHj$^(&}ACs#jXYcNLQ@j;Y6ezl9@I2{_X=n_wYaZztaj)&Cpqr~goZ$p|Vn z#f2|5paCni!1&(ZXT9yay(+`^Z0VmJ6XFDW6N5gHp`DE~9uS&+^o_f7IA=c^fWjW5 z%2`VyKh;P_-><1n(Y30hy_^W|i(w8`ldNZ~J{TKUqrYt^mCIbh3=d+(DNipm19~B-#Y@@Pl@TUDi3(s1)y1EAy`>HIYyR+rs;5*PvH*w#Sf5PT-+*R!g z9G6|7zJ600&P3QlPxbA%+E&)DkN%gF2{C+m`tdPvx1*VunY8Y1&*;wF&1kRp_qgr# zn~)wia3zI^fis-!@~My^5@Rp&dUtUBpITk~{ihtm`{F(Pz4E7SDOOGVrJQau8*~w3 z*P^HXL5ogZKxHD+y5+ai>n!&RB+54$sg~Y0%~0{Ty~X_PPDzQ8)txW3^_}m9M}p+# z?wib2$i7Y>ti|-SXaswi5F3NQChC)s%R4N|YN}R8^TEc)Vgzmz_&9VkvTq{Q`2Fbz z-n{gOx0d#)`EM9ugKMtqGB&05(*a+Hwbk4VGBKXgj+! z*1jUNXAp7!hn-bN=P_r~R`u{BC+Dpv;R{|-z1!a#&o-SmNuT3(XF95gG<7Fk#`^E) zn#UW9g;RX8;`|RM2pI&weFXI?4AuEC3DW`h2WxkNmnOpY=p0M)y>+R@2Tg9pJ7&`2 zuO3f*iqGS!-RFz@-kzv`Ry_Ly!diMzT9r~nbzrJsdkIU)+1FA2SXv5E?4)=6K#An$ z5#ACCUDag~PLU7l?6qB4Ut-KWz%|4-{8qW7%ebW@MR{*(@1!C{3Eq7y;1oXNkN^Oh zj&I4yB5jRgpuV@Y*YvWVnoUg3!rsdVwryye2E+JIww^Dx*R}3$KDBl6(~kTVzIdH} z$@V(=x&28QHdms*CS!ZmNA3Uv3iy#4zhn$&D*G=&1ps|oNEdmD!f2 X1O(y-DSD`>D3E`$cd|*`6=nNhyFRK6 delta 14389 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 Date: Sun, 5 Apr 2026 17:18:44 +0200 Subject: [PATCH 06/33] Fix: Trigger is not premittable (i dont have privilege) and added back unqiue to org_number. --- docs/ER-DiagramFile.mwb | Bin 16759 -> 16534 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/docs/ER-DiagramFile.mwb b/docs/ER-DiagramFile.mwb index 82221d237b1c5b7f28539a233eaaf617b5b61404..64d953370ece8645f76d027e2fe074078cb0a310 100644 GIT binary patch delta 14157 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�zN=p9SzR6Aey23u+Au7yp;#O` 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 From 38e7173c2969403a013d744f48fa1200344b8598 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 11:58:38 +0200 Subject: [PATCH 07/33] Feat: Sql scripts --- docs/Sql_script_v1.1.sql | 203 +++++++++++++++++++++++++++++++++++++ docs/Sql_script_v1.2.sql | 203 +++++++++++++++++++++++++++++++++++++ docs/Sql_scriptv1.0.sql | 213 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 619 insertions(+) create mode 100644 docs/Sql_script_v1.1.sql create mode 100644 docs/Sql_script_v1.2.sql create mode 100644 docs/Sql_scriptv1.0.sql diff --git a/docs/Sql_script_v1.1.sql b/docs/Sql_script_v1.1.sql new file mode 100644 index 0000000..6310455 --- /dev/null +++ b/docs/Sql_script_v1.1.sql @@ -0,0 +1,203 @@ +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; + +-- ----------------------------------------------------- +-- Schema apbaluna +-- ----------------------------------------------------- + +-- ----------------------------------------------------- +-- Schema apbaluna +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `apbaluna` DEFAULT CHARACTER SET utf8 ; +USE `apbaluna` ; + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Charities` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Charities` ( + `UUID_charities` CHAR(36) NOT NULL, + `org_number` VARCHAR(255) NOT NULL, + `charity_name` VARCHAR(255) NOT NULL, + `charity_description` VARCHAR(255) NOT NULL, + `charity_link` VARCHAR(255) NOT NULL, + `pre_approved` TINYINT NOT NULL, + `status` VARCHAR(255) NOT NULL, + PRIMARY KEY (`UUID_charities`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`User` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`User` ( + `UUID_User` CHAR(36) NOT NULL, + `user_name` VARCHAR(255) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + `role` VARCHAR(45) NOT NULL, + PRIMARY KEY (`UUID_User`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Donations` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Donations` ( + `UUID_Donations` CHAR(36) NOT NULL, + `amount` DECIMAL NOT NULL, + `date` DATE NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_Donations`), + INDEX `fk_Donations_Charities_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Donations_User1_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Donations_Charities` + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Donations_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Settings` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Settings` ( + `User_UUID_User` CHAR(36) NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `language` VARCHAR(45) NOT NULL, + `lightmode` TINYINT NOT NULL, + PRIMARY KEY (`User_UUID_User`), + INDEX `fk_Settings_User1_idx` (`User_UUID_User` ASC) VISIBLE, + CONSTRAINT `fk_Settings_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Messages` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Messages` ( + `UUID_message` CHAR(36) NOT NULL, + `message_title` VARCHAR(255) NOT NULL, + `message_content` VARCHAR(255) NOT NULL, + `message_date` DATE NOT NULL, + `sender_user_id` CHAR(36) NULL, + `sender_charity_id` CHAR(36) NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_message`), + INDEX `fk_Messages_User1_idx` (`sender_user_id` ASC) VISIBLE, + INDEX `fk_Messages_Charities1_idx` (`sender_charity_id` ASC) VISIBLE, + INDEX `fk_Messages_User2_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Messages_User1` + FOREIGN KEY (`sender_user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_Charities1` + FOREIGN KEY (`sender_charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_User2` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Feedback` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Feedback` ( + `UUID_feedback` CHAR(36) NOT NULL, + `feedback_comment` VARCHAR(255) NOT NULL, + `feedback_date` DATE NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_feedback`), + INDEX `fk_Feedback_Charities1_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Feedback_User1_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Feedback_Charities1` + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Feedback_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Categories` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Categories` ( + `category_id` INT NOT NULL AUTO_INCREMENT, + `category` VARCHAR(255) NOT NULL, + PRIMARY KEY (`category_id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Charity_Categories` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Charity_Categories` ( + `Categories_category_id` INT NOT NULL, + `Charities_UUID_charities` CHAR(36) NOT NULL, + PRIMARY KEY (`Categories_category_id`, `Charities_UUID_charities`), + INDEX `fk_Categories_has_Charities_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + INDEX `fk_Categories_has_Charities_Categories1_idx` (`Categories_category_id` ASC) VISIBLE, + CONSTRAINT `fk_Categories_has_Charities_Categories1` + FOREIGN KEY (`Categories_category_id`) + REFERENCES `apbaluna`.`Categories` (`category_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Categories_has_Charities_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`CharityUsers` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`CharityUsers` ( + `Charities_UUID_charities` CHAR(36) NOT NULL, + `User_UUID_User` CHAR(36) NOT NULL, + PRIMARY KEY (`Charities_UUID_charities`, `User_UUID_User`), + INDEX `fk_Charities_has_User_User1_idx` (`User_UUID_User` ASC) VISIBLE, + INDEX `fk_Charities_has_User_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + CONSTRAINT `fk_Charities_has_User_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Charities_has_User_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + +USE `apbaluna`; + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/docs/Sql_script_v1.2.sql b/docs/Sql_script_v1.2.sql new file mode 100644 index 0000000..4acb758 --- /dev/null +++ b/docs/Sql_script_v1.2.sql @@ -0,0 +1,203 @@ +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; + +-- ----------------------------------------------------- +-- Schema apbaluna +-- ----------------------------------------------------- + +-- ----------------------------------------------------- +-- Schema apbaluna +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `apbaluna` DEFAULT CHARACTER SET utf8 ; +USE `apbaluna` ; + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Charities` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Charities` ( + `UUID_charities` CHAR(36) NOT NULL, + `org_number` VARCHAR(255) NOT NULL, + `charity_name` VARCHAR(255) NOT NULL, + `charity_description` VARCHAR(255) NOT NULL, + `charity_link` VARCHAR(255) NOT NULL, + `pre_approved` TINYINT NOT NULL, + `status` VARCHAR(255) NOT NULL, + PRIMARY KEY (`UUID_charities`), + UNIQUE INDEX `org_number_UNIQUE` (`org_number` ASC) VISIBLE) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`User` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`User` ( + `UUID_User` CHAR(36) NOT NULL, + `user_name` VARCHAR(255) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + `role` VARCHAR(45) NOT NULL, + PRIMARY KEY (`UUID_User`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Donations` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Donations` ( + `UUID_Donations` CHAR(36) NOT NULL, + `amount` DECIMAL NOT NULL, + `date` DATE NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_Donations`), + INDEX `fk_Donations_Charities_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Donations_User1_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Donations_Charities` + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Donations_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Settings` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Settings` ( + `User_UUID_User` CHAR(36) NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `language` VARCHAR(45) NOT NULL, + `lightmode` TINYINT NOT NULL, + PRIMARY KEY (`User_UUID_User`), + INDEX `fk_Settings_User1_idx` (`User_UUID_User` ASC) VISIBLE, + CONSTRAINT `fk_Settings_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Messages` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Messages` ( + `UUID_message` CHAR(36) NOT NULL, + `message_title` VARCHAR(255) NOT NULL, + `message_content` VARCHAR(255) NOT NULL, + `message_date` DATE NOT NULL, + `sender_user_id` CHAR(36) NULL, + `sender_charity_id` CHAR(36) NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_message`), + INDEX `fk_Messages_User1_idx` (`sender_user_id` ASC) VISIBLE, + INDEX `fk_Messages_Charities1_idx` (`sender_charity_id` ASC) VISIBLE, + INDEX `fk_Messages_User2_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Messages_User1` + FOREIGN KEY (`sender_user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_Charities1` + FOREIGN KEY (`sender_charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_User2` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Feedback` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Feedback` ( + `UUID_feedback` CHAR(36) NOT NULL, + `feedback_comment` VARCHAR(255) NOT NULL, + `feedback_date` DATE NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_feedback`), + INDEX `fk_Feedback_Charities1_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Feedback_User1_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Feedback_Charities1` + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Feedback_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Categories` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Categories` ( + `category_id` INT NOT NULL AUTO_INCREMENT, + `category` VARCHAR(255) NOT NULL, + PRIMARY KEY (`category_id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Charity_Categories` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Charity_Categories` ( + `Categories_category_id` INT NOT NULL, + `Charities_UUID_charities` CHAR(36) NOT NULL, + PRIMARY KEY (`Categories_category_id`, `Charities_UUID_charities`), + INDEX `fk_Categories_has_Charities_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + INDEX `fk_Categories_has_Charities_Categories1_idx` (`Categories_category_id` ASC) VISIBLE, + CONSTRAINT `fk_Categories_has_Charities_Categories1` + FOREIGN KEY (`Categories_category_id`) + REFERENCES `apbaluna`.`Categories` (`category_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Categories_has_Charities_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`CharityUsers` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`CharityUsers` ( + `Charities_UUID_charities` CHAR(36) NOT NULL, + `User_UUID_User` CHAR(36) NOT NULL, + PRIMARY KEY (`Charities_UUID_charities`, `User_UUID_User`), + INDEX `fk_Charities_has_User_User1_idx` (`User_UUID_User` ASC) VISIBLE, + INDEX `fk_Charities_has_User_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + CONSTRAINT `fk_Charities_has_User_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Charities_has_User_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; diff --git a/docs/Sql_scriptv1.0.sql b/docs/Sql_scriptv1.0.sql new file mode 100644 index 0000000..529aac8 --- /dev/null +++ b/docs/Sql_scriptv1.0.sql @@ -0,0 +1,213 @@ +-- MySQL Workbench Forward Engineering + +SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0; +SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0; +SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION'; + +-- ----------------------------------------------------- +-- Schema apbaluna +-- ----------------------------------------------------- + +-- ----------------------------------------------------- +-- Schema apbaluna +-- ----------------------------------------------------- +CREATE SCHEMA IF NOT EXISTS `apbaluna` DEFAULT CHARACTER SET utf8 ; +USE `apbaluna` ; + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Charities` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Charities` ( + `UUID_charities` CHAR(36) NOT NULL, + `org_number` VARCHAR(255) NOT NULL, + `charity_name` VARCHAR(255) NOT NULL, + `charity_description` VARCHAR(255) NOT NULL, + `charity_link` VARCHAR(255) NOT NULL, + `pre_approved` TINYINT NOT NULL, + `status` VARCHAR(255) NOT NULL, + PRIMARY KEY (`UUID_charities`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`User` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`User` ( + `UUID_User` CHAR(36) NOT NULL, + `user_name` VARCHAR(255) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + `role` VARCHAR(45) NOT NULL, + PRIMARY KEY (`UUID_User`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Donations` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Donations` ( + `UUID_Donations` CHAR(36) NOT NULL, + `amount` DECIMAL NOT NULL, + `date` DATE NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_Donations`), + INDEX `fk_Donations_Charities_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Donations_User1_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Donations_Charities` + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Donations_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Settings` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Settings` ( + `User_UUID_User` CHAR(36) NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `language` VARCHAR(45) NOT NULL, + `lightmode` TINYINT NOT NULL, + PRIMARY KEY (`User_UUID_User`), + INDEX `fk_Settings_User1_idx` (`User_UUID_User` ASC) VISIBLE, + CONSTRAINT `fk_Settings_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Messages` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Messages` ( + `UUID_message` CHAR(36) NOT NULL, + `message_title` VARCHAR(255) NOT NULL, + `message_content` VARCHAR(255) NOT NULL, + `message_date` DATE NOT NULL, + `sender_user_id` CHAR(36) NULL, + `sender_charity_id` CHAR(36) NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_message`), + INDEX `fk_Messages_User1_idx` (`sender_user_id` ASC) VISIBLE, + INDEX `fk_Messages_Charities1_idx` (`sender_charity_id` ASC) VISIBLE, + INDEX `fk_Messages_User2_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Messages_User1` + FOREIGN KEY (`sender_user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_Charities1` + FOREIGN KEY (`sender_charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_User2` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Feedback` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Feedback` ( + `UUID_feedback` CHAR(36) NOT NULL, + `feedback_comment` VARCHAR(255) NOT NULL, + `feedback_date` DATE NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_feedback`), + INDEX `fk_Feedback_Charities1_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Feedback_User1_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Feedback_Charities1` + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Feedback_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Categories` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Categories` ( + `category_id` INT NOT NULL AUTO_INCREMENT, + `category` VARCHAR(255) NOT NULL, + PRIMARY KEY (`category_id`)) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`Charity_Categories` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`Charity_Categories` ( + `Categories_category_id` INT NOT NULL, + `Charities_UUID_charities` CHAR(36) NOT NULL, + PRIMARY KEY (`Categories_category_id`, `Charities_UUID_charities`), + INDEX `fk_Categories_has_Charities_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + INDEX `fk_Categories_has_Charities_Categories1_idx` (`Categories_category_id` ASC) VISIBLE, + CONSTRAINT `fk_Categories_has_Charities_Categories1` + FOREIGN KEY (`Categories_category_id`) + REFERENCES `apbaluna`.`Categories` (`category_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Categories_has_Charities_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + + +-- ----------------------------------------------------- +-- Table `apbaluna`.`CharityUsers` +-- ----------------------------------------------------- +CREATE TABLE IF NOT EXISTS `apbaluna`.`CharityUsers` ( + `Charities_UUID_charities` CHAR(36) NOT NULL, + `User_UUID_User` CHAR(36) NOT NULL, + PRIMARY KEY (`Charities_UUID_charities`, `User_UUID_User`), + INDEX `fk_Charities_has_User_User1_idx` (`User_UUID_User` ASC) VISIBLE, + INDEX `fk_Charities_has_User_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + CONSTRAINT `fk_Charities_has_User_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Charities_has_User_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) +ENGINE = InnoDB; + +USE `apbaluna`; + +DELIMITER $$ +USE `apbaluna`$$ +CREATE DEFINER = CURRENT_USER TRIGGER `apbaluna`.`User_AFTER_INSERT` AFTER INSERT ON `User` FOR EACH ROW +BEGIN + INSERT INTO apbaluna.Settings (User_UUID_User, isAnonymous, language, lightmode) VALUES (NEW.UUID_User, 0, 'English', 0); +END$$ + + +DELIMITER ; + +SET SQL_MODE=@OLD_SQL_MODE; +SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS; +SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS; From 5d2a1580c2829d72149031adeb4ef83b3d271284 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 11:59:06 +0200 Subject: [PATCH 08/33] Feat: Updated createTables function to new tables --- .../team6/database/DatabaseManager.java | 245 +++++++++++++++--- 1 file changed, 212 insertions(+), 33 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index a4007a0..a3bb4af 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -62,48 +62,218 @@ public boolean testConnection() { * @throws RuntimeException if a {@link SQLException} occurs while creating the table */ public void createTables() { - String sql_query1 = + String Charities_table = """ -- ----------------------------------------------------- -- Table `HelpMeHelp`.`Charities` -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS Charities ( - UUID_charities CHAR(36) PRIMARY KEY, - org_number VARCHAR(255) NOT NULL, - charity_name VARCHAR(255) NOT NULL, - charity_link VARCHAR(255) NOT NULL, - pre_approved TINYINT NOT NULL, - status VARCHAR(255) NOT NULL, - UNIQUE KEY unique_org_number (org_number) - ) ENGINE=InnoDB; - + CREATE TABLE IF NOT EXISTS `apbaluna`.`Charities` ( + `UUID_charities` CHAR(36) NOT NULL, + `org_number` VARCHAR(255) NOT NULL, + `charity_name` VARCHAR(255) NOT NULL, + `charity_description` VARCHAR(255) NOT NULL, + `charity_link` VARCHAR(255) NOT NULL, + `pre_approved` TINYINT NOT NULL, + `status` VARCHAR(255) NOT NULL, + PRIMARY KEY (`UUID_charities`), + UNIQUE INDEX `org_number_UNIQUE` (`org_number` ASC) VISIBLE) + ENGINE = InnoDB; """; - String sql_query2 = + String sql_query3 = """ -- ----------------------------------------------------- -- Table `HelpMeHelp`.`Donations` -- ----------------------------------------------------- - CREATE TABLE IF NOT EXISTS Donations ( + CREATE TABLE IF NOT EXISTS `apbaluna`.`Donations` ( `UUID_Donations` CHAR(36) NOT NULL, `amount` DECIMAL NOT NULL, `date` DATE NOT NULL, - `Charities_UUID_charities` CHAR(36) NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, PRIMARY KEY (`UUID_Donations`), - INDEX `fk_Donations_Charities_idx` (`Charities_UUID_charities` ASC) VISIBLE, + INDEX `fk_Donations_Charities_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Donations_User1_idx` (`user_id` ASC) VISIBLE, CONSTRAINT `fk_Donations_Charities` - FOREIGN KEY (`Charities_UUID_charities`) - REFERENCES Charities (`UUID_charities`) - ON DELETE CASCADE - ON UPDATE CASCADE) + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Donations_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) ENGINE = InnoDB; """; + String sql_query2 = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`User` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`User` ( + `UUID_User` CHAR(36) NOT NULL, + `user_name` VARCHAR(255) NOT NULL, + `user_email` VARCHAR(255) NOT NULL, + `role` VARCHAR(45) NOT NULL, + PRIMARY KEY (`UUID_User`)) + ENGINE = InnoDB; + """; + + String sql_query4 = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Settings` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Settings` ( + `User_UUID_User` CHAR(36) NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `language` VARCHAR(45) NOT NULL, + `lightmode` TINYINT NOT NULL, + PRIMARY KEY (`User_UUID_User`), + INDEX `fk_Settings_User1_idx` (`User_UUID_User` ASC) VISIBLE, + CONSTRAINT `fk_Settings_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + + String sql_query5 = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Messages` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Messages` ( + `UUID_message` CHAR(36) NOT NULL, + `message_title` VARCHAR(255) NOT NULL, + `message_content` VARCHAR(255) NOT NULL, + `message_date` DATE NOT NULL, + `sender_user_id` CHAR(36) NULL, + `sender_charity_id` CHAR(36) NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_message`), + INDEX `fk_Messages_User1_idx` (`sender_user_id` ASC) VISIBLE, + INDEX `fk_Messages_Charities1_idx` (`sender_charity_id` ASC) VISIBLE, + INDEX `fk_Messages_User2_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Messages_User1` + FOREIGN KEY (`sender_user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_Charities1` + FOREIGN KEY (`sender_charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Messages_User2` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + + String sql_query6 = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Feedback` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Feedback` ( + `UUID_feedback` CHAR(36) NOT NULL, + `feedback_comment` VARCHAR(255) NOT NULL, + `feedback_date` DATE NOT NULL, + `isAnonymous` TINYINT NOT NULL, + `charity_id` CHAR(36) NOT NULL, + `user_id` CHAR(36) NOT NULL, + PRIMARY KEY (`UUID_feedback`), + INDEX `fk_Feedback_Charities1_idx` (`charity_id` ASC) VISIBLE, + INDEX `fk_Feedback_User1_idx` (`user_id` ASC) VISIBLE, + CONSTRAINT `fk_Feedback_Charities1` + FOREIGN KEY (`charity_id`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Feedback_User1` + FOREIGN KEY (`user_id`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + String sql_query7 = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Categories` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Categories` ( + `category_id` INT NOT NULL AUTO_INCREMENT, + `category` VARCHAR(255) NOT NULL, + PRIMARY KEY (`category_id`)) + ENGINE = InnoDB; + """; + + String sql_query8 = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`Charity_Categories` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`Charity_Categories` ( + `Categories_category_id` INT NOT NULL, + `Charities_UUID_charities` CHAR(36) NOT NULL, + PRIMARY KEY (`Categories_category_id`, `Charities_UUID_charities`), + INDEX `fk_Categories_has_Charities_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + INDEX `fk_Categories_has_Charities_Categories1_idx` (`Categories_category_id` ASC) VISIBLE, + CONSTRAINT `fk_Categories_has_Charities_Categories1` + FOREIGN KEY (`Categories_category_id`) + REFERENCES `apbaluna`.`Categories` (`category_id`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Categories_has_Charities_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; + + String sql_query9 = + """ + -- ----------------------------------------------------- + -- Table `apbaluna`.`CharityUsers` + -- ----------------------------------------------------- + CREATE TABLE IF NOT EXISTS `apbaluna`.`CharityUsers` ( + `Charities_UUID_charities` CHAR(36) NOT NULL, + `User_UUID_User` CHAR(36) NOT NULL, + PRIMARY KEY (`Charities_UUID_charities`, `User_UUID_User`), + INDEX `fk_Charities_has_User_User1_idx` (`User_UUID_User` ASC) VISIBLE, + INDEX `fk_Charities_has_User_Charities1_idx` (`Charities_UUID_charities` ASC) VISIBLE, + CONSTRAINT `fk_Charities_has_User_Charities1` + FOREIGN KEY (`Charities_UUID_charities`) + REFERENCES `apbaluna`.`Charities` (`UUID_charities`) + ON DELETE NO ACTION + ON UPDATE NO ACTION, + CONSTRAINT `fk_Charities_has_User_User1` + FOREIGN KEY (`User_UUID_User`) + REFERENCES `apbaluna`.`User` (`UUID_User`) + ON DELETE NO ACTION + ON UPDATE NO ACTION) + ENGINE = InnoDB; + """; try (Connection conn = connection.getMySqlConnection(); Statement s = conn.createStatement()) { - s.execute(sql_query1); + s.execute(Charities_table); s.execute(sql_query2); + s.execute(sql_query3); + s.execute(sql_query4); + s.execute(sql_query5); + s.execute(sql_query6); + s.execute(sql_query7); + s.execute(sql_query8); + s.execute(sql_query9); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("Error creating table."); @@ -127,8 +297,8 @@ public void addAPIDataToTable(List charities) { conn.setAutoCommit(false); String sql_query = """ - INSERT INTO Charities (UUID_charities, org_number, charity_name, charity_link, pre_approved, status) - VALUES (?, ?, ?, ?, ?, ?) + INSERT INTO Charities (UUID_charities, org_number, charity_name, charity_description, charity_link, pre_approved, status) + VALUES (?, ?, ?, ?, ?, ?, ?) ON DUPLICATE KEY UPDATE charity_name = VALUES(charity_name), charity_link = VALUES(charity_link), @@ -146,9 +316,10 @@ INSERT INTO Charities (UUID_charities, org_number, charity_name, charity_link, p ps.setString(2, charity.getOrg_number().replaceAll("\\s", "")); ps.setString(3, charity.getName()); - ps.setString(4, charity.getDescription()); - ps.setBoolean(5, charity.getPreApproved()); // Description is the link - ps.setString(6, charity.getStatus()); + ps.setString(4, "Blank until webscraber works"); + ps.setString(5, charity.getDescription()); + ps.setBoolean(6, charity.getPreApproved()); // Description is the link + ps.setString(7, charity.getStatus()); ps.addBatch(); } @@ -159,7 +330,7 @@ INSERT INTO Charities (UUID_charities, org_number, charity_name, charity_link, p String createTemp = """ CREATE TEMPORARY TABLE temp_api_charities ( - org_number VARCHAR(20) PRIMARY KEY + org_number VARCHAR(255) PRIMARY KEY ) """; @@ -180,13 +351,21 @@ org_number VARCHAR(20) PRIMARY KEY } String deleteSql = - """ - DELETE FROM Charities c - WHERE NOT EXISTS ( - SELECT 1 - FROM temp_api_charities t - WHERE t.org_number = c.org_number - ) + """ + DELETE FROM Charities c + WHERE NOT EXISTS ( + SELECT 1 FROM temp_api_charities t + WHERE t.org_number = c.org_number + ) + AND NOT EXISTS ( + SELECT 1 FROM Donations d WHERE d.charity_id = c.UUID_charities + ) + AND NOT EXISTS ( + SELECT 1 FROM Feedback f WHERE f.charity_id = c.UUID_charities + ) + AND NOT EXISTS ( + SELECT 1 FROM CharityUsers cu WHERE cu.Charities_UUID_charities = c.UUID_charities + ); """; try (PreparedStatement ps = conn.prepareStatement(deleteSql)) { From 96eec1d98469bb3c149de577ed074525835ef084 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 12:01:43 +0200 Subject: [PATCH 09/33] Fix: Maven formatting and naming conventions --- helpmehelpapplication/pom.xml | 2 - .../systemutvikling/team6/HmHApplication.java | 4 + .../AvailableOrganizationController.java | 25 +- .../controller/CharityPageController.java | 1 + .../controller/DonationPageController.java | 1 + .../team6/controller/FrontpageController.java | 371 +++++++++--------- .../team6/database/DatabaseManager.java | 36 +- 7 files changed, 220 insertions(+), 220 deletions(-) diff --git a/helpmehelpapplication/pom.xml b/helpmehelpapplication/pom.xml index 1794a9e..2fdce09 100644 --- a/helpmehelpapplication/pom.xml +++ b/helpmehelpapplication/pom.xml @@ -111,6 +111,4 @@ - - \ No newline at end of file diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java index 293aa2d..2a8903a 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java @@ -17,6 +17,7 @@ public class HmHApplication extends Application { @Override public void start(Stage stage) throws Exception { + /* FXMLLoader fxmlLoader = new FXMLLoader(HmHApplication.class.getResource("/fxml/frontPage.fxml")); Scene scene = new Scene(fxmlLoader.load()); @@ -31,6 +32,8 @@ public void start(Stage stage) throws Exception { stage.setFullScreen(true); stage.show(); + */ + } @Override @@ -59,6 +62,7 @@ public void init() { } catch (Exception e) { e.printStackTrace(); } + System.out.println("-- \n Init complete \n --"); } public static void main(String[] args) { diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java index 5f7a569..e2c7abd 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java @@ -15,12 +15,11 @@ /** * This controller represents the available organization page, where the user can search for a - * charity and choose to donate to it. It also has a button to return to the front page. - * The user can search for a charity by typing in the search field, - * and the charities that match the search query will be displayed. - * The user can click on a charity to see more details about it, - * or click on the featured charity to see more details about it. - * The user can also switch to the charity page or donation page for the selected charity. + * charity and choose to donate to it. It also has a button to return to the front page. The user + * can search for a charity by typing in the search field, and the charities that match the search + * query will be displayed. The user can click on a charity to see more details about it, or click + * on the featured charity to see more details about it. The user can also switch to the charity + * page or donation page for the selected charity. */ public class AvailableOrganizationController { @@ -31,12 +30,11 @@ public class AvailableOrganizationController { private List allCharities; /** - * This method is used to initialize the available organization page. - * It retrieves all charities from the database and sets up a listener on the search field - * to filter the charities based on the user's input. - * It also clears the cards container to prepare for displaying the filtered charities. - * The method is called automatically when the page is loaded, - * and it sets up the initial state of the page. + * This method is used to initialize the available organization page. It retrieves all charities + * from the database and sets up a listener on the search field to filter the charities based on + * the user's input. It also clears the cards container to prepare for displaying the filtered + * charities. The method is called automatically when the page is loaded, and it sets up the + * initial state of the page. */ @FXML public void initialize() { @@ -54,6 +52,7 @@ public void initialize() { /** * This method filters the charities based on the user's input in the search field. + * * @param query is the user's input in the search field, which is used to filter the charities. * @return a list of charities that match the search query. */ @@ -79,6 +78,7 @@ private List filterCharities(String query) { /** * This method displays the charities in the cards container. + * * @param charities is a list of charities to be displayed. */ private void displayCharities(List charities) { @@ -101,6 +101,7 @@ private void displayCharities(List charities) { /** * This method is used to set the initial search query in the search field. + * * @param query is the initial search query. */ @FXML diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/CharityPageController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/CharityPageController.java index de2e43e..b52064f 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/CharityPageController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/CharityPageController.java @@ -64,6 +64,7 @@ public void switchToDonationPage(ActionEvent event) { /** * This method is used to search for charities based on the input in the search field. + * * @param event is the event that triggered the search. */ @FXML diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/DonationPageController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/DonationPageController.java index dc7e0d8..0ce757f 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/DonationPageController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/DonationPageController.java @@ -135,6 +135,7 @@ private void showAlert(Alert.AlertType type, String title, String message) { /** * This method is used to handle the search action when the user clicks the search button. + * * @param event is the event that triggered the search. */ @FXML diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java index 2abff0b..f91877c 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java @@ -4,7 +4,6 @@ import java.util.ArrayList; import java.util.List; import java.util.Random; - import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.fxml.FXMLLoader; @@ -27,198 +26,194 @@ * to the charity page and the donation page for the featured charity */ public class FrontpageController { - @FXML - private Charity featuredCharity; - @FXML - private FlowPane cardsContainer; - @FXML - private Label Carosel_Organisasjon; - @FXML - private Label Carosel_Beskrivelse; - @FXML - private Label Total_Orgnisasjon; - @FXML - private Label Total_Donations; - @FXML - private Label PreApproved_Percentage; - @FXML - private TextField frontSearchField; - @FXML - private CheckBox verifiedFilter; - @FXML - private CheckBox childrenFilter; - @FXML - private CheckBox healthFilter; - @FXML - private CheckBox emergencyAidFilter; - - private List allCharities = new ArrayList<>(); - - /** - * Initialize method for the front page. This method is called when the front page is loaded. It - * retrieves the list of charities and donations from the database. The list of charities is - * displayed as a list of cards, where each card represents a charity from the - * Innsamlingskontrollen. A random charity is selected to be featured on the page, and its name - * and description are displayed in the carousel section. The total number of charities, total - * amount of donations, and percentage of pre-approved charities are also displayed on the page. - */ - @FXML - public void initialize() { - try { - DatabaseManager db = new DatabaseManager(); - CharityRegistry charities = db.getCharitiesFromDB(); - DonationRegistry donations = db.getDonationFromDB(); - - allCharities = new ArrayList<>(charities.getAllCharities()); - displayCharities(allCharities); - - int charitiesSize = charities.getAllCharities().size(); - Random random = new Random(); - int randomIndex = random.nextInt(charitiesSize); - Charity randomCharity = charities.getAllCharities().get(randomIndex); - - this.featuredCharity = randomCharity; - Carosel_Organisasjon.setText(randomCharity.getName()); - Carosel_Beskrivelse.setText(randomCharity.getDescription()); - - Total_Orgnisasjon.setText(Integer.toString(charitiesSize)); - Total_Donations.setText( - Double.toString( - donations.getAllDonations().stream().mapToDouble(Donation::getAmount).sum())); - PreApproved_Percentage.setText( - String.format( - "%.2f", - charities.getAllCharities().stream().filter(Charity::getPreApproved).count() - * 100.0 - / charitiesSize) - + "%"); - } catch (Exception e) { - e.printStackTrace(); - } - } - - - /** - * This method is used to switch to the charity page for the selected charity - * - * @param event - */ - public void switchToCharityPage(ActionEvent event) { - LoaderScene.LoadScene("CharityPage", event, featuredCharity, null); - } - - /** - * This method is used to switch to the donation page for the selected charity. - * - * @param event - */ - public void switchToDonationPage(ActionEvent event) { - LoaderScene.LoadScene("DonationPage", event, featuredCharity, null); - } - - /** - * This method is used to filter the charities based on the selected filters. - * @param event is the event that triggered the filter. - */ - @FXML - public void handleCategoryFilterChange(ActionEvent event) { - displayCharities(getFilteredCharities()); + @FXML private Charity featuredCharity; + @FXML private FlowPane cardsContainer; + @FXML private Label Carosel_Organisasjon; + @FXML private Label Carosel_Beskrivelse; + @FXML private Label Total_Orgnisasjon; + @FXML private Label Total_Donations; + @FXML private Label PreApproved_Percentage; + @FXML private TextField frontSearchField; + @FXML private CheckBox verifiedFilter; + @FXML private CheckBox childrenFilter; + @FXML private CheckBox healthFilter; + @FXML private CheckBox emergencyAidFilter; + + private List allCharities = new ArrayList<>(); + + /** + * Initialize method for the front page. This method is called when the front page is loaded. It + * retrieves the list of charities and donations from the database. The list of charities is + * displayed as a list of cards, where each card represents a charity from the + * Innsamlingskontrollen. A random charity is selected to be featured on the page, and its name + * and description are displayed in the carousel section. The total number of charities, total + * amount of donations, and percentage of pre-approved charities are also displayed on the page. + */ + @FXML + public void initialize() { + try { + DatabaseManager db = new DatabaseManager(); + CharityRegistry charities = db.getCharitiesFromDB(); + DonationRegistry donations = db.getDonationFromDB(); + + allCharities = new ArrayList<>(charities.getAllCharities()); + displayCharities(allCharities); + + int charitiesSize = charities.getAllCharities().size(); + Random random = new Random(); + int randomIndex = random.nextInt(charitiesSize); + Charity randomCharity = charities.getAllCharities().get(randomIndex); + + this.featuredCharity = randomCharity; + Carosel_Organisasjon.setText(randomCharity.getName()); + Carosel_Beskrivelse.setText(randomCharity.getDescription()); + + Total_Orgnisasjon.setText(Integer.toString(charitiesSize)); + Total_Donations.setText( + Double.toString( + donations.getAllDonations().stream().mapToDouble(Donation::getAmount).sum())); + PreApproved_Percentage.setText( + String.format( + "%.2f", + charities.getAllCharities().stream().filter(Charity::getPreApproved).count() + * 100.0 + / charitiesSize) + + "%"); + } catch (Exception e) { + e.printStackTrace(); } - - /** - * This method is used to search for charities based on the input in the search field. - * @param event is the event that triggered the search. - */ - @FXML - public void handleFrontSearch(ActionEvent event) { - String query = frontSearchField.getText().trim(); - - if (query.isEmpty()) { - return; - } - - LoaderScene.LoadScene("availableOrganization", event, null, query); + } + + /** + * This method is used to switch to the charity page for the selected charity + * + * @param event + */ + public void switchToCharityPage(ActionEvent event) { + LoaderScene.LoadScene("CharityPage", event, featuredCharity, null); + } + + /** + * This method is used to switch to the donation page for the selected charity. + * + * @param event + */ + public void switchToDonationPage(ActionEvent event) { + LoaderScene.LoadScene("DonationPage", event, featuredCharity, null); + } + + /** + * This method is used to filter the charities based on the selected filters. + * + * @param event is the event that triggered the filter. + */ + @FXML + public void handleCategoryFilterChange(ActionEvent event) { + displayCharities(getFilteredCharities()); + } + + /** + * This method is used to search for charities based on the input in the search field. + * + * @param event is the event that triggered the search. + */ + @FXML + public void handleFrontSearch(ActionEvent event) { + String query = frontSearchField.getText().trim(); + + if (query.isEmpty()) { + return; } - /** - * This method is used to filter the charities based on the selected filters. - * @return a list of filtered charities. - */ - private List getFilteredCharities() { - if (!verifiedFilter.isSelected() - && !childrenFilter.isSelected() - && !healthFilter.isSelected() - && !emergencyAidFilter.isSelected()) { - return allCharities; - } - - List filteredCharities = new ArrayList<>(); - for (Charity charity : allCharities) { - if (matchesSelectedFilters(charity)) { - filteredCharities.add(charity); - } - } - return filteredCharities; + LoaderScene.LoadScene("availableOrganization", event, null, query); + } + + /** + * This method is used to filter the charities based on the selected filters. + * + * @return a list of filtered charities. + */ + private List getFilteredCharities() { + if (!verifiedFilter.isSelected() + && !childrenFilter.isSelected() + && !healthFilter.isSelected() + && !emergencyAidFilter.isSelected()) { + return allCharities; } - /** - * This method is used to check if a charity matches the selected filters. - * @param charity is the charity to be checked. - * @return true if the charity matches the selected filters, false otherwise. - */ - private boolean matchesSelectedFilters(Charity charity) { - return (verifiedFilter.isSelected() && charity.getPreApproved()) - || (childrenFilter.isSelected() && matchesKeywordCategory(charity, "children")) - || (healthFilter.isSelected() && matchesKeywordCategory(charity, "health")) - || (emergencyAidFilter.isSelected() && matchesKeywordCategory(charity, "emergency")); + List filteredCharities = new ArrayList<>(); + for (Charity charity : allCharities) { + if (matchesSelectedFilters(charity)) { + filteredCharities.add(charity); + } } - - /** - * This method is used to check if a charity matches a specific category. - * @param charity is the charity to be checked. - * @param category is the category to check against. - * @return true if the charity matches the category, false otherwise. - */ - private boolean matchesKeywordCategory(Charity charity, String category) { - String text = (charity.getName() + " " + charity.getDescription()).toLowerCase(); - - return switch (category) { - case "children" -> text.contains("child") - || text.contains("children") - || text.contains("barn") - || text.contains("youth") - || text.contains("young"); - case "health" -> text.contains("health") - || text.contains("medical") - || text.contains("helse") - || text.contains("hospital") - || text.contains("care"); - case "emergency" -> text.contains("emergency") - || text.contains("relief") - || text.contains("crisis") - || text.contains("aid") - || text.contains("disaster"); - default -> false; - }; - } - - /** - * This method is used to display the charities in the cards container. - * @param charities is the list of charities to be displayed. - */ - private void displayCharities(List charities) { - cardsContainer.getChildren().clear(); - - for (Charity charity : charities) { - try { - FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/organizationCard.fxml")); - Parent card = loader.load(); - OrganizationCardController cardController = loader.getController(); - cardController.setOrganization(charity); - cardsContainer.getChildren().add(card); - } catch (IOException e) { - throw new RuntimeException("Could not load organization card.", e); - } - } + return filteredCharities; + } + + /** + * This method is used to check if a charity matches the selected filters. + * + * @param charity is the charity to be checked. + * @return true if the charity matches the selected filters, false otherwise. + */ + private boolean matchesSelectedFilters(Charity charity) { + return (verifiedFilter.isSelected() && charity.getPreApproved()) + || (childrenFilter.isSelected() && matchesKeywordCategory(charity, "children")) + || (healthFilter.isSelected() && matchesKeywordCategory(charity, "health")) + || (emergencyAidFilter.isSelected() && matchesKeywordCategory(charity, "emergency")); + } + + /** + * This method is used to check if a charity matches a specific category. + * + * @param charity is the charity to be checked. + * @param category is the category to check against. + * @return true if the charity matches the category, false otherwise. + */ + private boolean matchesKeywordCategory(Charity charity, String category) { + String text = (charity.getName() + " " + charity.getDescription()).toLowerCase(); + + return switch (category) { + case "children" -> + text.contains("child") + || text.contains("children") + || text.contains("barn") + || text.contains("youth") + || text.contains("young"); + case "health" -> + text.contains("health") + || text.contains("medical") + || text.contains("helse") + || text.contains("hospital") + || text.contains("care"); + case "emergency" -> + text.contains("emergency") + || text.contains("relief") + || text.contains("crisis") + || text.contains("aid") + || text.contains("disaster"); + default -> false; + }; + } + + /** + * This method is used to display the charities in the cards container. + * + * @param charities is the list of charities to be displayed. + */ + private void displayCharities(List charities) { + cardsContainer.getChildren().clear(); + + for (Charity charity : charities) { + try { + FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/organizationCard.fxml")); + Parent card = loader.load(); + OrganizationCardController cardController = loader.getController(); + cardController.setOrganization(charity); + cardsContainer.getChildren().add(card); + } catch (IOException e) { + throw new RuntimeException("Could not load organization card.", e); + } } + } } diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java index a3bb4af..20972b2 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseManager.java @@ -62,7 +62,7 @@ public boolean testConnection() { * @throws RuntimeException if a {@link SQLException} occurs while creating the table */ public void createTables() { - String Charities_table = + String charitiesTable = """ -- ----------------------------------------------------- -- Table `HelpMeHelp`.`Charities` @@ -80,7 +80,7 @@ PRIMARY KEY (`UUID_charities`), ENGINE = InnoDB; """; - String sql_query3 = + String donationsTable = """ -- ----------------------------------------------------- -- Table `HelpMeHelp`.`Donations` @@ -106,7 +106,7 @@ FOREIGN KEY (`user_id`) ON UPDATE NO ACTION) ENGINE = InnoDB; """; - String sql_query2 = + String userTable = """ -- ----------------------------------------------------- -- Table `apbaluna`.`User` @@ -120,7 +120,7 @@ PRIMARY KEY (`UUID_User`)) ENGINE = InnoDB; """; - String sql_query4 = + String settingsTable = """ -- ----------------------------------------------------- -- Table `apbaluna`.`Settings` @@ -140,7 +140,7 @@ FOREIGN KEY (`User_UUID_User`) ENGINE = InnoDB; """; - String sql_query5 = + String messagesTable = """ -- ----------------------------------------------------- -- Table `apbaluna`.`Messages` @@ -175,7 +175,7 @@ FOREIGN KEY (`user_id`) ENGINE = InnoDB; """; - String sql_query6 = + String feedbackTable = """ -- ----------------------------------------------------- -- Table `apbaluna`.`Feedback` @@ -202,7 +202,7 @@ FOREIGN KEY (`user_id`) ON UPDATE NO ACTION) ENGINE = InnoDB; """; - String sql_query7 = + String categoriesTable = """ -- ----------------------------------------------------- -- Table `apbaluna`.`Categories` @@ -214,7 +214,7 @@ PRIMARY KEY (`category_id`)) ENGINE = InnoDB; """; - String sql_query8 = + String charityCategoriesTable = """ -- ----------------------------------------------------- -- Table `apbaluna`.`Charity_Categories` @@ -238,7 +238,7 @@ FOREIGN KEY (`Charities_UUID_charities`) ENGINE = InnoDB; """; - String sql_query9 = + String charityUserTable = """ -- ----------------------------------------------------- -- Table `apbaluna`.`CharityUsers` @@ -265,15 +265,15 @@ FOREIGN KEY (`User_UUID_User`) try (Connection conn = connection.getMySqlConnection(); Statement s = conn.createStatement()) { - s.execute(Charities_table); - s.execute(sql_query2); - s.execute(sql_query3); - s.execute(sql_query4); - s.execute(sql_query5); - s.execute(sql_query6); - s.execute(sql_query7); - s.execute(sql_query8); - s.execute(sql_query9); + s.execute(charitiesTable); + s.execute(userTable); + s.execute(donationsTable); + s.execute(settingsTable); + s.execute(messagesTable); + s.execute(feedbackTable); + s.execute(categoriesTable); + s.execute(charityCategoriesTable); + s.execute(charityUserTable); } catch (SQLException e) { e.printStackTrace(); throw new RuntimeException("Error creating table."); From 9457c264778b24f6c252a496afab32d8017bfcab Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 12:39:27 +0200 Subject: [PATCH 10/33] Fix: Better coding convention --- .../java/ntnu/systemutvikling/team6/HmHApplication.java | 7 +++++-- .../team6/controller/AvailableOrganizationController.java | 4 +++- .../team6/controller/FrontpageController.java | 4 +++- 3 files changed, 11 insertions(+), 4 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java index 2a8903a..74bb73c 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java @@ -9,6 +9,7 @@ import javafx.scene.Scene; import javafx.scene.image.Image; import javafx.stage.Stage; +import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.database.DatabaseManager; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; @@ -40,7 +41,8 @@ public void start(Stage stage) throws Exception { public void init() { /* Test and create tables to MySQL if ain't any */ try { - DatabaseManager db = new DatabaseManager(); + DatabaseConnection conn = new DatabaseConnection(); + DatabaseManager db = new DatabaseManager(conn); db.testConnection(); db.createTables(); } catch (Exception e) { @@ -50,7 +52,8 @@ public void init() { try { HttpClient https = HttpClient.newHttpClient(); APICharityScraper scraper = new APICharityScraper(https); - DatabaseManager db = new DatabaseManager(); + DatabaseConnection conn = new DatabaseConnection(); + DatabaseManager db = new DatabaseManager(conn); if (scraper.checkConnection()) { CharityRegistry charityRegistry = scraper.parseJSON(scraper.getJSONData()); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java index e2c7abd..1d74e24 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java @@ -9,6 +9,7 @@ import javafx.scene.Parent; import javafx.scene.control.TextField; import javafx.scene.layout.FlowPane; +import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.database.DatabaseManager; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; @@ -38,7 +39,8 @@ public class AvailableOrganizationController { */ @FXML public void initialize() { - DatabaseManager db = new DatabaseManager(); + DatabaseConnection conn = new DatabaseConnection(); + DatabaseManager db = new DatabaseManager(conn); CharityRegistry charities = db.getCharitiesFromDB(); allCharities = charities.getAllCharities(); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java index f91877c..1cad4eb 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java @@ -12,6 +12,7 @@ import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.FlowPane; +import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.database.DatabaseManager; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.CharityRegistry; @@ -52,7 +53,8 @@ public class FrontpageController { @FXML public void initialize() { try { - DatabaseManager db = new DatabaseManager(); + DatabaseConnection conn = new DatabaseConnection(); + DatabaseManager db = new DatabaseManager(conn); CharityRegistry charities = db.getCharitiesFromDB(); DonationRegistry donations = db.getDonationFromDB(); From a13676db14ccdb2fe2634480937e97a10ce837d2 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Tue, 7 Apr 2026 12:39:49 +0200 Subject: [PATCH 11/33] Fix: Better coding convention --- docs/ER-Diagram v4.png | Bin 101459 -> 101502 bytes .../team6/DAO/DonationDAOTest.java | 3 ++- .../team6/database/DatabaseManagerTest.java | 3 ++- 3 files changed, 4 insertions(+), 2 deletions(-) diff --git a/docs/ER-Diagram v4.png b/docs/ER-Diagram v4.png index 225aaf5a4ba24b4c29de0c7f5998a4607e75742f..e031b2145c34a8cceb9ff092d02c8b43d62bce3e 100644 GIT binary patch literal 101502 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%0Ah{bKL1pj}}zJnJh%fom~9NMG@@ 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