diff --git a/docs/Domenemodell/Domene Diagram 2.pdf b/docs/Domenemodell/Domene Diagram 2.pdf new file mode 100644 index 00000000..4277ec0f Binary files /dev/null and b/docs/Domenemodell/Domene Diagram 2.pdf differ diff --git a/docs/Manuals/Installation Guide HmH.pdf b/docs/Manuals/Installation Guide HmH.pdf new file mode 100644 index 00000000..e92399b1 Binary files /dev/null and b/docs/Manuals/Installation Guide HmH.pdf differ diff --git a/docs/Manuals/media/image1.png b/docs/Manuals/media/image1.png new file mode 100644 index 00000000..ccb37b6a Binary files /dev/null and b/docs/Manuals/media/image1.png differ diff --git a/docs/Manuals/media/image2.png b/docs/Manuals/media/image2.png new file mode 100644 index 00000000..22fcb9ce Binary files /dev/null and b/docs/Manuals/media/image2.png differ diff --git a/docs/Manuals/media/image3.png b/docs/Manuals/media/image3.png new file mode 100644 index 00000000..d98f38b1 Binary files /dev/null and b/docs/Manuals/media/image3.png differ diff --git a/docs/Manuals/media/image4.png b/docs/Manuals/media/image4.png new file mode 100644 index 00000000..e0a8696b Binary files /dev/null and b/docs/Manuals/media/image4.png differ diff --git a/docs/Manuals/media/image5.png b/docs/Manuals/media/image5.png new file mode 100644 index 00000000..8dcf6b34 Binary files /dev/null and b/docs/Manuals/media/image5.png differ diff --git a/docs/Manuals/media/image6.png b/docs/Manuals/media/image6.png new file mode 100644 index 00000000..4bafc2f5 Binary files /dev/null and b/docs/Manuals/media/image6.png differ diff --git a/docs/design/Universal Design.pdf b/docs/design/Universal Design.pdf new file mode 100644 index 00000000..09aca337 Binary files /dev/null and b/docs/design/Universal Design.pdf differ diff --git a/docs/persistence/Persistence.pdf b/docs/persistence/Persistence.pdf new file mode 100644 index 00000000..ee02cf1e Binary files /dev/null and b/docs/persistence/Persistence.pdf differ diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java index a78be83e..966cf897 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/HmHApplication.java @@ -3,7 +3,12 @@ import static javafx.application.Application.launch; import java.net.http.HttpClient; +import java.util.Objects; + import javafx.application.Application; +import javafx.fxml.FXMLLoader; +import javafx.scene.Scene; +import javafx.scene.image.Image; import javafx.stage.Stage; import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.database.DatabaseSetup; @@ -15,7 +20,6 @@ public class HmHApplication extends Application { @Override public void start(Stage stage) throws Exception { - /* FXMLLoader fxmlLoader = new FXMLLoader(HmHApplication.class.getResource("/fxml/frontPage.fxml")); Scene scene = new Scene(fxmlLoader.load()); @@ -30,8 +34,6 @@ public void start(Stage stage) throws Exception { stage.setFullScreen(true); stage.show(); - */ - } @Override diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java index 47a36eb8..ee3a19f1 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/AvailableOrganizationController.java @@ -9,6 +9,10 @@ import javafx.scene.Parent; import javafx.scene.control.TextField; import javafx.scene.layout.FlowPane; +import ntnu.systemutvikling.team6.controller.components.BaseController; +import ntnu.systemutvikling.team6.controller.components.LoaderScene; +import ntnu.systemutvikling.team6.controller.components.NavbarFooterController; +import ntnu.systemutvikling.team6.controller.components.OrganizationCardController; import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.database.Readers.CharitySelect; import ntnu.systemutvikling.team6.models.Charity; @@ -22,7 +26,7 @@ * on the featured charity to see more details about it. The user can also switch to the charity * page or donation page for the selected charity. */ -public class AvailableOrganizationController { +public class AvailableOrganizationController extends BaseController implements NavbarFooterController { @FXML private TextField searchField; @FXML private FlowPane cardsContainer; @@ -88,7 +92,7 @@ private void displayCharities(List charities) { for (Charity charity : charities) { try { - FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/organizationCard.fxml")); + FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/components/organizationCard.fxml")); Parent card = loader.load(); OrganizationCardController cardController = loader.getController(); @@ -115,15 +119,6 @@ public void setInitialSearch(String query) { searchField.setText(query); } - /** - * This method is used to switch to the front page. - * - * @param event action event from button click - */ - @FXML - public void switchToFrontPage(ActionEvent event) { - LoaderScene.LoadScene("FrontPage", event, charity, null); - } /** * This method is used to switch to the charity page for the selected charity. diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/CharityPageController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/CharityPageController.java index b52064f6..121ad3be 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/CharityPageController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/CharityPageController.java @@ -4,6 +4,7 @@ import javafx.fxml.FXML; import javafx.scene.control.Label; import javafx.scene.control.TextField; +import ntnu.systemutvikling.team6.controller.components.LoaderScene; import ntnu.systemutvikling.team6.models.Charity; /** @@ -40,16 +41,6 @@ public void setCharity(Charity charity) { CharityName.setText(charity.getName()); } - /** - * This method is used to switch to the front page. - * - * @param event - */ - @FXML - public void switchToFrontPage(ActionEvent event) { - System.out.println("Click"); - LoaderScene.LoadScene("FrontPage", event, charity, null); - } /** * This method is used to switch to the donation page. diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/DonationPageController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/DonationPageController.java index d07910c8..4a69ed54 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/DonationPageController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/DonationPageController.java @@ -7,7 +7,9 @@ import javafx.scene.control.ButtonType; import javafx.scene.control.Label; import javafx.scene.control.TextField; -import ntnu.systemutvikling.team6.DAO.DonationDAO; +import ntnu.systemutvikling.team6.controller.components.LoaderScene; +import ntnu.systemutvikling.team6.database.DAO.DonationDAO; +import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.models.Charity; import ntnu.systemutvikling.team6.models.user.User; @@ -24,6 +26,8 @@ public class DonationPageController { @FXML private TextField donationSearchField; + private DonationDAO donationSender = new DonationDAO(new DatabaseConnection()); + /** * Initialize method for the donation page. Sets the charity name label to the name of the charity * that is being donated to. The charity is set from the original page it was called from when the @@ -116,7 +120,7 @@ public void Donate(ActionEvent event) { * @param amount */ public void processDonation(Charity charity, User user, double amount) { - DonationDAO.addDonation(charity, user, amount); + donationSender.addDonation(charity, user, amount); } /** diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java index 91ac90cd..b5b45226 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/FrontpageController.java @@ -12,6 +12,10 @@ import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.FlowPane; +import ntnu.systemutvikling.team6.controller.components.BaseController; +import ntnu.systemutvikling.team6.controller.components.LoaderScene; +import ntnu.systemutvikling.team6.controller.components.NavbarFooterController; +import ntnu.systemutvikling.team6.controller.components.OrganizationCardController; import ntnu.systemutvikling.team6.database.DatabaseConnection; import ntnu.systemutvikling.team6.database.Readers.CharitySelect; import ntnu.systemutvikling.team6.database.Readers.DonationSelect; @@ -27,7 +31,7 @@ * it, or click on the featured charity to see more details about it. It also has buttons to switch * to the charity page and the donation page for the featured charity */ -public class FrontpageController { +public class FrontpageController extends BaseController implements NavbarFooterController { @FXML private Charity featuredCharity; @FXML private FlowPane cardsContainer; @FXML private Label Carosel_Organisasjon; @@ -43,6 +47,11 @@ public class FrontpageController { private List allCharities = new ArrayList<>(); + @Override + protected void authTokenisSet(){ + + } + /** * Initialize method for the front page. This method is called when the front page is loaded. It * retrieves the list of charities and donations from the database. The list of charities is @@ -88,6 +97,7 @@ public void initialize() { } } + /** * This method is used to switch to the charity page for the selected charity * @@ -210,7 +220,7 @@ private void displayCharities(List charities) { for (Charity charity : charities) { try { - FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/organizationCard.fxml")); + FXMLLoader loader = new FXMLLoader(getClass().getResource("/fxml/components/organizationCard.fxml")); Parent card = loader.load(); OrganizationCardController cardController = loader.getController(); cardController.setOrganization(charity); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/BaseController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/BaseController.java new file mode 100644 index 00000000..da4af23a --- /dev/null +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/BaseController.java @@ -0,0 +1,17 @@ +package ntnu.systemutvikling.team6.controller.components; + +import ntnu.systemutvikling.team6.service.AuthenticationService; + +public abstract class BaseController { + protected AuthenticationService authToken; + + public void setAuthToken(AuthenticationService authToken){ + this.authToken = authToken; + authTokenisSet(); + }; + protected void authTokenisSet(){} // Do stuff after authtoken is set, on each controller + + protected boolean isLoggedin(){ + return authToken.isLoggedin() && authToken != null; + } +} diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/LoaderScene.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/LoaderScene.java similarity index 90% rename from helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/LoaderScene.java rename to helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/LoaderScene.java index 12f7f9b3..30236e9a 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/LoaderScene.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/LoaderScene.java @@ -1,4 +1,4 @@ -package ntnu.systemutvikling.team6.controller; +package ntnu.systemutvikling.team6.controller.components; import java.io.IOException; import java.util.Objects; @@ -10,6 +10,9 @@ import javafx.scene.image.Image; import javafx.stage.Stage; import ntnu.systemutvikling.team6.HmHApplication; +import ntnu.systemutvikling.team6.controller.AvailableOrganizationController; +import ntnu.systemutvikling.team6.controller.CharityPageController; +import ntnu.systemutvikling.team6.controller.DonationPageController; import ntnu.systemutvikling.team6.models.Charity; /** diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/NavbarFooterController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/NavbarFooterController.java new file mode 100644 index 00000000..0075893f --- /dev/null +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/NavbarFooterController.java @@ -0,0 +1,33 @@ +package ntnu.systemutvikling.team6.controller.components; + +import javafx.event.ActionEvent; +import javafx.fxml.FXML; +import javafx.scene.control.TextField; + +public interface NavbarFooterController { + + default void switchToFrontPage(ActionEvent event) { + System.out.println("Click!"); + LoaderScene.LoadScene("FrontPage", event, null, null); + } + + default void switchToAboutPage(ActionEvent event) { + System.out.println("Click!"); + LoaderScene.LoadScene("aboutPage", event, null, null); + } + + default void switchToProfilePage(ActionEvent event) { + System.out.println("Click!"); + LoaderScene.LoadScene("aboutPage", event, null, null); + } + + default void handleSearch(ActionEvent event) { + System.out.println("Click!"); + LoaderScene.LoadScene("aboutPage", event, null, null); + } + + default void switchToLoginPage(ActionEvent event) { + System.out.println("Click!"); + LoaderScene.LoadScene("aboutPage", event, null, null); + } +} diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/OrganizationCardController.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/OrganizationCardController.java similarity index 94% rename from helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/OrganizationCardController.java rename to helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/OrganizationCardController.java index b0ce278a..7644bbf8 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/OrganizationCardController.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/controller/components/OrganizationCardController.java @@ -1,4 +1,4 @@ -package ntnu.systemutvikling.team6.controller; +package ntnu.systemutvikling.team6.controller.components; import javafx.event.ActionEvent; import javafx.fxml.FXML; diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/DAO/DonationDAO.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DAO/DonationDAO.java similarity index 82% rename from helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/DAO/DonationDAO.java rename to helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DAO/DonationDAO.java index 8b6cbf45..730accac 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/DAO/DonationDAO.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DAO/DonationDAO.java @@ -1,4 +1,4 @@ -package ntnu.systemutvikling.team6.DAO; +package ntnu.systemutvikling.team6.database.DAO; import java.sql.*; import java.util.UUID; @@ -11,16 +11,20 @@ * Database. Usally called from the DonationPageController, where the user confirms their donation. */ public class DonationDAO { - private static final DatabaseConnection connection = new DatabaseConnection(); + private final DatabaseConnection connection; - /** + public DonationDAO(DatabaseConnection connection) { + this.connection = connection; + } + + /** * Gets the total ammount of donations for a given charity, and sends it to the database throught * MySQL. * * @param charity * @param amount */ - public static void addDonation(Charity charity, User user, double amount) { + public void addDonation(Charity charity, User user, double amount) { String sql_query = """ INSERT INTO Donations (UUID_Donations, amount, date, charity_id, user_id) diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/DAO/UserDAO.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DAO/UserDAO.java similarity index 73% rename from helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/DAO/UserDAO.java rename to helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DAO/UserDAO.java index 19c7714a..2125a088 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/DAO/UserDAO.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DAO/UserDAO.java @@ -1,4 +1,4 @@ -package ntnu.systemutvikling.team6.DAO; +package ntnu.systemutvikling.team6.database.DAO; import java.sql.Connection; import java.sql.PreparedStatement; @@ -14,16 +14,21 @@ */ public class UserDAO { - private static final DatabaseConnection connection = new DatabaseConnection(); + private final DatabaseConnection connection; - /** + public UserDAO(DatabaseConnection connection) { + this.connection = connection; + } + + /** * Gets the user and settings information and sends it to the database through MySQL. * + * * @param user the user to be saved in the database. * @throws RuntimeException if a database error occurs during the operation + * @return true or false based on if the register is a success or not */ - public static void registerUser(User user) { - + public boolean registerUser(User user) { String userSql = """ INSERT INTO User ( @@ -48,6 +53,9 @@ INSERT INTO Settings ( VALUES (?, ?, ?, ?) """; + int psUserRows = 0; + int psSettingsRows = 0; + try (Connection conn = connection.getMySqlConnection()) { conn.setAutoCommit(false); @@ -55,13 +63,13 @@ INSERT INTO Settings ( try (PreparedStatement psUser = conn.prepareStatement(userSql)) { psUser.setString(1, user.getId().toString()); - psUser.setString(2, user.getName()); // display name - psUser.setString(3, user.getName()); // username + psUser.setString(2, user.getDisplayName()); // display name + psUser.setString(3, user.getUsername()); // username psUser.setString(4, user.getEmail()); psUser.setString(5, user.getPasswordHash()); psUser.setString(6, user.getRole().name()); - psUser.executeUpdate(); + psUserRows = psUser.executeUpdate(); } try (PreparedStatement psSettings = conn.prepareStatement(settingsSql)) { @@ -71,13 +79,16 @@ INSERT INTO Settings ( psSettings.setString(3, user.getSettings().getLanguage().name()); psSettings.setBoolean(4, user.getSettings().isLightMode()); - psSettings.executeUpdate(); + psSettingsRows = psSettings.executeUpdate(); + } conn.commit(); + return psUserRows > 0 && psSettingsRows > 0; } catch (SQLException e) { - throw new RuntimeException("Failed to insert user into database", e); + e.printStackTrace(); + return false; } } } diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java index e5775da3..a4217afd 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/DatabaseSetup.java @@ -42,7 +42,6 @@ public boolean testConnection() { System.out.println("Database connection failed."); e.printStackTrace(); } - return false; } @@ -74,6 +73,7 @@ PRIMARY KEY (`UUID_charities`), CREATE TABLE IF NOT EXISTS `apbaluna`.`Donations` ( `UUID_Donations` CHAR(36) NOT NULL, `amount` DECIMAL NOT NULL, + `isAnonymous` TINYINT NOT NULL, `date` DATE NOT NULL, `charity_id` CHAR(36) NOT NULL, `user_id` CHAR(36) NOT NULL, @@ -260,12 +260,11 @@ FOREIGN KEY (`User_UUID_User`) `key_values` TEXT NULL, `logoBLOB` MEDIUMBLOB NULL, INDEX `fk_CharityVanity_Charities1_idx` (`UUID_charity` ASC) VISIBLE, - PRIMARY KEY (`UUID_charity`), CONSTRAINT `fk_CharityVanity_Charities1` FOREIGN KEY (`UUID_charity`) REFERENCES `apbaluna`.`Charities` (`UUID_charities`) ON DELETE NO ACTION - ON UPDATE NO ACTION) + ON UPDATE CASCADE) ENGINE = InnoDB; """; diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java index a3b5d324..c59db00c 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/CharitySelect.java @@ -60,13 +60,13 @@ public CharityRegistry getCharitiesFromDB() { c.UUID_charities, c.org_number, c.pre_approved, c.status, f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, cv.charity_name, cv.charity_link, cv.description, cv.logoURL, cv.key_values, cv.logoBLOB, - u.UUID_user, u.user_name, u.user_email, u.user_password, u.role, + u.UUID_user, u.user_displayname, u.user_name, u.user_email, u.user_password, u.role, cat.category FROM Charities c LEFT JOIN Feedback f ON f.charity_id = c.UUID_charities LEFT JOIN User u ON f.user_id = u.UUID_user LEFT JOIN Charity_Categories cc ON cc.Charities_UUID_charities = c.UUID_charities - LEFT JOIN Cateegories cat ON cat.category_id = cc.Categories_category_id + LEFT JOIN Categories cat ON cat.category_id = cc.Categories_category_id INNER JOIN CharityVanity cv ON cv.UUID_charity = c.UUID_charities; """; Statement stmt = conn.createStatement(); @@ -110,6 +110,7 @@ public CharityRegistry getCharitiesFromDB() { User userWithMinimalSettingsAndInbox = new User( rs.getString("UUID_User"), + rs.getString("user_displayname"), rs.getString("user_name"), rs.getString("user_email"), rs.getString("user_password"), @@ -158,7 +159,7 @@ public ArrayList getFeedbackforCharityUUID(String charity_uuid) { """ SELECT f.UUID_feedback, f.feedback_comment, f.feedback_date, f.isAnonymous, f.charity_id, f.user_id, - u.UUID_user, u.user_name, u.user_email, u.user_password, u.role + u.UUID_user, u.user_displayname, u.user_name, u.user_email, u.user_password, u.role FROM Feedback f LEFT JOIN User u ON f.user_id = u.UUID_user WHERE f.charity_id = ?; @@ -171,6 +172,7 @@ public ArrayList getFeedbackforCharityUUID(String charity_uuid) { User userWithSettingsAndNoInbox = new User( rs.getString("UUID_User"), + rs.getString("user_displayname"), rs.getString("user_name"), rs.getString("user_email"), rs.getString("user_password"), diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java index 1183d750..f9754889 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/DonationSelect.java @@ -58,8 +58,8 @@ public DonationRegistry getDonationFromDB() { """ SELECT d.UUID_Donations, d.amount, d.isAnonymous, d.date, d.charity_id, d.user_id, - c.UUID_charities, c.org_number, c,pre_approved, c.status, - u.UUID_User, u.user_name, u.user_email, u.user_password, u.role + c.UUID_charities, c.org_number, c.pre_approved, c.status, + u.UUID_User, u.user_displayname, u.user_name, u.user_email, u.user_password, u.role FROM Donations d INNER JOIN Charities c ON d.charity_id = c.UUID_charities INNER JOIN User u ON d.user_id = u.UUID_user @@ -79,6 +79,7 @@ public DonationRegistry getDonationFromDB() { User user = new User( rs.getString("UUID_User"), + rs.getString("user_displayname"), rs.getString("user_name"), rs.getString("user_email"), rs.getString("user_password"), diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java index 8a4d0208..4f467457 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/database/Readers/UserSelect.java @@ -30,6 +30,30 @@ public UserSelect(DatabaseConnection connection) { this.connection = connection; } + public boolean isUsernameTaken(String username){ + try (Connection conn = connection.getMySqlConnection(); + Statement stmt = conn.createStatement()) { + + String mysql = + """ + SELECT UUID_User FROM User WHERE user_name = ? + """; + PreparedStatement statement = conn.prepareStatement(mysql); + statement.setString(1, username); + ResultSet rs = statement.executeQuery(); + + if (rs.next()) { + System.out.println("Username Taken already"); + return true; + } + + } catch (SQLException e) { + e.printStackTrace(); + } + return false; + } + + /** * Retrieves a single {@link User} from the database matching the given username and password. * @@ -59,7 +83,7 @@ public User getUserFromDBUsernameAndPassword(String username, String password) { String sql_query = """ SELECT - u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, + u.UUID_User, u.user_displayname, u.user_name, u.user_email, u.user_password, u.role, s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id FROM User u @@ -80,6 +104,7 @@ public User getUserFromDBUsernameAndPassword(String username, String password) { user = new User( userId, + rs.getString("user_displayname"), rs.getString("user_name"), rs.getString("user_email"), rs.getString("user_password"), @@ -136,7 +161,7 @@ public User getUserFromDBUuid(String user_id) { String sql_query = """ SELECT - u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, + u.UUID_User, u.user_displayname u.user_name, u.user_email, u.user_password, u.role, s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id FROM User u @@ -155,6 +180,7 @@ public User getUserFromDBUuid(String user_id) { user = new User( userId, + rs.getString("user_displayname"), rs.getString("user_name"), rs.getString("user_email"), rs.getString("user_password"), @@ -211,7 +237,7 @@ public UserRegistry getUsersFromDB() { String sql_query = """ SELECT - u.UUID_User, u.user_name, u.user_email, u.user_password, u.role, + u.UUID_User, u.user_displayname u.user_name, u.user_email, u.user_password, u.role, s.User_UUID_User, s.isAnonymous, s.language, s.lightmode, m.UUID_message, m.message_title, m.message_content, m.message_date, m.sender_user_id, m.sender_charity_id, m.user_id FROM User u @@ -231,6 +257,7 @@ public UserRegistry getUsersFromDB() { currentUser = new User( userId, + rs.getString("user_displayname"), rs.getString("user_name"), rs.getString("user_email"), rs.getString("user_password"), diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java index 927e62c4..04fc6969 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/models/user/User.java @@ -17,7 +17,8 @@ public class User { private static final PasswordHasher passwordHasher = new PasswordHasher(); private final UUID id; - private String name; + private String displayName; + private String username; private String email; private String passwordHash; private final Role role; @@ -27,7 +28,8 @@ public class User { /** * Creates a new user. * - * @param name the name of the user + * @param displayName the name of the user that is shown + * @param username unqiue username used for login * @param email the email of the user * @param password the password for the user * @param role users role @@ -36,9 +38,12 @@ public class User { * @throws IllegalArgumentException if any required argument is invalid. */ public User( - String name, String email, String password, Role role, Settings settings, Inbox inbox) { + String displayName, String username, String email, String password, Role role, Settings settings, Inbox inbox) { + if (displayName == null || username.isBlank()){ + throw new IllegalArgumentException("displayName cannot be null or blank."); + } - if (name == null || name.isBlank()) { + if (username == null || username.isBlank()) { throw new IllegalArgumentException("Name cannot be null or blank."); } @@ -60,7 +65,8 @@ public User( } this.id = UUID.randomUUID(); - this.name = name; + this.displayName = displayName; + this.username = username; this.email = email; this.passwordHash = passwordHasher.getHashPassword(password); this.role = role; @@ -73,19 +79,20 @@ public User( * later date throught another method in databaseManager class * * @param uuid gives the user a unique identifier with UUID - * @param name the name of the user + * @param displayName the name of the user that is shown + * @param username the name of the user * @param email the email of the user * @param password the password for the user * @param role users role * @throws IllegalArgumentException if any required argument is invalid. */ - public User(String uuid, String name, String email, String password, String role) { + public User(String uuid, String displayName, String username, String email, String password, String role) { if (uuid == null || uuid.isBlank()) { throw new IllegalArgumentException("UUID cannot be null or blank."); } - if (name == null || name.isBlank()) { + if (username == null || username.isBlank()) { throw new IllegalArgumentException("Name cannot be null or blank."); } @@ -99,7 +106,8 @@ public User(String uuid, String name, String email, String password, String role } this.id = UUID.fromString(uuid); - this.name = name; + this.displayName = displayName; + this.username = username; this.email = email; this.passwordHash = password; this.role = Role.valueOf(role); @@ -113,8 +121,12 @@ public UUID getId() { return id; } - public String getName() { - return name; + public String getDisplayName() { + return displayName; + } + + public String getUsername() { + return username; } public String getEmail() { @@ -145,11 +157,11 @@ public Inbox getInbox() { * @param name the new name * @throws IllegalArgumentException if the name is null or blank */ - public void setName(String name) { + public void setUsername(String name) { if (name == null || name.isBlank()) { throw new IllegalArgumentException("Name cannot be null or blank."); } - this.name = name; + this.username = name; } /** diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/APIToDatabaseService.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/APIToDatabaseService.java index 3edfce7d..06820dc7 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/APIToDatabaseService.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/APIToDatabaseService.java @@ -64,9 +64,13 @@ INSERT INTO CharityVanity (UUID_charity, charity_name, charity_link, description PreparedStatement ps2 = conn.prepareStatement(sql2)) { for (Charity charity : charities) { - String uuid = charity.getUUID() == null - ? UUID.randomUUID().toString() - : charity.getUUID().toString(); + String uuid; + if (charity.getUUID() == null) { + uuid = UUID.randomUUID().toString(); + System.out.println("API object doesnt have UUID, assigning"); + } else { + uuid = charity.getUUID().toString(); + } ps1.setString(1, uuid); ps1.setString(2, charity.getOrg_number().replaceAll("\\s", "")); diff --git a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/AuthenticationService.java b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/AuthenticationService.java index 8b137891..ee780582 100644 --- a/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/AuthenticationService.java +++ b/helpmehelpapplication/src/main/java/ntnu/systemutvikling/team6/service/AuthenticationService.java @@ -1 +1,117 @@ +package ntnu.systemutvikling.team6.service; +import ntnu.systemutvikling.team6.database.DAO.UserDAO; +import ntnu.systemutvikling.team6.database.Readers.UserSelect; +import ntnu.systemutvikling.team6.models.user.Inbox; +import ntnu.systemutvikling.team6.models.user.Role; +import ntnu.systemutvikling.team6.models.user.Settings; +import ntnu.systemutvikling.team6.models.user.User; + + +/** + * Service class responsible for handling user authentication operations, + * including login, registration, and logout functionality. + *

+ * Maintains the state of the currently authenticated user throughout the session. + *

+ */ +public class AuthenticationService { + /** Handles read operations for user data from the database. */ + private final UserSelect userDataReader; + /** Handles write operations for user data to the database. */ + private final UserDAO userDataSender; + + /** The currently authenticated user, or {@code null} if no user is logged in. */ + private User currentUser; + + /** + * Constructs an {@code AuthenticationService} with the specified data access objects. + * + * @param userDataReader the data reader used to query user information from the database + * @param userDataSender the DAO used to persist new user registrations to the database + */ + public AuthenticationService(UserSelect userDataReader, UserDAO userDataSender) { + this.userDataReader = userDataReader; + this.userDataSender = userDataSender; + } + + /** + * Attempts to authenticate a user with the given credentials. + *

+ * If a matching user is found in the database, they are set as the current user + * and the method returns {@code true}. + *

+ * + * @param username the username of the user attempting to log in + * @param password the password of the user attempting to log in + * @return {@code true} if authentication was successful; {@code false} otherwise + */ + public boolean login(String username, String password){ + User user = userDataReader.getUserFromDBUsernameAndPassword(username, password); + + if (user != null){ + currentUser = user; + return true; + } + + return false; + } + + /** + * Registers a new user account with the provided details. + *

+ * The new user is assigned the {@link Role#NORMAL_USER} role and default + * {@link Settings} and {@link Inbox}. Registration will fail if the + * username is already taken or if the database operation is unsuccessful. + * On success, the new user is set as the current user. + *

+ * + * @param displayName the display name shown on the user's profile + * @param username the unique username for the new account + * @param email the email address associated with the new account + * @param password the password for the new account + * @return {@code true} if registration was successful; {@code false} if the + * username is already taken or the database operation failed + */ + public boolean register(String displayName, String username, String email, String password ){ + User newUser = new User(displayName, username, email, password, Role.NORMAL_USER, new Settings(), new Inbox()); + + if(userDataReader.isUsernameTaken(username)){ + return false; + } + + boolean success = userDataSender.registerUser(newUser); + + if (success){ + currentUser = newUser; + return true; + } + return false; + } + + /** + * Logs out the currently authenticated user by clearing the current user state. + */ + public void logout (){ + currentUser = null; + } + + + /** + * Returns the currently authenticated user. + * + * @return the current {@link User}, or {@code null} if no user is logged in + */ + public User getCurrentUser(){ + return currentUser; + } + + /** + * Checks whether a user is currently logged in. + * + * @return {@code true} if a user is authenticated; {@code false} otherwise + */ + public boolean isLoggedin(){ + return currentUser != null; + } +} diff --git a/helpmehelpapplication/src/main/resources/fxml/aboutPage.fxml b/helpmehelpapplication/src/main/resources/fxml/aboutPage.fxml index 8e995428..26dfe910 100644 --- a/helpmehelpapplication/src/main/resources/fxml/aboutPage.fxml +++ b/helpmehelpapplication/src/main/resources/fxml/aboutPage.fxml @@ -32,76 +32,8 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + diff --git a/helpmehelpapplication/src/main/resources/fxml/components/navbar.fxml b/helpmehelpapplication/src/main/resources/fxml/components/navbar.fxml new file mode 100644 index 00000000..f3cca80f --- /dev/null +++ b/helpmehelpapplication/src/main/resources/fxml/components/navbar.fxml @@ -0,0 +1,89 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/helpmehelpapplication/src/main/resources/fxml/organizationCard.fxml b/helpmehelpapplication/src/main/resources/fxml/components/organizationCard.fxml similarity index 97% rename from helpmehelpapplication/src/main/resources/fxml/organizationCard.fxml rename to helpmehelpapplication/src/main/resources/fxml/components/organizationCard.fxml index 47ddc788..94cf11ff 100644 --- a/helpmehelpapplication/src/main/resources/fxml/organizationCard.fxml +++ b/helpmehelpapplication/src/main/resources/fxml/components/organizationCard.fxml @@ -6,7 +6,7 @@ - + diff --git a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DAO/DonationDAOTest.java similarity index 97% rename from helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java rename to helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DAO/DonationDAOTest.java index 902c7a62..5d80c03a 100644 --- a/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/DAO/DonationDAOTest.java +++ b/helpmehelpapplication/src/test/java/ntnu/systemutvikling/team6/database/DAO/DonationDAOTest.java @@ -1,4 +1,4 @@ -package ntnu.systemutvikling.team6.DAO; +package ntnu.systemutvikling.team6.database.DAO; import static org.junit.jupiter.api.Assertions.*;