From 975d8d034d3a1f5525a1cf6187c0ef3323f51d83 Mon Sep 17 00:00:00 2001 From: AdrianBalunan Date: Thu, 12 Mar 2026 12:37:03 +0100 Subject: [PATCH] Feat: Api Scraper return CharityRegistry instead of a list of APIobject --- .../team6/scraper/APICharityScraper.java | 116 ++++-------------- 1 file changed, 25 insertions(+), 91 deletions(-) diff --git a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/scraper/APICharityScraper.java b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/scraper/APICharityScraper.java index db2482f..7668cc4 100644 --- a/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/scraper/APICharityScraper.java +++ b/helpmehelpapplication/src/main/java/ntnu/sytemutvikling/team6/scraper/APICharityScraper.java @@ -2,6 +2,8 @@ import com.google.gson.Gson; import ntnu.sytemutvikling.team6.database.DatabaseConnection; +import ntnu.sytemutvikling.team6.models.Charity; +import ntnu.sytemutvikling.team6.models.CharityRegistry; import java.io.IOException; import java.net.*; @@ -24,6 +26,7 @@ public class APICharityScraper { private final HttpClient client; private final HttpRequest request; private final DatabaseConnection connection; + private final static String API_url = "https://app.innsamlingskontrollen.no/api/public/v1/all"; /** * Constructs a new APICharityScraper object. @@ -34,7 +37,7 @@ public class APICharityScraper { public APICharityScraper(HttpClient client) throws URISyntaxException { this.client = client; this.request = HttpRequest.newBuilder() - .uri(new URI("https://app.innsamlingskontrollen.no/api/public/v1/all")) + .uri(new URI(API_url)) .GET() .build(); this.connection = new DatabaseConnection(); @@ -81,19 +84,37 @@ public String getJSONData() throws IOException, InterruptedException { * @return a list of APICharityDaya objects * @throws com.google.gson.JsonSyntaxException if the provided JSON is not valid */ - - public List parseJSON(String JSONData) { + //public List parseJSON(String JSONData) { + public CharityRegistry parseJSON(String JSONData) { Gson gson = new Gson(); APICharityData[] charityData = gson.fromJson(JSONData, APICharityData[].class); if (charityData == null) { - return new ArrayList<>(); + //return new ArrayList<>(); + return new CharityRegistry(); } // Filters out "obs" status due to non-unique org_number values + /* return Arrays.stream(charityData) .filter(c-> !"obs".equalsIgnoreCase(c.getStatus())) .toList(); + + */ + + // Alternate using predefiend Charity class + CharityRegistry charityRegistry = new CharityRegistry(); + for (APICharityData apiCharityData : charityData){ + Charity charity = new Charity( + apiCharityData.getOrg_number(), + apiCharityData.getUrl(), + apiCharityData.getName(), + apiCharityData.getIs_pre_approved(), + apiCharityData.getStatus() + ); + charityRegistry.addCharity(charity); + } + return charityRegistry; } /** * Synchronizes the {@code charities} table with the provided list of APICharityData. @@ -110,91 +131,4 @@ public List parseJSON(String JSONData) { * @param charities a list of ApiCharityDaya objects * @throws RuntimeException if a {@link SQLException} occurs during database synchronization */ - - public void updateCharities(List charities) { - Connection conn = null; - try { - conn = connection.getMySqlConnection(); - conn.setAutoCommit(false); - // Inserts objects values into charities - String sql_query = """ - INSERT INTO charities (org_number, name, status, url, is_pre_approved) - VALUES (?, ?, ?, ?, ?) - ON DUPLICATE KEY UPDATE - name = VALUES(name), - status = VALUES(status), - url = VALUES(url), - is_pre_approved = VALUES(is_pre_approved) - """; - - try (PreparedStatement s = conn.prepareStatement(sql_query)) { - for (APICharityData charity : charities) { - s.setString(1, charity.getOrg_number().replaceAll("\\s", "")); - s.setString(2, charity.getName()); - s.setString(3, charity.getStatus()); - s.setString(4, charity.getUrl()); - s.setBoolean(5, charity.getIs_pre_approved()); - - s.addBatch(); - } - s.executeBatch(); - } - - - // Temporary table for parity check - sql_query = "CREATE TEMPORARY TABLE temp (org_number VARCHAR(100) PRIMARY KEY)"; - try (PreparedStatement temp_create = conn.prepareStatement(sql_query)) { - temp_create.execute(); - } - - String sql_update_temp_table = "INSERT INTO temp (org_number) VALUES (?)"; - try (PreparedStatement temp_update = conn.prepareStatement(sql_update_temp_table)) { - for (APICharityData charity : charities) { - temp_update.setString(1, charity.getOrg_number().replaceAll("\\s", "")); - temp_update.addBatch(); - } - temp_update.executeBatch(); - } - - - - // Removes records not found in the list from charities table - sql_query = """ - DELETE FROM charities c - WHERE NOT EXISTS ( - SELECT 1 - FROM temp t - WHERE c.org_number = t.org_number - ) - """; - - try (PreparedStatement delete_old_records = conn.prepareStatement(sql_query)){ - delete_old_records.execute(); - } - - 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(); - } - } - } - - } }