diff --git a/build.gradle b/build.gradle index 2b6ed72..55838e6 100644 --- a/build.gradle +++ b/build.gradle @@ -46,7 +46,6 @@ dependencies { testCompile("junit:junit") compileOnly 'org.projectlombok:lombok:1.18.6' compile("org.springframework.boot:spring-boot-starter-data-jpa") - compile("com.h2database:h2") annotationProcessor 'org.projectlombok:lombok:1.18.6' testCompile( 'junit:junit:4.12', diff --git a/doc/meetings/week9/20190408_agenda.md b/doc/meetings/week9/20190408_agenda.md new file mode 100644 index 0000000..cfefdee --- /dev/null +++ b/doc/meetings/week9/20190408_agenda.md @@ -0,0 +1,43 @@ +# Meeting 8 + +## Opening +> Check if everyone is present: +- ~~Nivard Jansen~~ +- ~~Kristin Peneva~~ +- ~~Daan Sneep~~ +- [x] Merel SteenBergen +- [x] Ceren Ugurlu +- [x] Mika Wauben +- [x] Sem van der Hoeven + +- Chair: Merel Steenbergen +- Secretary: Sem van der Hoeven + +## Points of action + + - First of all, discuss problems we have faced and if somebody is halted because of a problem + - if so, try to work out the problem + +### pre/during meeting + - Discuss what we did last week (see scrumboard) + - Does anyone have blocking issues? + - Coverage reports + - Checkstyle reports + - Show demo to the TA, since Mitchell isn't here, a different TA will visit us, so we'll show him the entire application. + - Discuss about the presentation + - Discuss about final things that need to be done + +### post meeting + - Focus on the presentation + - Focus on the final report + - Focus on things we get points for according to the rubric + +## Any other business +> If anybody has something that should be discussed but came up with that after the agenda was finalized, he/she should bring that up now so that it can be discussed after all. + +## Question round +- Questions for the TA + - How to get the code coverage badge, since we use Gradle and we've got the Maven code. + +## Closing +> We're almost finished! diff --git a/doc/reports/checkstyle/20190415_checkstyle.jpg b/doc/reports/checkstyle/20190415_checkstyle.jpg new file mode 100644 index 0000000..366566d Binary files /dev/null and b/doc/reports/checkstyle/20190415_checkstyle.jpg differ diff --git a/doc/reports/coverage/20190415_coverage.jpg b/doc/reports/coverage/20190415_coverage.jpg new file mode 100644 index 0000000..c70cc82 Binary files /dev/null and b/doc/reports/coverage/20190415_coverage.jpg differ diff --git a/doc/reports/final-report/20190411_final_report.pdf b/doc/reports/final-report/20190411_final_report.pdf new file mode 100644 index 0000000..c92240d Binary files /dev/null and b/doc/reports/final-report/20190411_final_report.pdf differ diff --git a/doc/reports/sprint-reviews/20190415_sprint_review.md b/doc/reports/sprint-reviews/20190415_sprint_review.md new file mode 100644 index 0000000..45b6a7f --- /dev/null +++ b/doc/reports/sprint-reviews/20190415_sprint_review.md @@ -0,0 +1,13 @@ + +# Sprint Review + +## Main problems Encountered + +### Problem 1: + +## Adjustments from previous sprints +Our project is completely finished and we're very happy with the result. + +## Adjustments for next sprint +This is the last sprint for this project! + diff --git a/doc/sprints/sprint7/20190415_scrumboard.png b/doc/sprints/sprint7/20190415_scrumboard.png new file mode 100644 index 0000000..c08d53b Binary files /dev/null and b/doc/sprints/sprint7/20190415_scrumboard.png differ diff --git a/doc/sprints/sprint7/retrospective_sprint7.pdf b/doc/sprints/sprint7/retrospective_sprint7.pdf new file mode 100644 index 0000000..d81d8ea Binary files /dev/null and b/doc/sprints/sprint7/retrospective_sprint7.pdf differ diff --git a/src/Client/build.gradle b/src/Client/build.gradle index 61f1dea..1be8e29 100644 --- a/src/Client/build.gradle +++ b/src/Client/build.gradle @@ -39,8 +39,8 @@ test { } bootJar { - baseName = 'gs-consuming-rest' - version = '0.1.0' + baseName = 'greenify' + version = '1.0.0' } repositories { @@ -48,6 +48,7 @@ repositories { } dependencies { + compile "org.bouncycastle:bcprov-jdk16:1.46", "org.bouncycastle:bcpg-jdk16:1.46", "org.bouncycastle:bcmail-jdk16:1.46", "org.bouncycastle:bctsp-jdk16:1.46" compile("org.springframework.boot:spring-boot-starter") compile("org.springframework:spring-web") compile("com.fasterxml.jackson.core:jackson-databind") diff --git a/src/Client/src/main/java/greenify/client/Friend.java b/src/Client/src/main/java/greenify/client/Friend.java index b0282f3..0ec4bf4 100644 --- a/src/Client/src/main/java/greenify/client/Friend.java +++ b/src/Client/src/main/java/greenify/client/Friend.java @@ -1,18 +1,34 @@ package greenify.client; import javafx.beans.property.SimpleDoubleProperty; +import javafx.beans.property.SimpleIntegerProperty; import javafx.beans.property.SimpleStringProperty; public class Friend { + private SimpleIntegerProperty place; private SimpleStringProperty friend; private SimpleDoubleProperty score; - public Friend(String friend, Double friendScore) { + /** + * Constructor for a friend. + * @param place place in the leaderboard + * @param friend name of the user + * @param friendScore score of the user + */ + public Friend(Integer place, String friend, Double friendScore) { + this.place = new SimpleIntegerProperty(place); this.friend = new SimpleStringProperty(friend); this.score = new SimpleDoubleProperty(friendScore); } + public Integer getPlace() { + return place.get(); + } + + public void setPlace(Integer place) { + this.place = new SimpleIntegerProperty(place); + } public String getFriend() { return friend.get(); diff --git a/src/Client/src/main/java/greenify/client/controller/DashBoardController.java b/src/Client/src/main/java/greenify/client/controller/DashBoardController.java index 5e9072b..1565bf1 100644 --- a/src/Client/src/main/java/greenify/client/controller/DashBoardController.java +++ b/src/Client/src/main/java/greenify/client/controller/DashBoardController.java @@ -93,6 +93,10 @@ public class DashBoardController { @FXML private Button addFriendButton; @FXML + private Button addFriend; + @FXML + private Button removeFriend; + @FXML private Button addExtraActivityButton; @FXML private Button addExtraActivityButton2; @@ -105,18 +109,24 @@ public class DashBoardController { @FXML private TableView globalLeaderboard; @FXML + private TableColumn globalPlace; + @FXML private TableColumn globalUser; @FXML private TableColumn globalScore; @FXML private TableView developmentLeaderboard; @FXML + private TableColumn developmentPlace; + @FXML private TableColumn developmentUser; @FXML private TableColumn developmentScore; @FXML private TableView friendLeaderboard; @FXML + private TableColumn friendPlace; + @FXML private TableColumn friendUser; @FXML private TableColumn friendScore; @@ -235,15 +245,18 @@ public class DashBoardController { logOutButton.setSkin(new MyButtonSkin(logOutButton)); friendsColumn.setCellValueFactory(new PropertyValueFactory<>("Friend")); scoreColumn.setCellValueFactory(new PropertyValueFactory<>("Score")); + globalPlace.setCellValueFactory(new PropertyValueFactory<>("Place")); globalUser.setCellValueFactory(new PropertyValueFactory<>("Friend")); globalScore.setCellValueFactory(new PropertyValueFactory<>("Score")); developmentUser.setCellValueFactory(new PropertyValueFactory<>("Friend")); + developmentPlace.setCellValueFactory(new PropertyValueFactory<>("Place")); developmentScore.setCellValueFactory(new PropertyValueFactory<>("Score")); + friendPlace.setCellValueFactory(new PropertyValueFactory<>("Place")); friendUser.setCellValueFactory(new PropertyValueFactory<>("Friend")); friendScore.setCellValueFactory(new PropertyValueFactory<>("Score")); List friendList = userService.getFriendNames(userService.currentUser.getName()); for (int i = 0; i < friendList.size(); i++) { - Friend friend = new Friend(friendList.get(i), + Friend friend = new Friend(i, friendList.get(i), userService.getFootprint(friendList.get(i))); data.add(friend); } @@ -466,6 +479,7 @@ public class DashBoardController { updateFriends(); } + /** * Logs out the user. * @param event the event (clicking the button) @@ -485,6 +499,9 @@ public class DashBoardController { //development leaderboard developmentLeaderboard.getItems().clear(); developmentData.removeAll(); + //friends leaderboard + friendLeaderboard.getItems().clear(); + friendLeaderData.removeAll(); //load the fxml file Parent dash = Application.load(this.getClass().getClassLoader() @@ -570,6 +587,20 @@ public class DashBoardController { calcStage.show(); } + /** + * method opens removeFriend scene. + * @throws IOException when file is not found + */ + public void openRemoveFriend() throws IOException { + Parent calc = Application.load(this.getClass().getClassLoader() + .getResource("fxml/RemoveFriend.fxml")); + Scene scene = new Scene(calc); + Stage calcStage = new Stage(); + calcStage.setScene(scene); + calcStage.setTitle("Remove your friend - " + userService.currentUser.getName()); + calcStage.show(); + } + /** * Leaderboard is updating. * @throws InterruptedException throws exception @@ -585,14 +616,15 @@ public class DashBoardController { List userList = userService.getAllUsers(); sortScores(userList); for (int i = userList.size() - 1; i >= 0; i--) { - Friend user = new Friend(userList.get(i), userService.getFootprint(userList.get(i))); + Friend user = new Friend(userList.size() - i, userList.get(i), + userService.getFootprint(userList.get(i))); globalLeaderData.add(user); } List secondList = sortDiffScores(userList); for (int j = 0; j < userList.size(); j++) { double diff = Math.round((userService.getFirstFootprint(secondList.get(j)) - userService.getFootprint(secondList.get(j))) * 10) / 10.0; - Friend diffUser = new Friend(secondList.get(j), diff); + Friend diffUser = new Friend(j + 1, secondList.get(j), diff); developmentData.add(diffUser); } globalLeaderboard.setItems(globalLeaderData); @@ -643,14 +675,14 @@ public class DashBoardController { friendLeaderData.removeAll(); sortDiffScores(wholeList); for (int i = friendList.size() - 1; i >= 0 ; i--) { - Friend user = new Friend(friendList.get(i), userService + Friend user = new Friend(i, friendList.get(i), userService .getFootprint(friendList.get(i))); data.add(user); } for (int j = 0; j < wholeList.size(); j++) { double diff = Math.round((userService.getFirstFootprint(wholeList.get(j)) - userService.getFootprint(wholeList.get(j))) * 10) / 10.0; - Friend diffUser = new Friend(wholeList.get(j), diff); + Friend diffUser = new Friend(j + 1, wholeList.get(j), diff); friendLeaderData.add(diffUser); } friendsTable.setItems(data); diff --git a/src/Client/src/main/java/greenify/client/controller/ExtraActivityController.java b/src/Client/src/main/java/greenify/client/controller/ExtraActivityController.java index 1270013..e510048 100644 --- a/src/Client/src/main/java/greenify/client/controller/ExtraActivityController.java +++ b/src/Client/src/main/java/greenify/client/controller/ExtraActivityController.java @@ -132,6 +132,10 @@ public class ExtraActivityController { }); } + /** + * add transition animation. + * @param node adding animation + */ public void addFadeTransAnimation(Node node) { FadeTransition fade = new FadeTransition(Duration.millis(350), node); fade.setFromValue(0); diff --git a/src/Client/src/main/java/greenify/client/controller/FriendController.java b/src/Client/src/main/java/greenify/client/controller/FriendController.java index 4cbdc42..e4141d0 100644 --- a/src/Client/src/main/java/greenify/client/controller/FriendController.java +++ b/src/Client/src/main/java/greenify/client/controller/FriendController.java @@ -23,9 +23,13 @@ public class FriendController { private Button addButton; @FXML private TextField userNameText; + @FXML + private Button removeButton; + @FXML + private TextField removeUserNameText; /** - * Signs up the user. + * Add a new friend. * @param event the click of the sign up button */ @FXML @@ -58,8 +62,48 @@ public class FriendController { String friendName = userNameText.getText(); Stage current = (Stage) owner; dashBoardController.updateAchievements(); + dashBoardController.updateFriends(); current.close(); UserController.AlertHelper.showAlert(Alert.AlertType.CONFIRMATION, owner, "Friend added!", userNameText.getText() + " is now your friend!"); } + + /** + * Removes one of the friends of the user. + * @param event the click of the sign up button + */ + @FXML + public void removeFriend(ActionEvent event) throws InterruptedException { + //set the window to the current window (for displaying the alerts) + Window owner = removeButton.getScene().getWindow(); + //check if the username field is empty + if (removeUserNameText.getText().isEmpty()) { + //if so, display an alert + UserController.AlertHelper.showAlert(Alert.AlertType.ERROR, owner, "Username Error!", + "Please enter a username!"); + return; + } else if (removeUserNameText.getText().equals(userService.currentUser.getName())) { + UserController.AlertHelper.showAlert(Alert.AlertType.ERROR, owner, "Error!", + "You are not your friend!"); + return; + } else if (!userService.getFriendNames(userService.currentUser.getName()) + .contains(removeUserNameText.getText())) { + UserController.AlertHelper.showAlert(Alert.AlertType.ERROR, owner, "Error!", + "You do not have a friend with this username!"); + return; + } else if (!userService.getAllUsers().contains(removeUserNameText.getText())) { + UserController.AlertHelper.showAlert(Alert.AlertType.ERROR, owner, "Error!", + "The user does not exist!"); + return; + } + //add friend to the current user + userService.removeFriend(userService.currentUser.getName(), removeUserNameText.getText()); + //close the register window after the user has entered all the credentials + Stage current = (Stage) owner; + dashBoardController.updateFriends(); + dashBoardController.updateAchievements(); + current.close(); + UserController.AlertHelper.showAlert(Alert.AlertType.CONFIRMATION, owner, "Friend removed!", + removeUserNameText.getText() + " is not your friend anymore!"); + } } diff --git a/src/Client/src/main/java/greenify/client/controller/RegisterWindowController.java b/src/Client/src/main/java/greenify/client/controller/RegisterWindowController.java index bc6a292..2a35919 100644 --- a/src/Client/src/main/java/greenify/client/controller/RegisterWindowController.java +++ b/src/Client/src/main/java/greenify/client/controller/RegisterWindowController.java @@ -36,6 +36,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.client.HttpClientErrorException; import java.io.IOException; +import java.security.NoSuchAlgorithmException; import java.text.DecimalFormat; import java.util.concurrent.TimeUnit; @@ -180,7 +181,7 @@ public class RegisterWindowController { TimeUnit.MILLISECONDS.sleep(300); addSlideAnimation(1100, passwordField2, -420); - signUpButton.setSkin(new registerButtonSkin(signUpButton)); + signUpButton.setSkin(new RegisterButtonSkin(signUpButton)); } /** @@ -209,7 +210,7 @@ public class RegisterWindowController { * @param event the click of the sign up button */ @FXML - public void handleSignUpButton(ActionEvent event) throws IOException { + public void handleSignUpButton(ActionEvent event) throws IOException, NoSuchAlgorithmException { //set the window to the current window (for displaying the alerts) Window owner = signUpButton.getScene().getWindow(); //check if the username field is empty @@ -632,8 +633,12 @@ public class RegisterWindowController { } @SuppressWarnings("Duplicates") - public class registerButtonSkin extends ButtonSkin { - public registerButtonSkin(Button button) { + public class RegisterButtonSkin extends ButtonSkin { + /** + * registers button skins. + * @param button clicking + */ + public RegisterButtonSkin(Button button) { super(button); ScaleTransition scaleUp = new ScaleTransition(Duration.millis(140)); diff --git a/src/Client/src/main/java/greenify/client/controller/UserController.java b/src/Client/src/main/java/greenify/client/controller/UserController.java index d4ffefc..76ce84d 100644 --- a/src/Client/src/main/java/greenify/client/controller/UserController.java +++ b/src/Client/src/main/java/greenify/client/controller/UserController.java @@ -20,6 +20,7 @@ import org.springframework.stereotype.Controller; import org.springframework.web.client.HttpClientErrorException; import java.io.IOException; +import java.security.NoSuchAlgorithmException; import java.util.Objects; /** @@ -43,6 +44,7 @@ public class UserController { loginButton.setSkin(new LoginButtonSkin(loginButton)); signUpButton.setSkin(new LoginButtonSkin(signUpButton)); } + /** * Handles when the user clicks on the login button. * it checks if the username and password fields are filled @@ -51,8 +53,8 @@ public class UserController { * @throws IOException an exception for logging in the user */ @FXML - protected void handleLoginButtonAction(ActionEvent event) throws IOException { - + protected void handleLoginButtonAction(ActionEvent event) + throws IOException, NoSuchAlgorithmException { Window owner = loginButton.getScene().getWindow(); //get the current window if (usernameField.getText().isEmpty()) { AlertHelper.showAlert(Alert.AlertType.ERROR, owner, "Log-in Error!", @@ -153,6 +155,10 @@ public class UserController { @SuppressWarnings("Duplicates") public class LoginButtonSkin extends ButtonSkin { + /** + * method for the skin of login button. + * @param button clicking + */ public LoginButtonSkin(Button button) { super(button); ScaleTransition scaleUp = new ScaleTransition(Duration.millis(140)); diff --git a/src/Client/src/main/java/greenify/client/rest/UserService.java b/src/Client/src/main/java/greenify/client/rest/UserService.java index c590ec3..26bb63b 100644 --- a/src/Client/src/main/java/greenify/client/rest/UserService.java +++ b/src/Client/src/main/java/greenify/client/rest/UserService.java @@ -2,6 +2,7 @@ package greenify.client.rest; import greenify.common.UserDto; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.web.client.RestTemplateBuilder; import org.springframework.context.annotation.Bean; import org.springframework.http.HttpEntity; @@ -12,6 +13,9 @@ import org.springframework.stereotype.Service; import org.springframework.web.client.RestTemplate; import org.springframework.web.util.UriComponentsBuilder; +import java.nio.charset.StandardCharsets; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.List; import java.util.Map; @@ -19,6 +23,9 @@ import java.util.Map; public class UserService { public UserDto currentUser; + @Value( "${server.address:http://localhost:8080}" ) + String serverAddress = "http://localhost:8080"; + @Autowired RestTemplate restTemplate; @@ -36,16 +43,17 @@ public class UserService { @SuppressWarnings("Duplicates") //this suppressWarnings is to get rid of the errors of duplicate code //because the methods are very similar - public UserDto registerUser(String name, String password) { + public UserDto registerUser(String name, String password) throws NoSuchAlgorithmException { //headers for http HttpHeaders headers = new HttpHeaders(); //set the accept header in JSON value headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); //connect to the server with the needed url - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/registerUser") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/registerUser") .queryParam("name", name) //getting the name from the database - .queryParam("password", password); + .queryParam("password", hashPassword(password)); //getting the password from the database //create a http entity to be sent @@ -67,13 +75,14 @@ public class UserService { * @return a userDTO */ @SuppressWarnings("Duplicates") - public UserDto loginUser(String name, String password) { + public UserDto loginUser(String name, String password) throws NoSuchAlgorithmException { //this method is almost the same as the registerUser one, but with a different link HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/loginUser") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/loginUser") .queryParam("name", name) - .queryParam("password", password); + .queryParam("password", hashPassword(password)); new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); UserDto result = this.restTemplate.getForObject(builder.build() @@ -92,7 +101,7 @@ public class UserService { public void updateInput(String name, String inputName, String value) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/setInput") + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(serverAddress + "/setInput") .queryParam("name", name) .queryParam("inputName", inputName) .queryParam("value",value); @@ -112,7 +121,8 @@ public class UserService { public void updateExtraInput(String name, String inputName, String value) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/setExtraInput") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/setExtraInput") .queryParam("name", name) .queryParam("inputName", inputName) .queryParam("value", value); @@ -131,7 +141,8 @@ public class UserService { public double getFootprint(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/getFootprint") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/getFootprint") .queryParam("name", name); new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); @@ -149,7 +160,7 @@ public class UserService { public double getFirstFootprint(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/getFirst") + UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl(serverAddress + "/getFirst") .queryParam("name", name); new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); @@ -168,7 +179,8 @@ public class UserService { public Float saveFootprint(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/saveFootprint") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/saveFootprint") .queryParam("name", name); new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); @@ -187,7 +199,8 @@ public class UserService { public Float saveFirstFootprint(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/saveFirstFootprint") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/saveFirstFootprint") .queryParam("name", name); new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); @@ -205,7 +218,8 @@ public class UserService { public List getFriendNames(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/getFriends") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/getFriends") .queryParam("name", name); new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); @@ -223,7 +237,8 @@ public class UserService { public void addFriend(String name, String friend) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/addFriend") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/addFriend") .queryParam("name", name) .queryParam("friend",friend); HttpEntity entity = new HttpEntity<>(headers); @@ -241,7 +256,8 @@ public class UserService { public void removeFriend(String name, String friend) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/removeFriend") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/removeFriend") .queryParam("name", name) .queryParam("friend",friend); HttpEntity entity = new HttpEntity<>(headers); @@ -258,7 +274,8 @@ public class UserService { public Map getInputs(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/getInputs") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/getInputs") .queryParam("name", name); HttpEntity entity = new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); @@ -275,7 +292,8 @@ public class UserService { public Map getExtraInputs(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/getExtraInputs") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/getExtraInputs") .queryParam("name", name); HttpEntity entity = new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); @@ -293,7 +311,8 @@ public class UserService { public Map getAchievements(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/getAchievements") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/getAchievements") .queryParam("name", name); HttpEntity entity = new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); @@ -310,7 +329,8 @@ public class UserService { public Map getResults(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/getResults") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/getResults") .queryParam("name", name); HttpEntity entity = new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); @@ -325,7 +345,8 @@ public class UserService { public List getAllUsers() { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/getAllUsers"); + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/getAllUsers"); HttpEntity entity = new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); List result = this.restTemplate.getForObject(builder @@ -341,11 +362,33 @@ public class UserService { public void deleteAccount(String name) { HttpHeaders headers = new HttpHeaders(); headers.set("Accept", MediaType.APPLICATION_JSON_VALUE); - UriComponentsBuilder builder = UriComponentsBuilder.fromHttpUrl("http://localhost:8080/deleteAccount") + UriComponentsBuilder builder = UriComponentsBuilder + .fromHttpUrl(serverAddress + "/deleteAccount") .queryParam("name", name); HttpEntity entity = new HttpEntity<>(headers); System.out.println(builder.build().encode().toUri()); ResponseEntity authenticateResponse = this.restTemplate.getForEntity(builder.build() .encode().toUri(), String.class); } + + /** + * Hashes the password of a user. + * @param password password of the user + * @return hashed password + * @throws NoSuchAlgorithmException when there is no such algorithm + */ + public String hashPassword(String password) + throws NoSuchAlgorithmException { + MessageDigest digest = MessageDigest.getInstance("SHA-256"); + byte[] encodedHash = digest.digest(password.getBytes(StandardCharsets.UTF_8)); + StringBuffer hexString = new StringBuffer(); + for (int i = 0; i < encodedHash.length; i++) { + String hex = Integer.toHexString(0xff & encodedHash[i]); + if (hex.length() == 1) { + hexString.append('0'); + } + hexString.append(hex); + } + return hexString.toString(); + } } \ No newline at end of file diff --git a/src/Client/src/main/resources/fxml/RemoveFriend.fxml b/src/Client/src/main/resources/fxml/RemoveFriend.fxml new file mode 100644 index 0000000..5ea238a --- /dev/null +++ b/src/Client/src/main/resources/fxml/RemoveFriend.fxml @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/Client/src/main/resources/fxml/dashboard.fxml b/src/Client/src/main/resources/fxml/dashboard.fxml index 35fdf34..3cabfae 100644 --- a/src/Client/src/main/resources/fxml/dashboard.fxml +++ b/src/Client/src/main/resources/fxml/dashboard.fxml @@ -1,12 +1,5 @@ - - - - - - - @@ -23,9 +16,8 @@ - - + @@ -459,16 +451,11 @@ - + - - - - - - - - + + + + + + + + + + @@ -584,7 +578,7 @@ - + @@ -598,15 +592,40 @@ - + - - + + + + + diff --git a/src/Client/src/main/resources/icons/remove_friend.png b/src/Client/src/main/resources/icons/remove_friend.png new file mode 100644 index 0000000..f64e849 Binary files /dev/null and b/src/Client/src/main/resources/icons/remove_friend.png differ diff --git a/src/Client/src/test/java/FriendTest.java b/src/Client/src/test/java/FriendTest.java index 69490c6..15cd2f9 100644 --- a/src/Client/src/test/java/FriendTest.java +++ b/src/Client/src/test/java/FriendTest.java @@ -7,9 +7,11 @@ import org.junit.jupiter.api.Assertions; public class FriendTest { @Test public void setAndGetTest() { - Friend test = new Friend("ceren", 10.0); + Friend test = new Friend(1,"ceren", 10.0); + test.setPlace(1); test.setFriend("greenify"); test.setScore(15.0); + Assertions.assertEquals(test.getPlace(), 1); assertEquals(test.getFriend(), "greenify"); Assertions.assertEquals(test.getScore(), 15.0); } diff --git a/src/Client/src/test/java/UserServiceTest.java b/src/Client/src/test/java/UserServiceTest.java index 0e083cf..6dfde5c 100644 --- a/src/Client/src/test/java/UserServiceTest.java +++ b/src/Client/src/test/java/UserServiceTest.java @@ -30,7 +30,7 @@ public class UserServiceTest { @Test public void userRegisterTest() throws Exception { UserDto testUser = new UserDto(1L, "Eric"); - Mockito.when(restTemplate.getForObject(new java.net.URI("http://localhost:8080/registerUser?name=Eric&password=password"), + Mockito.when(restTemplate.getForObject(new java.net.URI("http://localhost:8080/registerUser?name=Eric&password=5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"), UserDto.class)) .thenReturn(testUser); @@ -41,7 +41,7 @@ public class UserServiceTest { @Test public void userLoginTest() throws Exception { UserDto testUser = new UserDto(1L, "Eric"); - Mockito.when(restTemplate.getForObject(new java.net.URI("http://localhost:8080/loginUser?name=Eric&password=password"), + Mockito.when(restTemplate.getForObject(new java.net.URI("http://localhost:8080/loginUser?name=Eric&password=5e884898da28047151d0e56f8dc6292773603d0d6aabbdd62a11ef721d1542d8"), UserDto.class)) .thenReturn(testUser); UserDto user = userService.loginUser("Eric", "password"); diff --git a/src/Server/build.gradle b/src/Server/build.gradle index 6968ab5..f5b96b9 100644 --- a/src/Server/build.gradle +++ b/src/Server/build.gradle @@ -7,6 +7,19 @@ buildscript { } } +plugins { + id "com.heroku.sdk.heroku-gradle" version "1.0.4" +} + +heroku { + appName = "greenify43" + includes = ["${buildDir}/libs/greenify-server-1.0.0.jar"] + includeBuildDir = false + processTypes( + web: "java -Dserver.port=\$PORT -jar src/Server/build/libs/greenify-server-1.0.0.jar" + ) +} + apply plugin: 'java' apply plugin: 'eclipse' apply plugin: 'idea' @@ -16,8 +29,8 @@ apply plugin: 'jacoco' apply plugin: 'checkstyle' bootJar { - baseName = 'gs-rest-service' - version = '0.1.0' + baseName = 'greenify-server' + version = '1.0.0' } test { diff --git a/src/Server/src/main/java/greenify/server/data/model/User.java b/src/Server/src/main/java/greenify/server/data/model/User.java index d13b9ee..7d1094c 100644 --- a/src/Server/src/main/java/greenify/server/data/model/User.java +++ b/src/Server/src/main/java/greenify/server/data/model/User.java @@ -209,7 +209,6 @@ public class User { throw new ApplicationException("Cannot add yourself as a friend"); } else { friends.add(user); - System.out.print("Friend added!"); } } @@ -222,7 +221,6 @@ public class User { throw new ApplicationException("This user is not your friend!"); } else { friends.remove(user); - System.out.print("Friend removed"); } } diff --git a/src/Server/src/main/java/greenify/server/rest/UserController.java b/src/Server/src/main/java/greenify/server/rest/UserController.java index 19da98a..cf482d1 100644 --- a/src/Server/src/main/java/greenify/server/rest/UserController.java +++ b/src/Server/src/main/java/greenify/server/rest/UserController.java @@ -114,7 +114,6 @@ public class UserController { */ @RequestMapping("/getFirst") public Float getFirstFootprint(@RequestParam(value = "name") String name) { - System.out.println("hello"); Float footprint = userService.getFirstFootprint(name); return footprint; } diff --git a/src/Server/src/main/java/greenify/server/service/AchievementService.java b/src/Server/src/main/java/greenify/server/service/AchievementService.java index cc59bdc..6035b6a 100644 --- a/src/Server/src/main/java/greenify/server/service/AchievementService.java +++ b/src/Server/src/main/java/greenify/server/service/AchievementService.java @@ -38,6 +38,8 @@ public class AchievementService { public void achieveSocialButterfly(User user) { if (user.getFriends().size() >= 3) { userService.setAchievement(user.getName(), "Social butterfly", true); + } else { + userService.setAchievement(user.getName(), "Social butterfly", false); } } @@ -48,6 +50,8 @@ public class AchievementService { public void achieveGreenSaver(User user) { if (20 > user.getFootPrint()) { userService.setAchievement(user.getName(), "Green saver", true); + } else { + userService.setAchievement(user.getName(), "Green saver", false); } } @@ -59,6 +63,8 @@ public class AchievementService { int vegan = Integer.parseInt(user.getExtraInputs().get("vegan")); if (vegan > 10) { userService.setAchievement(user.getName(), "Animal friend", true); + } else { + userService.setAchievement(user.getName(), "Animal friend", false); } } @@ -70,6 +76,8 @@ public class AchievementService { int bike = Integer.parseInt(user.getExtraInputs().get("bike")); if (bike > 15) { userService.setAchievement(user.getName(), "Tom Dumoulin", true); + } else { + userService.setAchievement(user.getName(), "Tom Dumoulin", false); } } @@ -81,6 +89,8 @@ public class AchievementService { int solarPanels = Integer.parseInt(user.getExtraInputs().get("solar_panels")); if (solarPanels >= 2) { userService.setAchievement(user.getName(), "Let it shine", true); + } else { + userService.setAchievement(user.getName(), "Let it shine", false); } } diff --git a/src/Server/src/main/java/greenify/server/service/CalculatorService.java b/src/Server/src/main/java/greenify/server/service/CalculatorService.java index e0d3d2e..c453d49 100644 --- a/src/Server/src/main/java/greenify/server/service/CalculatorService.java +++ b/src/Server/src/main/java/greenify/server/service/CalculatorService.java @@ -63,7 +63,6 @@ public class CalculatorService { .indexOf("") + 20, response.getBody().indexOf("")); // to do: in not HTTP 200 or exception case throws exception - System.out.println(Float.parseFloat(result)); return Float.parseFloat(result); }