Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
87 changes: 81 additions & 6 deletions src/main/java/edu/group5/app/App.java
Original file line number Diff line number Diff line change
@@ -1,25 +1,100 @@
package edu.group5.app;

import edu.group5.app.control.MainController;
import edu.group5.app.control.wrapper.DbWrapper;
import edu.group5.app.control.wrapper.OrgApiWrapper;
import edu.group5.app.model.donation.Donation;
import edu.group5.app.model.donation.DonationRepository;
import edu.group5.app.model.donation.DonationService;
import edu.group5.app.model.organization.OrganizationRepository;
import edu.group5.app.model.organization.OrganizationService;
import edu.group5.app.model.user.User;
import edu.group5.app.model.user.UserRepository;
import edu.group5.app.model.user.UserService;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.stage.Stage;

import java.util.List;

import java.util.logging.Logger;

/**
* Hello world!
* Main entry point for the Help-Me-Help charity donation application.
* Handles database connection, data loading, and application setup.
*/
public class App extends Application {
DbWrapper dbWrapper;
UserRepository userRepository;
DonationRepository donationRepository;
private Logger logger;
private MainController controller;
private Scene scene;

@Override
public void start(Stage stage) {
MainController controller = new MainController();
public void init() {
this.logger = Logger.getLogger(App.class.getName());
this.logger.info("Application starting");

this.dbWrapper = new DbWrapper(false);
OrgApiWrapper orgApiWrapper = new OrgApiWrapper("https://app.innsamlingskontrollen.no/api/public/v1/all");

while (!dbWrapper.connect()) {
this.logger.warning("Failed to connect to database");
}

// Load data from database
List<Object[]> userData = dbWrapper.importUsers();
List<Object[]> donationData = dbWrapper.fetchAllDonations();
dbWrapper.disconnect();

// Load organizations from API
Object[] organizationData = new Object[0];
try {
if (orgApiWrapper.importData()) {
organizationData = orgApiWrapper.getData();
}
} catch (InterruptedException e) {
System.err.println("Failed to load organization data: " + e.getMessage());
}

// Create repositories with fetched data
this.userRepository = new UserRepository(userData);
this.donationRepository = new DonationRepository(donationData);
OrganizationRepository organizationRepository = new OrganizationRepository(organizationData);

// Create services (backend wiring)
UserService userService = new UserService(this.userRepository);
DonationService donationService = new DonationService(this.donationRepository, organizationRepository);
OrganizationService organizationService = new OrganizationService(organizationRepository);

Scene scene = controller.getMainView().getScene();
controller.showLoginPage();
this.controller = new MainController(userService, donationService, organizationService);

this.scene = controller.getMainView().getScene();
}

@Override
public void start(Stage stage) {
this.controller.showLoginPage();

stage.getIcons().add(new Image(getClass().getResource("/header/images/hmh-logo.png").toExternalForm()));
stage.setTitle("Help-Me-Help");
stage.setScene(scene);
stage.setScene(this.scene);
stage.show();
}

@Override
public void stop() throws Exception {
super.stop();
this.logger.info("Application stopping");
this.dbWrapper.connect();
this.dbWrapper.exportUsers(this.userRepository.export());
this.dbWrapper.exportDonations(this.donationRepository.export());
this.dbWrapper.disconnect();
}

public static void main(String[] args) {
launch(args);
}
}
Original file line number Diff line number Diff line change
@@ -1,14 +1,16 @@
package edu.group5.app.control;

import edu.group5.app.model.organization.Organization;

public class BrowseCardController {
private final MainController controller;

public BrowseCardController(MainController mainController) {
this.controller = mainController;
}

public void handleCardClick() {
System.out.println("Browse Card Clicked");
public void handleCardClick(Organization organization) {
controller.setCurrentOrganization(organization);
controller.showOrganizationPage();
}
}
33 changes: 32 additions & 1 deletion src/main/java/edu/group5/app/control/LoginPageController.java
Original file line number Diff line number Diff line change
@@ -1,11 +1,42 @@
package edu.group5.app.control;

import edu.group5.app.model.user.User;
import edu.group5.app.model.user.UserService;
import edu.group5.app.view.loginpage.LoginPageView;

public class LoginPageController {
private final MainController controller;
private final UserService userService;
private LoginPageView view;

public LoginPageController(MainController controller) {
public LoginPageController(MainController controller, UserService userService) {
this.controller = controller;
this.userService = userService;
}

public void setView(LoginPageView view) {
this.view = view;
}

public void handleLoginBtn() {
String email = view.getEmail();
char[] passwordChars = view.getPassword();

if (email == null || email.trim().isEmpty() || passwordChars == null || passwordChars.length == 0) {
view.showError("Email and password are required");
return;
}

User user = userService.login(email, passwordChars);

if (user != null) {
controller.setCurrentUser(user);
controller.showHomePage();
} else {
view.showError("Invalid email or password");
}
}

public void handleRegisterBtn() {
System.out.println("Sign in button pressed");
controller.showSignInPage();
Expand Down
50 changes: 48 additions & 2 deletions src/main/java/edu/group5/app/control/MainController.java
Original file line number Diff line number Diff line change
@@ -1,10 +1,16 @@
package edu.group5.app.control;

import edu.group5.app.control.donationpage.DonationPageController;
import edu.group5.app.model.donation.DonationService;
import edu.group5.app.model.organization.Organization;
import edu.group5.app.model.organization.OrganizationService;
import edu.group5.app.model.user.User;
import edu.group5.app.model.user.UserService;
import edu.group5.app.view.MainView;
import edu.group5.app.view.donationpage.DonationPageView;

import java.math.BigDecimal;

public class MainController {
private final MainView view;
private final HeaderController headerController;
Expand All @@ -13,10 +19,20 @@ public class MainController {
private final BrowseCardController browseCardController;
private final OrganizationPageController organizationPageController;
private final DonationPageController donationPageController;
private final UserService userService;
private final DonationService donationService;
private final OrganizationService organizationService;
private User currentUser;
private Organization currentOrganization;
private BigDecimal currentDonationAmount;

public MainController(UserService userService, DonationService donationService,
OrganizationService organizationService) {
this.userService = userService;
this.donationService = donationService;
this.organizationService = organizationService;

public MainController() {
this.view = new MainView(this);
this.view = new MainView(this, userService);
this.headerController = new HeaderController(this);
this.homePageController = new HomePageController(this);
this.browsePageController = new BrowsePageController(this);
Expand All @@ -25,6 +41,18 @@ public MainController() {
this.donationPageController = new DonationPageController(this);
}

public UserService getUserService() {
return userService;
}

public DonationService getDonationService() {
return donationService;
}

public OrganizationService getOrganizationService() {
return organizationService;
}

public void setCurrentUser(User user) {
this.currentUser = user;
}
Expand All @@ -33,8 +61,26 @@ public User getCurrentUser() {
return this.currentUser;
}

public void setCurrentOrganization(Organization organization) {
this.currentOrganization = organization;
}

public Organization getCurrentOrganization() {
return this.currentOrganization;
}

public void setCurrentDonationAmount(BigDecimal amount) {
this.currentDonationAmount = amount;
}

public BigDecimal getCurrentDonationAmount() {
return this.currentDonationAmount;
}

public void logout() {
currentUser = null;
currentOrganization = null;
currentDonationAmount = null;
showLoginPage();
}

Expand Down
47 changes: 44 additions & 3 deletions src/main/java/edu/group5/app/control/SignInPageController.java
Original file line number Diff line number Diff line change
@@ -1,15 +1,56 @@
package edu.group5.app.control;
import edu.group5.app.model.user.UserService;
import edu.group5.app.view.loginpage.SignInPageView;

import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;

import edu.group5.app.model.user.User;

public class SignInPageController {
private final MainController controller;
private final UserService userService;
private SignInPageView view;

public SignInPageController(MainController controller) {
public SignInPageController(MainController controller, UserService userService) {
this.controller = controller;
this.userService = userService;
}

public void setView(SignInPageView view) {
this.view = view;
}

public void handleSignInBtn() {
System.out.println("Sign in button pressed");
controller.showHomePage();
String firstName = view.getFirstName();
String lastName = view.getLastName();
String email = view.getEmail();
char[] passwordChars = view.getPassword();

if (firstName == null || firstName.trim().isEmpty() ||
lastName == null || lastName.trim().isEmpty() ||
email == null || email.trim().isEmpty() ||
passwordChars == null || passwordChars.length == 0) {
view.showError("All fields are required");
return;
}

String password = new String(passwordChars);
BCryptPasswordEncoder encoder = new BCryptPasswordEncoder();
String hashedPassword = encoder.encode(password);

boolean success = userService.registerUser(
"Customer", firstName, lastName, email, hashedPassword);

if (success) {
User user = userService.getUserByEmail(email);

controller.setCurrentUser(user);
controller.showHomePage();
} else {
view.showError("Registration failed. Email may already be in use.");
}
}

public void handleLoginBtn() {
System.out.println("Back to login button pressed");
controller.showLoginPage();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
package edu.group5.app.control.donationpage;

import edu.group5.app.control.MainController;
import edu.group5.app.model.organization.Organization;
import edu.group5.app.model.user.Customer;
import edu.group5.app.model.user.User;

import java.math.BigDecimal;

public class DonationPageController {
private final MainController controller;
Expand All @@ -9,7 +14,46 @@ public DonationPageController(MainController controller) {
this.controller = controller;
}
public void handleDonationBtn() {
System.out.println("Donating");
// Get session data from MainController
User currentUser = controller.getCurrentUser();
Organization currentOrg = controller.getCurrentOrganization();
BigDecimal amount = controller.getCurrentDonationAmount();

if (currentUser == null) {
System.err.println("Error: No user logged in");
return;
}
if (!(currentUser instanceof Customer customer)) {
System.err.println("Error: Only customers can donate");
return;
}
if (currentOrg == null) {
System.err.println("Error: No organization selected");
return;
}
if (amount == null || amount.compareTo(BigDecimal.ZERO) <= 0) {
System.err.println("Error: Invalid donation amount");
return;
}

// Create donation via service
boolean success = controller.getDonationService().donate(
customer,
currentOrg.orgNumber(),
amount,
"Online"
);

if (success) {
System.out.println("Donation created: " + amount + " kr to " + currentOrg.name());
} else {
System.err.println("Failed to create donation");
}

// Clear donation session state
controller.setCurrentDonationAmount(null);

// Navigate to payment complete
controller.showPaymentCompletePage();
}

Expand Down
Loading