Skip to content
Binary file removed givehope.db
Binary file not shown.
45 changes: 37 additions & 8 deletions src/main/java/app/Main.java
Original file line number Diff line number Diff line change
@@ -1,34 +1,63 @@
package app;

import application.security.PasswordHasher;
import application.user.UserLogin;
import application.user.UserRegister;
import domain.donation.Donation;
import domain.organization.Organization;
import domain.user.User;
import integration.InnsamlingskontrollenClient;
import integration.security.Sha256PasswordHasher;
import java.math.BigDecimal;
import java.util.List;
import persistence.DonationDao;
import persistence.OrganizationDao;
import persistence.UserDao;
import persistence.UserRepository;
import persistence.db.Database;

public class Main {
UserDao userDao = new UserDao();
public static void main(String[] args) {
try{
try {
Database.getConnection();
System.out.println("Database connected");

UserDao userDao = new UserDao();
OrganizationDao orgDao = new OrganizationDao();
DonationDao donationDao = new DonationDao();

PasswordHasher hasher = new Sha256PasswordHasher();
UserRepository userRepo = new UserDao();
UserRegister userReg = new UserRegister(hasher, userRepo);
UserLogin login = new UserLogin(hasher, userRepo);

// Test brukerregistrering
userReg.execute("testuser", "12345678", "passord123", "test@example.com");
System.out.println("Inserted user!");

userReg.execute("wfrfrewfhbjdddswe3f", "45586456", "Jegerkddsdwdwful", "113@1h33weqd3.com");
User user = userDao.findByEmail("test@example.com").orElseThrow();
System.out.println("Hentet bruker: " + user.getUsername() + ", id=" + user.getID());

// Hent og lagre organisasjoner fra Innsamlingskontrollen
System.out.println("Henter organisasjoner fra Innsamlingskontrollen...");
Organization[] fetchedOrgs = InnsamlingskontrollenClient.fetchOrganizations();
for (Organization org : fetchedOrgs) {
orgDao.insert(org);
}
System.out.println("Lastet inn " + fetchedOrgs.length + " organisasjoner");

List<Organization> orgs = orgDao.getAll();
System.out.println("Organisasjoner i DB: " + orgs.size());
System.out.println("Første org: " + orgs.get(0).getName() + ", org_number=" + orgs.get(0).getOrgNumber());

// Test donasjon med første org fra DB
Donation donation = new Donation(new BigDecimal("100.00"), user, orgs.get(0));
donationDao.insert(donation);
System.out.println("Inserted donation, id=" + donation.getId());

List<Donation> donations = donationDao.findByUser(user.getID());
System.out.println("Antall donasjoner for bruker: " + donations.size());

System.out.println("Inserted user!");
} catch (Exception e) {
e.printStackTrace();
}


}
}
69 changes: 69 additions & 0 deletions src/main/java/application/user/UserStatistics.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package application.user;

import domain.user.User;
import java.util.ArrayList;
import java.util.List;
import persistence.DonationDao;

/**
* Provides statistical information about a user's donation activity.
* Acts as a service layer between the application and {@link DonationDao},
* exposing user-friendly methods for retrieving donation history,
* total amounts, and favorite organizations.
*/
public class UserStatistics {
private DonationDao donationDao;

/**
* Constructs a new {@code UserStatistics} instance with a default {@link DonationDao}.
*/
public UserStatistics() {
this.donationDao = new DonationDao();
}

/**
* Returns the top three organizations that the user has donated to most frequently.
*
* @param user the user whose favorite organizations are to be retrieved; must not be null
* @return a list of up to three formatted strings, each representing an organization
* and its donation count; empty list if the user has no donations
*/
public List<String> userFavoriteOrganizations(User user) {
List<String> favoriteOrganizations = donationDao.getFavoriteOrganizations(user.getID());
return favoriteOrganizations;
}

/**
* Returns a formatted list of all donations made by the user.
* Each entry contains the donation amount, date, and organization.
*
* @param user the user whose donation history is to be retrieved; must not be null
* @return a list of formatted donation strings; empty list if the user has no donations
*/
public List<String> userDonations(User user) {
List<String> userDonationList = donationDao.getUserDonations(user.getID());
return userDonationList;
}

/**
* Returns the total amount donated by the user across all donations.
*
* @param user the user whose total donation amount is to be calculated; must not be null
* @return a string representation of the total donated amount; {@code "0"} if no donations exist
*/
public String userTotalDonationAmount(User user) {
String totalDonations = donationDao.getTotalDonationAmount(user.getID());
return totalDonations;
}

/**
* Returns the total number of donations made by the user.
*
* @param user the user whose donation count is to be retrieved; must not be null
* @return a string representation of the total number of donations; {@code "0"} if none exist
*/
public String getTotalDonationsMade(User user) {
String totalDonationsMade = donationDao.getTotalDonationsMade(user.getID());
return totalDonationsMade;
}
}
89 changes: 26 additions & 63 deletions src/main/java/domain/organization/Organization.java
Original file line number Diff line number Diff line change
@@ -1,81 +1,44 @@
package domain.organization;

import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
import domain.donation.Cause;

import java.util.Objects;

@JsonIgnoreProperties(ignoreUnknown = true)
public class Organization {
private final String name;
private final String orgNr;
private final Cause cause;
private final String description;
private final String contactEmail;
private final String website;
private final boolean verified;

@JsonProperty("org_number")
private String orgNumber;

public Organization(String name, String orgNr, Cause cause, String description, String contactEmail, String website, boolean verified) {
if (name == null || name.isBlank()) {
throw new IllegalArgumentException("Name cannot be null or blank");
}
if (orgNr == null || !orgNr.matches("\\d{9}")) {
throw new IllegalArgumentException("Organization number must be 9 digits");
}
if (contactEmail != null) {
contactEmail = contactEmail.trim();
@JsonProperty("name")
private String name;

if (contactEmail.isBlank()) {
throw new IllegalArgumentException("Email cannot be blank");
}
@JsonProperty("status")
private String status;

if (!contactEmail.matches("^[A-Za-z0-9+_.-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,}$"
)) //Got help from ChatGPT on regex
{
throw new IllegalArgumentException("Invalid email format");
}
}
@JsonProperty("url")
private String url;

if (website != null) {
website = website.trim();
@JsonProperty("is_pre_approved")
private boolean isPreApproved;

if (website.isBlank()) {
throw new IllegalArgumentException("Website cannot be blank");
}
public Organization() {}

if (!website.matches("^https?://.+")) { //Got help from ChatGPT for regex
throw new IllegalArgumentException("Website must start with http:// or https://");
}
}

this.name = name.trim();
this.orgNr = orgNr.trim();
this.cause = Objects.requireNonNull(cause, "Cause cannot be null");
this.description = description;
this.contactEmail = contactEmail;
this.website = website;
this.verified = verified;
}
public String getOrgNumber() { return orgNumber; }
public void setOrgNumber(String orgNumber) { this.orgNumber = orgNumber; }

public String getName() { return name; }
public void setName(String name) { this.name = name; }

public String getName() {
return name;
}
public String getOrgNr() {
return orgNr;
}
public Cause getCause() {
return cause;
}
public String getDescription() {
return description;
}
public String getContactEmail() {
return contactEmail;
}
public String getWebsite() {
return website;
}
public boolean isVerified() {
return verified;
}
public String getStatus() { return status; }
public void setStatus(String status) { this.status = status; }

public String getUrl() { return url; }
public void setUrl(String url) { this.url = url; }

public boolean isPreApproved() { return isPreApproved; }
public void setPreApproved(boolean preApproved) { isPreApproved = preApproved; }
}
9 changes: 9 additions & 0 deletions src/main/java/domain/user/User.java
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ public class User {
private String phoneNumber;
private final String eMail;
private String password;
private Long id;

public User(String userName, String phoneNumber, String password, String eMail) {

Expand All @@ -28,6 +29,7 @@ public User(String userName, String phoneNumber, String password, String eMail)
this.phoneNumber = phoneNumber;
this.eMail = eMail.trim();
this.password = password;
this.id = id;
}

public String getUsername() {
Expand All @@ -46,6 +48,8 @@ public String getPassword() {
return password;
}

public long getID() { return id; }

public void setPassword(String password) {
this.password = password;
}
Expand All @@ -57,4 +61,9 @@ public void setUsername(String userName) {
public void setPhonenumber (String phoneNumber) {
this.phoneNumber = phoneNumber;
}

public void setId(Long id) {
if (this.id != null) throw new IllegalStateException("ID already set");
this.id = id;
}
}
Loading
Loading