Merge branch 'develop' into frontend/kathy_neu

This commit is contained in:
Katharina Will 2019-06-06 14:59:50 +02:00
commit 645e31deb2
6 changed files with 143 additions and 52 deletions

View File

@ -7,21 +7,14 @@
/> />
<q-card-section> <q-card-section>
<div class="text-h6">GeoCaching</div> <div class="text-h6">GeoCaching</div>
<div class="text-body2">Willkommen</div> <div class="text-body2">Willkommen, GeoCaching ist eine spielerische Führung, eine Schnitzeljagd, über die
<q-expansion-item Bundesgartenschau.
rounded-borders Es gibt mehrere Routen (Caches), die man durchführen kann. Jeder Cache besteht aus mehreren Stationen, bei
class="text-black shadow-2 full-width q-mt-md" denen Rätsel und Aufgaben gelöst werden müssen, um die jeweils nächste Station zu finden.
label="Was ist GeoCaching?" 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
<q-card> Rangliste.
<q-card-section> </div>
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.
</q-card-section>
</q-card>
</q-expansion-item>
</q-card-section> </q-card-section>
</q-card> </q-card>
<q-card class="my-card" style="max-width: 600px"> <q-card class="my-card" style="max-width: 600px">
@ -40,9 +33,8 @@
<script> <script>
export default { export default {
data () { data() {
return { return {}
}
} }
} }
</script> </script>

View File

@ -32,6 +32,7 @@
<q-input lazy-rules outlined filled stack-label v-model="newTeamName" <q-input lazy-rules outlined filled stack-label v-model="newTeamName"
type="text" type="text"
label="Teamname eingeben" label="Teamname eingeben"
color="black"
:rules="[val=>val.length>=2||'Name muss mindestens 5 Zeichen lang sein!']"/> :rules="[val=>val.length>=2||'Name muss mindestens 5 Zeichen lang sein!']"/>
<q-btn <q-btn
:disabled="!newTeamNameValidationSuccesful" :disabled="!newTeamNameValidationSuccesful"
@ -64,18 +65,6 @@
</q-expansion-item> </q-expansion-item>
</q-card> </q-card>
</q-list> </q-list>
<!--<div v-show="hasAdminState">-->
<!--<p class="text-h5 q-mt-sm"> Neuen Admin hinzufügen </p>-->
<!--<q-input lazy-rules outlined filled stack-label v-model="newAdminMail"-->
<!--type="text" label="Email des Nutzers" class="col-9"-->
<!--:rules="[val=>validateEmail(val)||'Bitte Email verwenden']"/>-->
<!--<q-btn class="col-3"-->
<!--icon="arrow_right_alt"-->
<!--@click="getUser()"-->
<!--:disabled="!adminInviteChecked"-->
<!--color="positive"-->
<!--type="submit"/>-->
<!--</div>-->
</div> </div>
</q-tab-panel> </q-tab-panel>
<q-tab-panel v-if="boolAlreadyInTeam" name="teams" class="q-pa-none"> <q-tab-panel v-if="boolAlreadyInTeam" name="teams" class="q-pa-none">
@ -85,6 +74,7 @@
<p v-show="!boolStatus" class="text-white"> <p v-show="!boolStatus" class="text-white">
Unser Status: {{currentTeamStatus}} Unser Status: {{currentTeamStatus}}
<q-btn icon="create" <q-btn icon="create"
size=""
unelevated unelevated
class="on-right" class="on-right"
@click="updateStatus()" @click="updateStatus()"
@ -121,15 +111,8 @@
:pagination.sync="pagination" :pagination.sync="pagination"
/> />
<br/> <br/>
<div align="center"> <p class="text-h5"> Nutzer einladen </p>
<q-btn label="Nutzer einladen" <div align="center" class="row q-mt-sm justify-between">
unelevated
@click="activateInvite()"
color="primary"
class="full-width q-mt-sm"
type="submit"/>
</div>
<div v-if="inviteActivated" align="center" class="row q-mt-sm justify-between">
<q-input lazy-rules outlined filled stack-label v-model="inviteMail" <q-input lazy-rules outlined filled stack-label v-model="inviteMail"
type="text" label="Email des Nutzers" color="black" class="col q-mr-sm" type="text" label="Email des Nutzers" color="black" class="col q-mr-sm"
:rules="[val=>validateEmail(val)||'Bitte Email verwenden']"/> :rules="[val=>validateEmail(val)||'Bitte Email verwenden']"/>
@ -138,7 +121,7 @@
unelevated unelevated
@click="sendTeamInvite()" @click="sendTeamInvite()"
:disabled="!teamInviteChecked" :disabled="!teamInviteChecked"
color="positive" color="primary"
type="submit"/> type="submit"/>
</div> </div>
</div> </div>

View File

