diff --git a/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Index.vue b/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Index.vue index 554b946..4e63fc8 100644 --- a/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Index.vue +++ b/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Index.vue @@ -7,21 +7,14 @@ />
GeoCaching
-
Willkommen
- - - - GeoCaching ist eine spielerische Führung, eine Schnitzeljagd, über die Bundesgartenschau. - Es gibt mehrere Routen (Caches), von denen man wählen kann. Auf jedem Cache gibt es mehrere Stationen, bei denen Rätsel und Aufgaben gelöst werden müssen, um die nächste zu finden. - Eine Station ist eine QR-Code, bei dessen einscannen das nächste Rätsel freigeschaltet wird. - Findet ein Cacher alle Stationen eines Caches erhält er eine kleine Belohnung und sammelt Punkte für eine Rangliste. - - - +
Willkommen, GeoCaching ist eine spielerische Führung, eine Schnitzeljagd, über die + Bundesgartenschau. + Es gibt mehrere Routen (Caches), die man durchführen kann. Jeder Cache besteht aus mehreren Stationen, bei + denen Rätsel und Aufgaben gelöst werden müssen, um die jeweils nächste Station zu finden. + Eine Station wird durch einen QR-Code repräsentiert, den man einscannen muss um das Rätsel angezeigt zu bekommen. + Findet der Cacher alle Stationen eines Caches in der richtigen Reihenfolge erhält er eine kleine Belohnung und sammelt Punkte für eine + Rangliste. +
@@ -40,9 +33,8 @@ diff --git a/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Profile.vue b/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Profile.vue index 8ca50e1..a9c7bdf 100644 --- a/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Profile.vue +++ b/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Profile.vue @@ -32,6 +32,7 @@ - - - - - - - - - - - - @@ -85,6 +74,7 @@

Unser Status: {{currentTeamStatus}}
-

- -
-
+

Nutzer einladen

