Skip to content

Commit

Permalink
Feat: Api Scraper return CharityRegistry instead of a list of APIobject
Browse files Browse the repository at this point in the history
  • Loading branch information
AdrianBalunan committed Mar 12, 2026
1 parent 0fe1de1 commit 975d8d0
Showing 1 changed file with 25 additions and 91 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.*;
Expand All @@ -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.
Expand All @@ -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();
Expand Down Expand Up @@ -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<APICharityData> parseJSON(String JSONData) {
//public List<APICharityData> 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.
Expand All @@ -110,91 +131,4 @@ public List<APICharityData> parseJSON(String JSONData) {
* @param charities a list of ApiCharityDaya objects
* @throws RuntimeException if a {@link SQLException} occurs during database synchronization
*/

public void updateCharities(List<APICharityData> 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();
}
}
}

}
}

0 comments on commit 975d8d0

Please sign in to comment.