From bdd2284ad548e2036435d1e19fc4b1fb36664726 Mon Sep 17 00:00:00 2001 From: Lucy Ciara Herud-Thomassen <86323303+LucyCiara@users.noreply.github.com> Date: Thu, 12 Mar 2026 12:20:45 +0100 Subject: [PATCH] refactor[wrapper]&feat[DbWrapper]: move wrapper classes to its own folder, and add a class for database communication --- .../edu/group5/app/control/DbWrapper.java | 29 ----- .../group5/app/control/wrapper/DbWrapper.java | 113 ++++++++++++++++++ .../control/{ => wrapper}/OrgApiWrapper.java | 18 +-- .../app/control/{ => wrapper}/Wrapper.java | 15 ++- src/main/resources/init.sql | 23 ++-- src/main/resources/test_init.sql | 25 ++-- 6 files changed, 158 insertions(+), 65 deletions(-) delete mode 100644 src/main/java/edu/group5/app/control/DbWrapper.java create mode 100644 src/main/java/edu/group5/app/control/wrapper/DbWrapper.java rename src/main/java/edu/group5/app/control/{ => wrapper}/OrgApiWrapper.java (85%) rename src/main/java/edu/group5/app/control/{ => wrapper}/Wrapper.java (66%) diff --git a/src/main/java/edu/group5/app/control/DbWrapper.java b/src/main/java/edu/group5/app/control/DbWrapper.java deleted file mode 100644 index cafd03f..0000000 --- a/src/main/java/edu/group5/app/control/DbWrapper.java +++ /dev/null @@ -1,29 +0,0 @@ -package edu.group5.app.control; - -import java.sql.Connection; -import java.sql.DriverManager; -import java.sql.SQLException; - -public class DbWrapper { - protected Connection connection; - private static final String CONNECTION_TYPE = "jdbc:h2:"; - private static final String DB_SCRIPT = "INIT=RUNSCRIPT FROM 'classpath:"; - private String connectionString; - - public DbWrapper(boolean test) { - if (test) { - this.connectionString = CONNECTION_TYPE + "mem:test;" + DB_SCRIPT + "test_init.sql'"; - } else { - this.connectionString = CONNECTION_TYPE + "file:./help-me-help;" + DB_SCRIPT + "init.sql'"; - } - } - - public boolean connect() throws SQLException { - try { - this.connection = DriverManager.getConnection(this.connectionString); - } catch (SQLException SQLe) { - SQLe.printStackTrace(); - } - return connection.isValid(0); - } -} diff --git a/src/main/java/edu/group5/app/control/wrapper/DbWrapper.java b/src/main/java/edu/group5/app/control/wrapper/DbWrapper.java new file mode 100644 index 0000000..6eb673f --- /dev/null +++ b/src/main/java/edu/group5/app/control/wrapper/DbWrapper.java @@ -0,0 +1,113 @@ +package edu.group5.app.control.wrapper; + +import java.math.BigDecimal; +import java.sql.Connection; +import java.sql.DriverManager; +import java.sql.PreparedStatement; +import java.sql.ResultSet; +import java.sql.SQLException; +import java.sql.Timestamp; +import java.util.ArrayList; +import java.util.List; + +public class DbWrapper { + protected Connection connection; + private static final String CONNECTION_TYPE = "jdbc:h2:"; + private static final String DB_SCRIPT = "INIT=RUNSCRIPT FROM 'classpath:"; + private String connectionString; + + public DbWrapper(boolean test) { + if (test) { + this.connectionString = CONNECTION_TYPE + "mem:test;" + DB_SCRIPT + "test_init.sql'"; + } else { + this.connectionString = CONNECTION_TYPE + "file:./help-me-help;" + DB_SCRIPT + "init.sql'"; + } + } + + public boolean connect() throws SQLException { + try { + this.connection = DriverManager.getConnection(this.connectionString); + } catch (SQLException SQLe) { + System.out.println(SQLe.getMessage()); + } + return connection.isValid(0); + } + + public List importUser() throws SQLException { + PreparedStatement ps = this.connection.prepareStatement("SELECT * FROM user"); + ResultSet results = ps.executeQuery(); + List data = new ArrayList(); + while (results.next()) { + data.add( + new Object[] { + results.getInt("user_id"), + results.getString("role"), + results.getString("first_name"), + results.getString("last_name"), + results.getString("email"), + results.getString("password_hash") + }); + } + return data; + } + + public int exportUser(List data) throws SQLException { + if (data == null) { + throw new IllegalArgumentException("data can't be null"); + } + if (data.get(0).length != 6) { + throw new IllegalArgumentException("data's arrays must have a length of 6"); + } + int rowsAffected = 0; + PreparedStatement ps = this.connection.prepareStatement( + "INSERT INTO user (user_id, role, first_name, last_name, email, password_hash) VALUES (?, ?, ?, ?, ?, ?)"); + for (Object[] row : data) { + ps.setInt(1, (int) row[0]); + for (int i = 1; i < row.length; i++) { + ps.setString(i + 1, (String) row[i]); + } + rowsAffected = ps.executeUpdate(); + } + return rowsAffected; + } + + public List importDonations(int user_id) throws SQLException { + PreparedStatement ps = this.connection.prepareStatement("SELECT * FROM donations WHERE user_id = ?"); + ps.setInt(1, user_id); + ResultSet results = ps.executeQuery(); + List data = new ArrayList(); + while (results.next()) { + data.add( + new Object[] { + results.getInt(1), + results.getInt(2), + results.getInt(3), + results.getBigDecimal(4), + results.getTimestamp(5), + results.getString(6) + }); + } + return data; + } + + public int exportDonations(List data) throws SQLException { + if (data == null) { + throw new IllegalArgumentException("data can't be null"); + } + if (data.get(0).length == 6) { + throw new IllegalArgumentException("data's arrays must have a length of 6"); + } + int rowsAffected = 0; + PreparedStatement ps = this.connection.prepareStatement( + "INSERT INTO donations (donation_id, user_id, organization_id, amount, dating, payment_method) VALUES (?, ?, ?, ?, ?, ?)"); + for (Object[] row : data) { + for (int i = 0; i < 3; i++) { + ps.setInt(i + 1, (int) row[i]); + } + ps.setBigDecimal(4, (BigDecimal) row[3]); + ps.setTimestamp(5, (Timestamp) row[4]); + rowsAffected = ps.executeUpdate(); + } + return rowsAffected; + } +} diff --git a/src/main/java/edu/group5/app/control/OrgApiWrapper.java b/src/main/java/edu/group5/app/control/wrapper/OrgApiWrapper.java similarity index 85% rename from src/main/java/edu/group5/app/control/OrgApiWrapper.java rename to src/main/java/edu/group5/app/control/wrapper/OrgApiWrapper.java index 24c82ee..39ac283 100644 --- a/src/main/java/edu/group5/app/control/OrgApiWrapper.java +++ b/src/main/java/edu/group5/app/control/wrapper/OrgApiWrapper.java @@ -1,4 +1,4 @@ -package edu.group5.app.control; +package edu.group5.app.control.wrapper; import java.io.IOException; import java.net.URI; @@ -17,7 +17,8 @@ public class OrgApiWrapper extends Wrapper { private HttpRequest request; /** - * The constructor, which takes a url String and constructs a URI and HttpRequest object from it. + * The constructor, which takes a url String and constructs a URI and + * HttpRequest object from it. * If the url is invalid, it will throw a fitting exception. * * @param urlString A string of the URL that's being connected to. @@ -44,11 +45,13 @@ public OrgApiWrapper(String urlString) { /** * A method for importing data from the wrapped API. * - * @return Returns a boolean, which indicates if the import was successful. Will be False if, for - * example, there is no internet connection. + * @return Returns a boolean, which indicates if the import was successful. Will + * be False if, for + * example, there is no internet connection. * - * @throws InterruptedException This exception is thrown whenever the program is interrupted, like - * by ctrl + c. + * @throws InterruptedException This exception is thrown whenever the program is + * interrupted, like + * by ctrl + c. */ @Override public boolean importData() throws InterruptedException { @@ -67,7 +70,8 @@ public boolean importData() throws InterruptedException { /** * A method for accessing the imported data. * - * @return Returns an array with HashMaps, which is how data is structured in the API. + * @return Returns an array with HashMaps, which is how data is structured in + * the API. */ @Override public Object[] getData() { diff --git a/src/main/java/edu/group5/app/control/Wrapper.java b/src/main/java/edu/group5/app/control/wrapper/Wrapper.java similarity index 66% rename from src/main/java/edu/group5/app/control/Wrapper.java rename to src/main/java/edu/group5/app/control/wrapper/Wrapper.java index ea55179..992b7a9 100644 --- a/src/main/java/edu/group5/app/control/Wrapper.java +++ b/src/main/java/edu/group5/app/control/wrapper/Wrapper.java @@ -1,4 +1,4 @@ -package edu.group5.app.control; +package edu.group5.app.control.wrapper; /** * An abstract class for all Wrappers of datasets. @@ -9,13 +9,16 @@ protected Wrapper() { } /** - * An abstract method for importing data from the dataset that child methods wrap. + * An abstract method for importing data from the dataset that child methods + * wrap. * - * @return Returns a boolean, which indicates if the import was successful. Will be False if, for - * example, there is no internet connection. + * @return Returns a boolean, which indicates if the import was successful. Will + * be False if, for + * example, there is no internet connection. * - * @throws InterruptedException This exception is thrown whenever the program is interrupted, like - * by ctrl + c. + * @throws InterruptedException This exception is thrown whenever the program is + * interrupted, like + * by ctrl + c. */ public abstract boolean importData() throws InterruptedException; diff --git a/src/main/resources/init.sql b/src/main/resources/init.sql index ff37e31..90e8421 100644 --- a/src/main/resources/init.sql +++ b/src/main/resources/init.sql @@ -1,20 +1,21 @@ CREATE TABLE IF NOT EXISTS users ( - user_id int PRIMARY KEY, - first_name varchar(20), - last_name varchar(20), - email varchar(20), - password_hash varchar(72) + user_id INT PRIMARY KEY, + role VARCHAR(20), + first_name VARCHAR(20), + last_name VARCHAR(20), + email VARCHAR(20), + password_hash VARCHAR(72) ); CREATE TABLE IF NOT EXISTS donations ( - donation_id int PRIMARY KEY, - user_id int NOT NULL, - organization_id int NOT NULL, - amount double NOT NULL, - dating timestamp NOT NULL, - payment_method varchar(20), + donation_id INT PRIMARY KEY, + user_id INT NOT NULL, + organization_id INT NOT NULL, + amount DECIMAL NOT NULL, + dating TIMESTAMP NOT NULL, + payment_method VARCHAR(20), CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(user_id) diff --git a/src/main/resources/test_init.sql b/src/main/resources/test_init.sql index e1c1c43..40a8460 100644 --- a/src/main/resources/test_init.sql +++ b/src/main/resources/test_init.sql @@ -2,22 +2,23 @@ DROP TABLE IF EXISTS users, donations; CREATE TABLE IF NOT EXISTS users ( - user_id int PRIMARY KEY, - first_name varchar(20), - last_name varchar(20), - email varchar(20), - password_hash varchar(72) + user_id INT PRIMARY KEY, + role VARCHAR(20), + first_name VARCHAR(20), + last_name VARCHAR(20), + email VARCHAR(20), + password_hash VARCHAR(72) ); CREATE TABLE IF NOT EXISTS donations ( - donation_id int PRIMARY KEY, - user_id int NOT NULL, - organization_id int NOT NULL, - amount double NOT NULL, - dating timestamp NOT NULL, - payment_method varchar(20), + donation_id INT PRIMARY KEY, + user_id INT NOT NULL, + organization_id INT NOT NULL, + amount DECIMAL NOT NULL, + dating TIMESTAMP NOT NULL, + payment_method VARCHAR(20), CONSTRAINT fk_user FOREIGN KEY (user_id) REFERENCES users(user_id) -); +);;