Skip to content

Commit

Permalink
Fix: Futher refined methods to avoid n+1 threading and splitted it fo…
Browse files Browse the repository at this point in the history
…r more accessibiliy
  • Loading branch information
AdrianBalunan committed Apr 12, 2026
1 parent 7503df6 commit 02fbe15
Show file tree
Hide file tree
Showing 13 changed files with 839 additions and 765 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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) {
Expand All @@ -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());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand Down Expand Up @@ -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();

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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);
Expand Down
Original file line number Diff line number Diff line change
@@ -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<Charity> 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();
}
}
}
}
}
Loading

0 comments on commit 02fbe15

Please sign in to comment.