@ -98,7 +98,7 @@
methods: { methods: {
validateEmail(email) { 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,}))$/; //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()); return re.test(String(email).toLowerCase());
}, },
register: function () { register: function () {

View File

@ -24,11 +24,11 @@
<q-card class="q-mb-md" v-for="(user) in rankinglist" :key="user.id"> <q-card class="q-mb-md" v-for="(user) in rankinglist" :key="user.id">
<q-item class="q-pr-sm "> <q-item class="q-pr-sm ">
<q-item-section> <q-item-section>
<q-item-label v-if="username === user.username" @click="gotoProfile"><a class="text-green" <q-item-label v-if="email === user.username" @click="gotoProfile"><a class="text-green"
style="text-decoration: none"><span>{{user.rank}}. {{user.username}}</span></a> style="text-decoration: none"><span>{{user.rank}}. {{user.username}}</span></a>
</q-item-label> </q-item-label>
<q-item-label v-if="username !== user.username"><a class="text-black" <q-item-label v-if="email !== user.username"><a class="text-black"
style="text-decoration: none"><span>{{user.rank}}. {{user.username}}</span></a> style="text-decoration: none"><span>{{user.rank}}. {{user.username}}</span></a>
</q-item-label> </q-item-label>
</q-item-section> </q-item-section>
<q-item-section side> <q-item-section side>
@ -42,8 +42,10 @@
<div class="" style="max-width: 440px"> <div class="" style="max-width: 440px">
<q-input lazy-rules outlined filled stack-label <q-input lazy-rules outlined filled stack-label
type="text" type="text"
label="Username eingeben" label="Email eingeben"
unelevated color="negative" unelevated color="black"
v-model="deleteUser"
:rules="[val=>validateEmail(val)||'Bitte Email verwenden']"
></q-input> ></q-input>
</div> </div>
</div> </div>
@ -53,6 +55,7 @@
label="Punkte des Nutzer zurücksetzen" label="Punkte des Nutzer zurücksetzen"
color="negative" color="negative"
class="full-width" class="full-width"
@click="resetPoints()"
/> />
</div> </div>
<div v-if="hasAdminState" class="row"> <div v-if="hasAdminState" class="row">
@ -102,7 +105,9 @@
tab: 'solo', tab: 'solo',
rankinglist: [], rankinglist: [],
teamRankinglist: [], teamRankinglist: [],
username: null username: null,
deleteUser: null,
email: null,
} }
}, },
created: function () { created: function () {
@ -111,6 +116,7 @@
this.fetchRankinglist(); this.fetchRankinglist();
this.fetchTeamRankinglist(); this.fetchTeamRankinglist();
this.username = JSON.parse(localStorage.getItem('userToken')).name; this.username = JSON.parse(localStorage.getItem('userToken')).name;
this.email = JSON.parse(localStorage.getItem('userMail'));
}, },
computed: { computed: {
hasAdminState() { hasAdminState() {
@ -183,9 +189,57 @@
// lastSum = ranking.rankingPointsSum; // 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());
},
} }
} }
</script> </script>

View File

@ -425,7 +425,7 @@ public class Controller {
for (RankingListHelper rankingListHelper: sendBackUsers) { for (RankingListHelper rankingListHelper: sendBackUsers) {
logger.debug("RankingList Helper " + rankingListHelper.getUsername()); logger.debug("RankingList Helper " + rankingListHelper.getUsername());
logger.debug("User: " + user.getUsername()); logger.debug("User: " + user.getUsername());
if(rankingListHelper.getUsername().equals(user.getUsername())){ if(rankingListHelper.getUsername().equals(user.getEmail())){
userAlreadyInRankingList = true; userAlreadyInRankingList = true;
break; break;
} }
@ -435,7 +435,7 @@ public class Controller {
ResponseEntity singlePlace = getRankingPlace(user.getEmail()); ResponseEntity singlePlace = getRankingPlace(user.getEmail());
if (singlePlace.getStatusCodeValue() == 200) { 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())); logger.debug(String.valueOf((Integer) singlePlace.getBody()));
sendBackUsers.add(rankingListHelper); 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)") @ApiOperation(value = "Test method (Changes its purpose often)")
@ApiResponses(value = { @ApiResponses(value = {
@ApiResponse(code = 404, message = "Database error"), @ApiResponse(code = 404, message = "Database error"),

View File

@ -8,6 +8,7 @@ import java.util.List;
public interface UserRepository extends CrudRepository<User, Integer> { public interface UserRepository extends CrudRepository<User, Integer> {
User findByEmail(String email); 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" + // @Query(value = "SELECT DISTINCT u.id AS ID, username AS Name, ui.ranking_points_sum AS Ranglistenpunkte\n" +
// "FROM user u,\n" + // "FROM user u,\n" +
@ -19,7 +20,7 @@ public interface UserRepository extends CrudRepository<User, Integer> {
// "LIMIT 10;", nativeQuery = true) // "LIMIT 10;", nativeQuery = true)
// List<Object[]> getRankingList(); // List<Object[]> 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" + "FROM user u,\n" +
" user_info ui,\n" + " user_info ui,\n" +
" user_roles ur\n" + " user_roles ur\n" +