Skip to content

Commit

Permalink
refactor: implement proper MVC architecture with controller-service a…
Browse files Browse the repository at this point in the history
…bstraction
  • Loading branch information
Fredrik Marjoni committed Apr 16, 2026
1 parent c67227b commit 92b41fd
Show file tree
Hide file tree
Showing 18 changed files with 51 additions and 103 deletions.
1 change: 0 additions & 1 deletion src/main/java/edu/group5/app/control/AuthController.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package edu.group5.app.control;

import edu.group5.app.model.AppState;
import edu.group5.app.model.organization.Organization;
import edu.group5.app.model.user.User;
import edu.group5.app.model.user.UserService;
import edu.group5.app.utils.ParameterValidator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -83,7 +83,7 @@ public String getPaymentMethod() {
*/
public Map<Integer, Donation> getUserDonations(int userId) {
ParameterValidator.intChecker(userId, "User ID");
return service.getDonationRepository().filterByUser(userId);
return service.getUserDonations(userId);
}

/**
Expand Down
12 changes: 6 additions & 6 deletions src/main/java/edu/group5/app/control/NavigationController.java
Original file line number Diff line number Diff line change
Expand Up @@ -63,7 +63,7 @@ public NavigationController(BorderPane root, AppState appState, UserService user
*/
public void showHomePage() {
root.setTop(header);
root.setCenter(new HomePageView(appState, this));
root.setCenter(new HomePageView(this));
}

/**
Expand All @@ -72,7 +72,7 @@ public void showHomePage() {
*/
public void showLoginPage() {
root.setTop(loginHeader);
root.setCenter(new LoginPageView(appState, this, authController));
root.setCenter(new LoginPageView(this, authController));
}

/**
Expand All @@ -81,7 +81,7 @@ public void showLoginPage() {
*/
public void showSignUpPage() {
root.setTop(loginHeader);
root.setCenter(new SignUpPageView(appState, this, authController));
root.setCenter(new SignUpPageView(this, authController));
}

/**
Expand All @@ -99,7 +99,7 @@ public void showPaymentCompletePage() {
*/
public void showCausesPage() {
root.setTop(header);
root.setCenter(new CausesPageView(appState, this, organizationController));
root.setCenter(new CausesPageView(this, organizationController));
}

/**
Expand All @@ -109,7 +109,7 @@ public void showCausesPage() {
*/
public void showOrganizationPage() {
root.setTop(header);
root.setCenter(new OrganizationPageView(appState, this, donationController));
root.setCenter(new OrganizationPageView(this, organizationController, donationController));
}

/**
Expand All @@ -118,7 +118,7 @@ public void showOrganizationPage() {
*/
public void showDonationPage() {
root.setTop(header);
root.setCenter(new DonationPageView(appState, this, donationController));
root.setCenter(new DonationPageView(this, donationController));
}

public void showAboutUsPage() {
Expand Down
21 changes: 11 additions & 10 deletions src/main/java/edu/group5/app/model/donation/DonationService.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
package edu.group5.app.model.donation;
import java.time.Instant;
import java.util.Map;
import java.math.BigDecimal;
import java.sql.Timestamp;
import edu.group5.app.model.organization.Organization;
Expand Down Expand Up @@ -34,21 +35,21 @@ public DonationService(DonationRepository donationRepository,
}

/**
* Getter for the DonationRepository used by this service.
* This method allows access to the donation repository for managing donation records and retrieving donation information.
* @return the DonationRepository instance used by this service
* Gets all donations made by a specific user.
* @param userId the ID of the user
* @return a map of donations made by that user
*/
public DonationRepository getDonationRepository() {
return this.donationRepository;
public Map<Integer, Donation> getUserDonations(int userId) {
return donationRepository.filterByUser(userId);
}

/**
* Getter for the OrganizationRepository used by this service.
* This method allows access to the organization repository for validating organization information when processing donations.
* @return the OrganizationRepository instance used by this service
* Gets all donations to a specific organization.
* @param organizationId the organization ID
* @return map of donations to that organization
*/
public OrganizationRepository getOrganizationRepository() {
return this.organizationRepository;
public Map<Integer, Donation> getOrganizationDonations(int organizationId) {
return donationRepository.filterByOrganization(organizationId);
}

/**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -35,14 +35,6 @@ public OrganizationService(OrganizationRepository organizationRepository, Organi
this.scraper = scraper;
}

/**
* Getter for the OrganizationRepository used by this service.
* @return the OrganizationRepository instance used by this service
*/
public OrganizationRepository getOrganizationRepository() {
return this.organizationRepository;
}

/**
* Retrieves all trusted organizations.
* @return a map of trusted organizations by organization number
Expand Down
1 change: 0 additions & 1 deletion src/main/java/edu/group5/app/model/user/User.java
Original file line number Diff line number Diff line change
@@ -1,5 +1,4 @@
package edu.group5.app.model.user;
import java.lang.reflect.Parameter;

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

Expand Down
11 changes: 0 additions & 11 deletions src/main/java/edu/group5/app/model/user/UserService.java
Original file line number Diff line number Diff line change
Expand Up @@ -25,17 +25,6 @@ public UserService(UserRepository userRepository) {
this.userRepository = userRepository;
}

/**
* Getter for the UserRepository used by this service.
* This method allows access to the user repository for managing user data and
* performing operations such as registration and login.
*
* @return the UserRepository instance used by this service
*/
public UserRepository getUserRepository() {
return this.userRepository;
}

/**
* Registers a new user with the given information. Validates the input data and
* creates a new User object
Expand Down
11 changes: 4 additions & 7 deletions src/main/java/edu/group5/app/view/causespage/CausesPageView.java
Original file line number Diff line number Diff line change
Expand Up @@ -34,19 +34,16 @@
* a fallback "no image" is displayed.</p>
*/
public class CausesPageView extends BorderPane {
private final AppState appState;
private final NavigationController nav;
private final OrganizationController orgController;

private GridPane organizationGrid;
private Map<Integer, Organization> allOrganizations;

public CausesPageView(AppState appState, NavigationController nav, OrganizationController orgController) {
ParameterValidator.objectChecker(appState, "AppState");
public CausesPageView(NavigationController nav, OrganizationController orgController) {
ParameterValidator.objectChecker(nav, "NavigationController");
ParameterValidator.objectChecker(orgController, "OrganizationController");

this.appState = appState;
this.nav = nav;
this.orgController = orgController;

Expand Down Expand Up @@ -94,9 +91,9 @@ private BorderPane createBody() {
card.updateLogo(entry.getValue().logoUrl());
}
}
Organization currentOrg = appState.getCurrentOrganization();
Organization currentOrg = orgController.getCurrentOrganization();
if (currentOrg != null && orgs.containsKey(currentOrg.orgNumber())) {
appState.setCurrentOrganization(orgs.get(currentOrg.orgNumber()));
orgController.setCurrentOrganization(orgs.get(currentOrg.orgNumber()));
}
});
});
Expand Down Expand Up @@ -165,7 +162,7 @@ private GridPane createOrganizationSection(String searchTerm) {
? org.logoUrl()
: null;

OrganizationCard card = new OrganizationCard(appState, nav, org, img);
OrganizationCard card = new OrganizationCard(nav, orgController, org, img);

grid.add(card, column, row);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,8 @@
package edu.group5.app.view.causespage;

import edu.group5.app.control.NavigationController;
import edu.group5.app.model.AppState;
import edu.group5.app.control.OrganizationController;
import edu.group5.app.model.organization.Organization;
import edu.group5.app.utils.ParameterValidator;
import javafx.geometry.Pos;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
Expand All @@ -22,15 +21,16 @@
* to the organization's detail page.</p>
*/
public class OrganizationCard extends VBox {
private final AppState appState;
private final Organization organization;
private final NavigationController nav;
private final OrganizationController organizationController;
private StackPane imageContainer;
private String currentLogoUrl;

public OrganizationCard(AppState appstate, NavigationController nav, Organization org, String img) {
this.appState = appstate;
public OrganizationCard(NavigationController nav, OrganizationController organizationController,
Organization org, String img) {
this.nav = nav;
this.organizationController = organizationController;
this.organization = org;
setId("mainContainer");
getStylesheets().add(getClass().getResource("/browsepage/browse_org.css").toExternalForm());
Expand All @@ -43,7 +43,7 @@ public OrganizationCard(AppState appstate, NavigationController nav, Organizatio
);

setOnMouseClicked(e -> {
appstate.setCurrentOrganization(getOrganizationWithCurrentLogo());
organizationController.setCurrentOrganization(getOrganizationWithCurrentLogo());
nav.showOrganizationPage();
});

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import edu.group5.app.control.DonationController;
import edu.group5.app.control.NavigationController;
import edu.group5.app.model.AppState;
import edu.group5.app.utils.ParameterValidator;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
Expand All @@ -28,7 +27,6 @@
* payment method buttons, donation button, and a back to organization page button. </p>
*/
public class DonationPageView extends BorderPane {
private final AppState appState;
private final NavigationController nav;
private final DonationController donationController;

Expand All @@ -37,12 +35,10 @@ public class DonationPageView extends BorderPane {
private Node selectedPaymentMethod = null;
private Button donateBtn;

public DonationPageView(AppState appState, NavigationController nav, DonationController donationController) {
ParameterValidator.objectChecker(appState, "AppState");
public DonationPageView(NavigationController nav, DonationController donationController) {
ParameterValidator.objectChecker(nav, "NavigationController");
ParameterValidator.objectChecker(donationController, "DonationController");

this.appState = appState;
this.nav = nav;
this.donationController = donationController;

Expand Down Expand Up @@ -219,7 +215,7 @@ private void selectPaymentMethod(Node element) {
selectedPaymentMethod.getStyleClass().add("payment-method-selected");

String paymentMethod = (String) element.getUserData();
appState.setCurrentPaymentMethod(paymentMethod);
donationController.setPaymentMethod(paymentMethod);
updateDonationButtonState();
}

Expand All @@ -243,7 +239,7 @@ private void clearSelection() {
}

private void updateDonationAmount(BigDecimal amount) {
appState.setCurrentDonationAmount(amount);
donationController.setDonationAmount(amount);
}

private BigDecimal parseAmount(String amountStr) {
Expand Down
5 changes: 1 addition & 4 deletions src/main/java/edu/group5/app/view/homepage/HomePageView.java
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
package edu.group5.app.view.homepage;

import edu.group5.app.control.NavigationController;
import edu.group5.app.model.AppState;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.ScrollPane;
Expand All @@ -19,11 +18,9 @@
* and an about us button. The page also has a charity image at the bottom.</p>
*/
public class HomePageView extends BorderPane {
private final AppState appState;
private final NavigationController nav;

public HomePageView(AppState appState, NavigationController nav) {
this.appState = appState;
public HomePageView(NavigationController nav) {
this.nav = nav;

getStylesheets().add(getClass().getResource("/homepage/homepage.css").toExternalForm());
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import edu.group5.app.control.NavigationController;
import edu.group5.app.control.AuthController;
import edu.group5.app.model.AppState;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
Expand All @@ -21,16 +20,14 @@
* a login box, an email box, a login button, and a register button.</p>
*/
public class LoginPageView extends BorderPane {
private final AppState appState;
private final NavigationController nav;
private final AuthController authController;

private TextField emailField;
private PasswordField passwordField;
private Label errorLabel;

public LoginPageView(AppState appState, NavigationController nav, AuthController authController) {
this.appState = appState;
public LoginPageView(NavigationController nav, AuthController authController) {
this.nav = nav;
this.authController = authController;

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,6 @@

import edu.group5.app.control.NavigationController;
import edu.group5.app.control.AuthController;
import edu.group5.app.model.AppState;
import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
Expand All @@ -22,7 +21,6 @@
* a password field, a sign up button, and an back to login button.</P>
*/
public class SignUpPageView extends BorderPane {
private final AppState appState;
private final NavigationController nav;
private final AuthController authController;

Expand All @@ -32,8 +30,7 @@ public class SignUpPageView extends BorderPane {
private PasswordField passwordField;
private Label errorLabel;

public SignUpPageView(AppState appState, NavigationController nav, AuthController authController) {
this.appState = appState;
public SignUpPageView(NavigationController nav, AuthController authController) {
this.nav = nav;
this.authController = authController;

Expand Down
Loading

0 comments on commit 92b41fd

Please sign in to comment.