Skip to content

Commit

Permalink
Updated APIToDatabaseService
Browse files Browse the repository at this point in the history
Fixed bug where CharityVanity would get multiple duplicate entries each run of the code.
  • Loading branch information
roaraf committed Apr 18, 2026
1 parent fa3e976 commit ef2b567
Showing 1 changed file with 48 additions and 49 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -36,41 +36,46 @@ public APIToDatabaseService(DatabaseConnection connection) {
*/
public void addAPIDataToTable(List<Charity> charities) {
Connection conn = null;
// Everything charity related except categories
try {
conn = connection.getMySqlConnection();
conn.setAutoCommit(false);
conn.setAutoCommit(
false);

String sql1 =
"""
INSERT INTO Charities (UUID_charities, org_number, pre_approved, status)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
pre_approved = VALUES(pre_approved),
status = VALUES(status);
""";
INSERT INTO Charities (UUID_charities, org_number, pre_approved, status)
VALUES (?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
pre_approved = VALUES(pre_approved),
status = VALUES(status);
""";

String sql2 =
"""
INSERT INTO CharityVanity (UUID_charity, charity_name, charity_link, description, logoURL, key_values, logoBlob)
VALUES (?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
charity_name = VALUES(charity_name),
charity_link = VALUES(charity_link),
description = VALUES(description),
logoURL = VALUES(logoURL),
key_values = VALUES(key_values),
logoBlob = VALUES(logoBlob);
""";
INSERT INTO CharityVanity (UUID_charity, charity_name, charity_link, description, logoURL, key_values, logoBlob)
VALUES (?, ?, ?, ?, ?, ?, ?)
ON DUPLICATE KEY UPDATE
charity_name = VALUES(charity_name),
charity_link = VALUES(charity_link),
description = VALUES(description),
logoURL = VALUES(logoURL),
key_values = VALUES(key_values),
logoBlob = VALUES(logoBlob);
""";

try (PreparedStatement ps1 = conn.prepareStatement(sql1);
PreparedStatement ps2 = conn.prepareStatement(sql2)) {

for (Charity charity : charities) {
String uuid;
if (charity.getUUID() == null) {
uuid = UUID.randomUUID().toString();

uuid =
UUID.nameUUIDFromBytes(
(charity.getOrg_number() + charity.getURL() + charity.getName()).getBytes())
.toString();
charity.setUUIDFromString(uuid);
System.out.println("API object doesnt have UUID, assigning");
System.out.println("API object doesn't have UUID, assigning stable UUID");
} else {
uuid = charity.getUUID().toString();
}
Expand All @@ -90,56 +95,51 @@ INSERT INTO CharityVanity (UUID_charity, charity_name, charity_link, description
ps2.setBytes(7, charity.getLogoBlob());
ps2.executeUpdate();
}

} catch (Exception e) {
e.printStackTrace();
throw new RuntimeException(e);
}

// -- Intergerty Check:
// Integrity Check
String createTemp =
"""
CREATE TEMPORARY TABLE temp_api_charities (
org_number VARCHAR(255) PRIMARY KEY
)
""";

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 CharityVanity cv WHERE cv.UUID_charity = c.UUID_charities
)
AND NOT EXISTS (
SELECT 1 FROM CharityUsers cu WHERE cu.Charities_UUID_charities = c.UUID_charities
);
""";
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 CharityVanity cv WHERE cv.UUID_charity = 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();
Expand All @@ -156,7 +156,6 @@ AND NOT EXISTS (
}
}
e.printStackTrace();

throw new RuntimeException("ERROR: Something went wrong during updating charities table.");
} finally {
if (conn != null) {
Expand Down

0 comments on commit ef2b567

Please sign in to comment.