+
@@ -138,7 +121,7 @@ unelevated @click="sendTeamInvite()" :disabled="!teamInviteChecked" - color="positive" + color="primary" type="submit"/>
diff --git a/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Register.vue b/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Register.vue index 430436f..c627de1 100644 --- a/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Register.vue +++ b/labswp_2019_sose_geocaching_frontend/frontend/src/pages/Register.vue @@ -98,7 +98,7 @@ methods: { validateEmail(email) { //var re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; - let re = new RegExp('^[a-zA-Z0-9.!#$%&\'*+/=?^_`{|}~-]+@[A-Z0-9.-]+\\.[A-Z]{2,}$'); + let re = new RegExp('/^(([^<>()\\[\\]\\\\.,;:\\s@"]+(\\.[^<>()\\[\\]\\\\.,;:\\s@"]+)*)|(".+"))@((\\[[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}\\.[0-9]{1,3}])|(([a-zA-Z\\-0-9]+\\.)+[a-zA-Z]{2,}))$/'); return re.test(String(email).toLowerCase()); }, register: function () { diff --git a/labswp_2019_sose_geocaching_frontend/frontend/src/pages/ranking.vue b/labswp_2019_sose_geocaching_frontend/frontend/src/pages/ranking.vue index 211979f..99b8115 100644 --- a/labswp_2019_sose_geocaching_frontend/frontend/src/pages/ranking.vue +++ b/labswp_2019_sose_geocaching_frontend/frontend/src/pages/ranking.vue @@ -24,11 +24,11 @@ - {{user.rank}}. {{user.username}} + {{user.rank}}. {{user.username}} - {{user.rank}}. {{user.username}} + {{user.rank}}. {{user.username}} @@ -42,8 +42,10 @@
@@ -53,6 +55,7 @@ label="Punkte des Nutzer zurücksetzen" color="negative" class="full-width" + @click="resetPoints()" />
@@ -102,7 +105,9 @@ tab: 'solo', rankinglist: [], teamRankinglist: [], - username: null + username: null, + deleteUser: null, + email: null, } }, created: function () { @@ -111,6 +116,7 @@ this.fetchRankinglist(); this.fetchTeamRankinglist(); this.username = JSON.parse(localStorage.getItem('userToken')).name; + this.email = JSON.parse(localStorage.getItem('userMail')); }, computed: { hasAdminState() { @@ -183,9 +189,57 @@ // lastSum = ranking.rankingPointsSum; // } }, - resetPoints(username){ + resetPoints() { + if (this.deleteUser != null) { + let username = this.deleteUser; + let token = JSON.parse(localStorage.getItem('userToken')).token; + if (this.validateEmail(this.email)) { + console.log(this.validateEmail(this.email)); + + this.$axios.put('/api/resetSingleUser', null, {params: {token, username}}) + .then((response) => { + console.log("Rankinglist: "); + console.log(response.data); + this.fetchRankinglist(); + }).catch((error) => { + let msg; + let title; + if (error.response) { + title = "Bitte Eingaben überprüfen!"; + msg = error.response.data; + } else if (error.request) { + title = "Verbindungsfehler!"; + msg = "Es konnte keine Verbindung zum Server aufgebaut werden. Versuchen Sie es später noch einmal!" + console.log(error.request); + } else { + title = "Error"; + msg = error.message; + console.log('Error', error.message); + } + console.log(error.config); + this.$store.commit('dialog/NEW_MESSAGE_DIALOG', {message: msg, title: title,}); + }) + } else { + this.$store.commit('dialog/NEW_MESSAGE_DIALOG', { + message: "Bitte geben Sie eine gültige Email ein", + title: "Ungültige Email", + color: "negative" + }); + } + } else { + this.$store.commit('dialog/NEW_MESSAGE_DIALOG', { + message: "Zum zurücksetzen der Punkte eines Nutzers gib bitte einen Usernamen ein", + title: "Fehlender Username", + color: "negative" + }); + } }, + validateEmail(email) { + let re = /^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/; + return re.test(String(email).toLowerCase()); + }, + } } diff --git a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java index f752dc4..13d1bb9 100644 --- a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java +++ b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java @@ -425,7 +425,7 @@ public class Controller { for (RankingListHelper rankingListHelper: sendBackUsers) { logger.debug("RankingList Helper " + rankingListHelper.getUsername()); logger.debug("User: " + user.getUsername()); - if(rankingListHelper.getUsername().equals(user.getUsername())){ + if(rankingListHelper.getUsername().equals(user.getEmail())){ userAlreadyInRankingList = true; break; } @@ -435,7 +435,7 @@ public class Controller { ResponseEntity singlePlace = getRankingPlace(user.getEmail()); if (singlePlace.getStatusCodeValue() == 200) { - RankingListHelper rankingListHelper = new RankingListHelper(user.getUsername(), (Integer) user_infoRepository.findUser_InfoByUser(user).getRankingPointsSum(), (Integer) getRankingPlace(user.getEmail()).getBody()); + RankingListHelper rankingListHelper = new RankingListHelper(user.getEmail(), (Integer) user_infoRepository.findUser_InfoByUser(user).getRankingPointsSum(), (Integer) getRankingPlace(user.getEmail()).getBody()); logger.debug(String.valueOf((Integer) singlePlace.getBody())); sendBackUsers.add(rankingListHelper); } @@ -1284,6 +1284,67 @@ public class Controller { } + @ApiOperation(value = "Resets the points of a single User ") + @ApiResponses(value = { + @ApiResponse(code = 404, message = "Database error"), + @ApiResponse(code = 401, message = "JWT Token expired"), + @ApiResponse(code = 400, message = "Something went wrong at verification") + }) + @CrossOrigin(origins = "*", allowedHeaders = "*") // only for dev purpose + @RequestMapping(value = "/api/resetSingleUser", method = RequestMethod.PUT, produces = "application/json") + public ResponseEntity resetSingleUser(@RequestParam String token, @RequestParam String username) { + logger.debug("API CALL: /api/resetSingleUser"); + // verify user + ResponseEntity verifyToken = VerificationUtil.verifyToken(token); + + if (verifyToken.getStatusCodeValue() != 200) { + return verifyToken; + } + + //get User + Claims claims = (Claims) verifyToken.getBody(); + + ResponseEntity getUser = FinderUtil.findUserFromClaim(claims); + + if (getUser.getStatusCodeValue() != 200) { + return getUser; + } + + User user = (User) getUser.getBody(); + + logger.debug("/api/resetRankingList: " + "User verificated: " + user.getEmail()); + //---------------------- + boolean isAdmin = false; + for (Role role : user.getRoles()) { + if (role.getId() == 7) { + isAdmin = true; + } + } + + if (isAdmin) { + + User deleteUser = userRepository.findByEmail(username); + + + if(deleteUser == null) { + return ResponseEntity.status(400).body("Es wurde kein User mit dieser Email gefunden."); + } + + User_Info user_info = user_infoRepository.findUser_InfoByUser(deleteUser); + user_info.setRankingPointsSum(0); + user_infoRepository.save(user_info); + + for (Bearbeitet bearbeitet : bearbeitetRepository.findByUser(deleteUser)) { + if (bearbeitet.getCacheAccesDefinition().getId() == 1) { + bearbeitetRepository.delete(bearbeitet); + } + } + return ResponseEntity.status(200).body(HttpStatus.OK); + } else { + return ResponseEntity.status(400).body("Der Benutzer ist kein Admin und kann deshalb die Rangliste nicht zurücksetzen."); + } + } + @ApiOperation(value = "Test method (Changes its purpose often)") @ApiResponses(value = { @ApiResponse(code = 404, message = "Database error"), diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java index 25ec2f9..a4a04a0 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java @@ -8,6 +8,7 @@ import java.util.List; public interface UserRepository extends CrudRepository { User findByEmail(String email); + User findByUsername(String username); // @Query(value = "SELECT DISTINCT u.id AS ID, username AS Name, ui.ranking_points_sum AS Ranglistenpunkte\n" + // "FROM user u,\n" + @@ -19,7 +20,7 @@ public interface UserRepository extends CrudRepository { // "LIMIT 10;", nativeQuery = true) // List getRankingList(); - @Query(value = "SELECT DISTINCT u.id AS ID, username AS Name, ui.ranking_points_sum AS Ranglistenpunkte, email Email\n" + + @Query(value = "SELECT DISTINCT u.id AS ID, u.email AS Name, ui.ranking_points_sum AS Ranglistenpunkte, email Email\n" + "FROM user u,\n" + " user_info ui,\n" + " user_roles ur\n" +