diff --git a/.gitignore b/.gitignore index e48e2dfd8f1f0d8b88c2d86a3074ed5db53e9f85..4ca2835546023e41c7b1bc6256efe69aab766c98 100644 --- a/.gitignore +++ b/.gitignore @@ -4,6 +4,7 @@ target/ .idea/ *.properties +*.iml # User-specific stuff .idea/**/workspace.xml diff --git a/ImageApplication.iml b/ImageApplication.iml deleted file mode 100644 index e89efabfbd3951717fbebe1d0639cc11592a8044..0000000000000000000000000000000000000000 --- a/ImageApplication.iml +++ /dev/null @@ -1,32 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4"> - <component name="ExternalSystem" externalSystem="Maven" /> - <component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_11"> - <output url="file://$MODULE_DIR$/target/classes" /> - <output-test url="file://$MODULE_DIR$/target/test-classes" /> - <content url="file://$MODULE_DIR$"> - <sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" /> - <sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" /> - <excludeFolder url="file://$MODULE_DIR$/target" /> - </content> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-controls:mac:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-graphics:mac:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-base:mac:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-fxml:mac:13" level="project" /> - <orderEntry type="library" name="Maven: org.slf4j:slf4j-simple:1.7.30" level="project" /> - <orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-controls:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-controls:win:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-graphics:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-graphics:win:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-base:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-base:win:13" level="project" /> - <orderEntry type="library" name="Maven: mysql:mysql-connector-java:8.0.19" level="project" /> - <orderEntry type="library" name="Maven: com.google.protobuf:protobuf-java:3.6.1" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-fxml:13" level="project" /> - <orderEntry type="library" name="Maven: org.openjfx:javafx-fxml:win:13" level="project" /> - <orderEntry type="library" name="Maven: com.zaxxer:HikariCP:3.4.2" level="project" /> - </component> -</module> \ No newline at end of file diff --git a/src/main/java/NTNU/IDATT1002/App.java b/src/main/java/NTNU/IDATT1002/App.java index 0e62956adc3330e09888e7ba18ee60c6c18f9af7..5072c6772fd52919b2cb9bac50b66c1de7b3b6b3 100644 --- a/src/main/java/NTNU/IDATT1002/App.java +++ b/src/main/java/NTNU/IDATT1002/App.java @@ -20,7 +20,7 @@ public class App extends Application { stage.show(); } - static void setRoot(String fxml) throws IOException { + public static void setRoot(String fxml) throws IOException { scene.setRoot(loadFXML(fxml)); } diff --git a/src/main/java/NTNU/IDATT1002/LoggedIn.java b/src/main/java/NTNU/IDATT1002/LoggedIn.java deleted file mode 100644 index a5dfa507ed9751e5fe14709dc113ce179961d824..0000000000000000000000000000000000000000 --- a/src/main/java/NTNU/IDATT1002/LoggedIn.java +++ /dev/null @@ -1,4 +0,0 @@ -package NTNU.IDATT1002; - -public class LoggedIn { -} diff --git a/src/main/java/NTNU/IDATT1002/SecondaryController.java b/src/main/java/NTNU/IDATT1002/SecondaryController.java deleted file mode 100644 index b8a2a3eb70471a14faa03c9d2b9aae9482ab5c4c..0000000000000000000000000000000000000000 --- a/src/main/java/NTNU/IDATT1002/SecondaryController.java +++ /dev/null @@ -1,12 +0,0 @@ -package NTNU.IDATT1002; - -import java.io.IOException; -import javafx.fxml.FXML; - -public class SecondaryController { - - @FXML - private void switchToPrimary() throws IOException { - App.setRoot("login"); - } -} \ No newline at end of file diff --git a/src/main/java/NTNU/IDATT1002/controllers/LoggedInController.java b/src/main/java/NTNU/IDATT1002/controllers/LoggedInController.java new file mode 100644 index 0000000000000000000000000000000000000000..847a6cf7e5f88f0b2a946bcb2703d392f3399f7e --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/controllers/LoggedInController.java @@ -0,0 +1,4 @@ +package NTNU.IDATT1002.controllers; + +public class LoggedInController { +} \ No newline at end of file diff --git a/src/main/java/NTNU/IDATT1002/PrimaryController.java b/src/main/java/NTNU/IDATT1002/controllers/LoginController.java similarity index 63% rename from src/main/java/NTNU/IDATT1002/PrimaryController.java rename to src/main/java/NTNU/IDATT1002/controllers/LoginController.java index 07804a5932394466a0d8ae86453e577175b5b981..1fd4db9edd06cc5c15e1a591111c0053c91f2ad5 100644 --- a/src/main/java/NTNU/IDATT1002/PrimaryController.java +++ b/src/main/java/NTNU/IDATT1002/controllers/LoginController.java @@ -1,14 +1,15 @@ -package NTNU.IDATT1002; +package NTNU.IDATT1002.controllers; import java.io.IOException; +import NTNU.IDATT1002.App; import javafx.event.ActionEvent; import javafx.fxml.FXML; -public class PrimaryController { +public class LoginController { @FXML - private void switchToSecondary() throws IOException { + public void switchToSecondary() throws IOException { App.setRoot("signup"); } diff --git a/src/main/java/NTNU/IDATT1002/controllers/SignUpController.java b/src/main/java/NTNU/IDATT1002/controllers/SignUpController.java new file mode 100644 index 0000000000000000000000000000000000000000..29be8feeee66493b2712950a230d29d97eada3b5 --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/controllers/SignUpController.java @@ -0,0 +1,14 @@ +package NTNU.IDATT1002.controllers; + +import java.io.IOException; + +import NTNU.IDATT1002.App; +import javafx.fxml.FXML; + +public class SignUpController { + + @FXML + public void switchToPrimary() throws IOException { + App.setRoot("login"); + } +} \ No newline at end of file diff --git a/src/main/java/NTNU/IDATT1002/models/Login.java b/src/main/java/NTNU/IDATT1002/models/Login.java new file mode 100644 index 0000000000000000000000000000000000000000..02f9a9aa311d50aef8d1fb8bc61916eb44af2dca --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/models/Login.java @@ -0,0 +1,41 @@ +package NTNU.IDATT1002.models; + +public class Login { + + private Integer id; + private User user; + private String password; + private String passwordHash; + private String passwordSalt; + + public Login() { + } + + public Login(int id, User user, String password, String passwordHash, String passwordSalt) { + this.id = id; + this.user = user; + this.password = password; + this.passwordHash = passwordHash; + this.passwordSalt = passwordSalt; + } + + public int getId() { + return id; + } + + public User getUser() { + return user; + } + + public String getPassword() { + return password; + } + + public String getPasswordHash() { + return passwordHash; + } + + public String getPasswordSalt() { + return passwordSalt; + } +} diff --git a/src/main/java/NTNU/IDATT1002/models/User.java b/src/main/java/NTNU/IDATT1002/models/User.java new file mode 100644 index 0000000000000000000000000000000000000000..eb2eea209c785353dc3fb609353d0a97d38d4257 --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/models/User.java @@ -0,0 +1,90 @@ +package NTNU.IDATT1002.models; + +import java.util.Date; + +public class User { + + private Integer id; + private String email; + private String username; + private String firstName; + private String lastName; + private String callingCode; + private String phoneNumber; + private Date birthDate; + private boolean isAdmin; + private boolean isActive; + + public User(int id, String email, String username, String firstName, String lastName, String callingCode, String phoneNumber, Date birthDate, boolean isAdmin) { + this.id = id; + this.email = email; + this.username = username; + this.firstName = firstName; + this.lastName = lastName; + this.callingCode = callingCode; + this.phoneNumber = phoneNumber; + this.birthDate = birthDate; + this.isAdmin = isAdmin; + this.isActive = true; + } + + public User(User user) { + this(user.getId(), + user.getEmail(), + user.getUsername(), + user.getFirstName(), + user.getLastName(), + user.getCallingCode(), + user.getPhoneNumber(), + user.getBirthDate(), + user.isAdmin()); + } + + public Integer getId() { + return id; + } + + public String getEmail() { + return email; + } + + public String getUsername() { + return username; + } + + public String getFirstName() { + return firstName; + } + + public String getLastName() { + return lastName; + } + + public String getCallingCode() { + return callingCode; + } + + public String getPhoneNumber() { + return phoneNumber; + } + + public Date getBirthDate() { + return birthDate; + } + + public boolean isAdmin() { + return isAdmin; + } + + public boolean isActive() { + return isActive; + } + + @Override + public boolean equals(Object o) { + if (this == o) return true; + if (o == null || getClass() != o.getClass()) return false; + User user = (User) o; + return id.equals(user.id); + } +} diff --git a/src/main/java/NTNU/IDATT1002/repository/Repository.java b/src/main/java/NTNU/IDATT1002/repository/Repository.java new file mode 100644 index 0000000000000000000000000000000000000000..326d682ef8bb1a5a25d4bef9e4d50380f2929480 --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/repository/Repository.java @@ -0,0 +1,72 @@ +package NTNU.IDATT1002.repository; + +import java.util.Optional; + + +/** + * Entity Repository Interface Dummy. Supports regular Create, Read, Update and Delete operations. + * @param <T> type of entity + * @param <ID> type of entity id + */ +public interface Repository<T, ID> { + + /** + * Saves a given entity and returns the saved instance. + * + * @param entity not null + * @return the saved entity + */ + T save(T entity) throws IllegalArgumentException; + + /** + * Updates the given entity. This will completely override the given instance. + * + * @param entity not null + * @return the updated entity + */ + Optional<T> update(T entity); + + /** + * Retrieves all instances of the type. + * + * @return all entities + */ + Iterable<T> findAll(); + + /** + * Retrieves an entity with the given id. + * + * @param id not null + * @return the entity with the given id if found, else Optional.empty() + */ + Optional<T> findById(ID id); + + /** + * Deletes an entity with the given id. + * + * @param id not null + */ + void deleteById(ID id); + + /** + * Deletes the given entity. + * + * @param entity not null + */ + void delete(T entity); + + /** + * Return the number of entities. + * + * @return the number of entities. + */ + long count(); + + /** + * Return whether the given entity exists. + * + * @param entity not null + * @return true if the entity exist, else false + */ + boolean exists(T entity); +} diff --git a/src/main/java/NTNU/IDATT1002/repository/UserRepository.java b/src/main/java/NTNU/IDATT1002/repository/UserRepository.java new file mode 100644 index 0000000000000000000000000000000000000000..e6cb49d892c99283a94544d94009d5fd83708e41 --- /dev/null +++ b/src/main/java/NTNU/IDATT1002/repository/UserRepository.java @@ -0,0 +1,99 @@ +package NTNU.IDATT1002.repository; + +import NTNU.IDATT1002.models.User; + +import java.util.*; + + +/** + * User repository to support interacting with a simulated database. + */ +public class UserRepository implements Repository<User, Integer> { + + /** + * The "database". + */ + private static List<User> users = new ArrayList<>(); + + /** + * Supply repository with initial test data. + */ + static { + users.add(new User(1, "test@mail.com", "test", "Test", "Testesen", "+47", "00000000", new Date(), false)); + users.add(new User(2, "test2@mail.com", "test2", "Test2", "Testesen2", "+47", "00000001", new Date(), false)); + users.add(new User(3, "test3@mail.com", "test3", "Test3", "Testesen3", "+47", "00000002", new Date(), false)); + } + + @Override + public User save(User user) throws IllegalArgumentException { + if (user == null) + throw new IllegalArgumentException("User cannot be null"); + + User savedUser = new User(user); + users.add(savedUser); + return savedUser; + } + + @Override + public Optional<User> update(User user) { + if (user == null) + throw new IllegalArgumentException("User cannot be null"); + + Optional<User> foundUser = users.stream() + .filter(user::equals) + .findFirst(); + + if (foundUser.isPresent()) { + delete(foundUser.get()); + User updatedUser = save(user); + return Optional.of(updatedUser); + } + + return Optional.empty(); + } + + @Override + public List<User> findAll() { + return users; + } + + @Override + public Optional<User> findById(Integer id) { + return users.stream() + .filter(user -> user.getId() == id) + .findFirst(); + } + + public User findByUsername(String username) { + return users.stream() + .filter(user -> user.getUsername().equals(username)) + .findFirst() + .orElseThrow(NoSuchElementException::new); + } + + @Override + public void deleteById(Integer id) { + Optional<User> foundUser = findById(id); + foundUser.ifPresent(this::delete); + } + + @Override + public void delete(User user) { + users.remove(user); + } + + + @Override + public long count() { + return users.size(); + } + + @Override + public boolean exists(User user) { + if (user == null) + throw new IllegalArgumentException("User cannot be null"); + + return users.stream() + .anyMatch(user::equals); + } +} diff --git a/src/main/resources/NTNU/IDATT1002/logged-in.fxml b/src/main/resources/NTNU/IDATT1002/logged-in.fxml index 0e4f965206e96bd06bcf373f7257dda94f87f02d..750d3ec401a162104c5306013b0d3d1e06345545 100644 --- a/src/main/resources/NTNU/IDATT1002/logged-in.fxml +++ b/src/main/resources/NTNU/IDATT1002/logged-in.fxml @@ -4,7 +4,7 @@ <?import javafx.scene.image.ImageView?> <?import javafx.scene.layout.AnchorPane?> -<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="NTNU.IDATT1002.LoggedIn"> +<AnchorPane prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="NTNU.IDATT1002.controllers.LoggedInController"> <children> <ImageView fitHeight="150.0" fitWidth="200.0" layoutX="200.0" layoutY="125.0" pickOnBounds="true" preserveRatio="true"> <image> diff --git a/src/main/resources/NTNU/IDATT1002/login.fxml b/src/main/resources/NTNU/IDATT1002/login.fxml index 815e50ffd41bdd8c595b40a05a827fbf42c04575..4bee4cd86e257e201f95b18c3b8950308300feca 100644 --- a/src/main/resources/NTNU/IDATT1002/login.fxml +++ b/src/main/resources/NTNU/IDATT1002/login.fxml @@ -11,7 +11,7 @@ <?import javafx.scene.layout.VBox?> <?import javafx.scene.text.Text?> -<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="NTNU.IDATT1002.PrimaryController"> +<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml" fx:controller="NTNU.IDATT1002.controllers.LoginController"> <children> <Label text="Login Page" /> <GridPane hgap="10.0" maxWidth="300.0" prefHeight="90.0" prefWidth="200.0" vgap="10.0"> diff --git a/src/main/resources/NTNU/IDATT1002/signup.fxml b/src/main/resources/NTNU/IDATT1002/signup.fxml index 59ddd040c8cede8d51335933a532161b8b08b1da..7ec82d8e8f4cfb9e69d7abf421748ff1aebccf66 100644 --- a/src/main/resources/NTNU/IDATT1002/signup.fxml +++ b/src/main/resources/NTNU/IDATT1002/signup.fxml @@ -11,7 +11,7 @@ <?import javafx.scene.layout.VBox?> <?import javafx.scene.text.Text?> -<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/" fx:controller="NTNU.IDATT1002.SecondaryController"> +<VBox alignment="CENTER" prefHeight="400.0" prefWidth="600.0" spacing="20.0" xmlns="http://javafx.com/javafx" xmlns:fx="http://javafx.com/fxml/" fx:controller="NTNU.IDATT1002.controllers.SignUpController"> <children> <Label text="Sign Up page" /> <GridPane hgap="10.0" maxWidth="-Infinity" prefHeight="110.0" prefWidth="300.0" vgap="10.0">