Merge branch 'develop' into frontend/timo
This commit is contained in:
commit
c3c605d298
2111
frontend/package-lock.json
generated
2111
frontend/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@ -16,8 +16,10 @@
|
||||
"@quasar/extras": "^1.1.2",
|
||||
"ajv": "6.8.1",
|
||||
"axios": "^0.18.0",
|
||||
"openlayers": "^4.6.5",
|
||||
"quasar": "^1.0.0-beta.23",
|
||||
"vue-qrcode-reader": "^1.4.2"
|
||||
"vue-qrcode-reader": "^1.4.2",
|
||||
"vuelayers": "^0.11.4"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@quasar/app": "^1.0.0-beta.25",
|
||||
|
||||
7
frontend/src/boot/map.js
Normal file
7
frontend/src/boot/map.js
Normal file
@ -0,0 +1,7 @@
|
||||
import Vue from 'vue'
|
||||
import VueLayers from 'vuelayers'
|
||||
import 'vuelayers/lib/style.css' // needs css-loader
|
||||
|
||||
export default async ({ Vue }) => {
|
||||
Vue.use(VueLayers);
|
||||
}
|
||||
22
frontend/src/components/map.vue
Normal file
22
frontend/src/components/map.vue
Normal file
@ -0,0 +1,22 @@
|
||||
<template>
|
||||
<div>
|
||||
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
name: 'mymap',
|
||||
data () {
|
||||
return {
|
||||
zoom: 15,
|
||||
center: [ 9.208858198755664, 49.14785422283188],
|
||||
rotation: 0,
|
||||
geolocPosition: undefined,
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
||||
@ -1,11 +1,21 @@
|
||||
<template>
|
||||
<div>
|
||||
<iframe transition="fade"
|
||||
class="q-mb-md "
|
||||
height= "200px"
|
||||
width= "100%"
|
||||
v-if="!cameraActive"
|
||||
:src= "iFrameURL" frameborder="0"></iframe>
|
||||
<vl-map :load-tiles-while-animating="true" :load-tiles-while-interacting="true"
|
||||
data-projection="EPSG:4326" style="height: 200px" >
|
||||
<vl-view :zoom.sync="zoom" :center.sync="center" :rotation.sync="rotation"></vl-view>
|
||||
|
||||
<vl-geoloc @update:position="geolocPosition = $event">
|
||||
<template slot-scope="geoloc">
|
||||
<vl-feature v-if="geoloc.position" id="position-feature">
|
||||
<vl-geom-point :coordinates="geoloc.position"></vl-geom-point>
|
||||
</vl-feature>
|
||||
</template>
|
||||
</vl-geoloc>
|
||||
|
||||
<vl-layer-tile id="osm">
|
||||
<vl-source-osm></vl-source-osm>
|
||||
</vl-layer-tile>
|
||||
</vl-map>
|
||||
<div v-if="!cameraActive" class="q-ma-md">
|
||||
<p class="text-h4">{{ cacheName }}</p>
|
||||
<p>{{ instruction }}</p>
|
||||
@ -16,6 +26,11 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Vue from 'vue'
|
||||
import VueLayers from 'vuelayers'
|
||||
import 'vuelayers/lib/style.css' // needs css-loader
|
||||
|
||||
Vue.use(VueLayers);
|
||||
import qrscanner from "../components/qrscanner";
|
||||
export default {
|
||||
name: "CacheStart",
|
||||
@ -40,8 +55,11 @@
|
||||
lon: "",
|
||||
lat: "",
|
||||
stationID: [],
|
||||
iFrameURL: ""
|
||||
|
||||
iFrameURL: "",
|
||||
zoom: 15,
|
||||
center: [ 9.208858198755664, 49.14785422283188],
|
||||
rotation: 0,
|
||||
geolocPosition: undefined,
|
||||
}
|
||||
},
|
||||
created() {
|
||||
@ -59,7 +77,7 @@
|
||||
this.stationID = cache.stationen[0];
|
||||
this.lon = this.stationID.longitude;
|
||||
this.lat = this.stationID.lattitude;
|
||||
this.iFrameURL = `http://www.se.hs-heilbronn.de:3000/api/map/lon=${this.lon}&lat=${this.lat}`
|
||||
this.iFrameURL = `https://seserver.se.hs-heilbronn.de:3000/api/map/lon=${this.lon}&lat=${this.lat}`
|
||||
})
|
||||
},
|
||||
checkStation() {
|
||||
|
||||
@ -79,13 +79,32 @@
|
||||
<q-tab-panel name="map" class="q-pa-none fit">
|
||||
<!--<div class="full-width full-height absolute-full" style="background: url('statics/osm_mock.png'); background-size: cover">-->
|
||||
<!--</div>-->
|
||||
<q-img
|
||||
src="https://www.buga2019.de/we-bilder/3.Gartenausstellung/Gelaendeplan/190320_Gelaendeplan-quadratisch.jpg"
|
||||
transition="fade" class="absolute-full">
|
||||
<template v-slot:loading>
|
||||
<q-spinner-puff color="cyan-14" size="4em"/>
|
||||
</template>
|
||||
</q-img>
|
||||
<div class="full-width full-height absolute-full">
|
||||
<vl-map :load-tiles-while-animating="true" :load-tiles-while-interacting="true"
|
||||
data-projection="EPSG:4326">
|
||||
<vl-view :zoom.sync="zoom" :center.sync="center" :rotation.sync="rotation"></vl-view>
|
||||
|
||||
<vl-geoloc @update:position="geolocPosition = $event">
|
||||
<template slot-scope="geoloc">
|
||||
<vl-feature v-if="geoloc.position" id="position-feature">
|
||||
<vl-geom-point :coordinates="geoloc.position"></vl-geom-point>
|
||||
</vl-feature>
|
||||
</template>
|
||||
</vl-geoloc>
|
||||
|
||||
<vl-layer-tile id="osm">
|
||||
<vl-source-osm></vl-source-osm>
|
||||
</vl-layer-tile>
|
||||
|
||||
<vl-layer-vector>
|
||||
<vl-source-vector :features.sync="features"></vl-source-vector>
|
||||
<vl-style-box>
|
||||
<vl-style-stroke color="green" :width="3"></vl-style-stroke>
|
||||
<vl-style-fill color="rgba(255,255,255,0.5)"></vl-style-fill>
|
||||
</vl-style-box>
|
||||
</vl-layer-vector>
|
||||
</vl-map>
|
||||
</div>
|
||||
</q-tab-panel>
|
||||
|
||||
</q-tab-panels>
|
||||
@ -102,6 +121,12 @@
|
||||
*/
|
||||
</style>
|
||||
<script>
|
||||
import Vue from 'vue'
|
||||
import VueLayers from 'vuelayers'
|
||||
import 'vuelayers/lib/style.css' // needs css-loader
|
||||
|
||||
Vue.use(VueLayers);
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
@ -109,10 +134,18 @@
|
||||
caches: [],
|
||||
stations: [],
|
||||
pois: [],
|
||||
render: false
|
||||
features: [],
|
||||
render: false,
|
||||
zoom: 15,
|
||||
center: [ 9.208858198755664, 49.14785422283188],
|
||||
rotation: 0,
|
||||
geolocPosition: undefined,
|
||||
}
|
||||
},
|
||||
mounted: function () {
|
||||
this.initMap().then(features => {
|
||||
this.features = features.map(Object.freeze)
|
||||
})
|
||||
},
|
||||
computed: {
|
||||
hasAdminState() {
|
||||
@ -237,17 +270,33 @@
|
||||
this.$router.push({path: `/cache/${cacheID}`})
|
||||
},
|
||||
initMap() {
|
||||
console.log("Signalwort: " + this.pois);
|
||||
// this.$axios.post('http://seserver.se.hs-heilbronn.de:3000/api/map', {
|
||||
// body: this.pois
|
||||
// }).then((response)=>{
|
||||
// console.log(response)
|
||||
// })
|
||||
// },
|
||||
this.$axios.get('http://www.se.hs-heilbronn.de:3000/api/map/lon=9&lat=49', {
|
||||
body: this.pois
|
||||
}).then((response) => {
|
||||
console.log(response)
|
||||
return new Promise(resolve => {
|
||||
setTimeout(() => {
|
||||
// generate GeoJSON random features
|
||||
resolve([
|
||||
|
||||
{
|
||||
type: "Feature",
|
||||
id: 'fakerator.misc.uuid()',
|
||||
geometry: {
|
||||
type: "LineString",
|
||||
coordinates: [
|
||||
[
|
||||
44.47265625,
|
||||
-1.7575368113083125,
|
||||
],
|
||||
[
|
||||
44.47265625,
|
||||
-1.7575368113083125,
|
||||
],
|
||||
|
||||
],
|
||||
},
|
||||
properties: {
|
||||
},
|
||||
},
|
||||
])
|
||||
}, 5000)
|
||||
})
|
||||
},
|
||||
deleteCache(id) {
|
||||
|
||||
@ -15,11 +15,22 @@
|
||||
<!--type="textarea"-->
|
||||
<!--/>-->
|
||||
<p class="text-h6 q-mt-md">Location</p>
|
||||
<q-img transition="fade"
|
||||
class="q-mb-md "
|
||||
:ratio="16/9"
|
||||
src="https://www.buga2019.de/we-bilder/3.Gartenausstellung/Gelaendeplan/190320_Gelaendeplan-quadratisch.jpg"
|
||||
></q-img>
|
||||
<vl-map :load-tiles-while-animating="true" :load-tiles-while-interacting="true"
|
||||
data-projection="EPSG:4326">
|
||||
<vl-view :zoom.sync="zoom" :center.sync="center" :rotation.sync="rotation"></vl-view>
|
||||
|
||||
<vl-geoloc @update:position="geolocPosition = $event">
|
||||
<template slot-scope="geoloc">
|
||||
<vl-feature v-if="geoloc.position" id="position-feature">
|
||||
<vl-geom-point :coordinates="geoloc.position"></vl-geom-point>
|
||||
</vl-feature>
|
||||
</template>
|
||||
</vl-geoloc>
|
||||
|
||||
<vl-layer-tile id="osm">
|
||||
<vl-source-osm></vl-source-osm>
|
||||
</vl-layer-tile>
|
||||
</vl-map>
|
||||
<div class="row q-col-gutter-md">
|
||||
<q-input class="col" dense stack-label filled v-model="latlang" @input="separateLatlang"
|
||||
label="Breitengrad/Längengrad"/>
|
||||
|
||||
@ -1,11 +1,21 @@
|
||||
<template>
|
||||
<div>
|
||||
<q-img transition="fade"
|
||||
class="q-mb-md "
|
||||
:ratio="16/9"
|
||||
src="https://www.buga2019.de/we-bilder/3.Gartenausstellung/Gelaendeplan/190320_Gelaendeplan-quadratisch.jpg"
|
||||
v-if="!cameraActive"
|
||||
></q-img>
|
||||
<vl-map :load-tiles-while-animating="true" :load-tiles-while-interacting="true"
|
||||
data-projection="EPSG:4326" style="height: 200px" >
|
||||
<vl-view :zoom.sync="zoom" :center.sync="center" :rotation.sync="rotation"></vl-view>
|
||||
|
||||
<vl-geoloc @update:position="geolocPosition = $event">
|
||||
<template slot-scope="geoloc">
|
||||
<vl-feature v-if="geoloc.position" id="position-feature">
|
||||
<vl-geom-point :coordinates="geoloc.position"></vl-geom-point>
|
||||
</vl-feature>
|
||||
</template>
|
||||
</vl-geoloc>
|
||||
|
||||
<vl-layer-tile id="osm">
|
||||
<vl-source-osm></vl-source-osm>
|
||||
</vl-layer-tile>
|
||||
</vl-map>
|
||||
<div class="q-ma-md" v-if="!cameraActive">
|
||||
<p class="text-h4">{{ cache.name }}</p>
|
||||
<p class="text-h5">Station {{ showCacheProgress }}</p>
|
||||
@ -18,7 +28,13 @@
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Vue from 'vue'
|
||||
import VueLayers from 'vuelayers'
|
||||
import 'vuelayers/lib/style.css' // needs css-loader
|
||||
|
||||
Vue.use(VueLayers);
|
||||
import qrscanner from "../components/qrscanner";
|
||||
|
||||
export default {
|
||||
name: "Station",
|
||||
components: { qrscanner },
|
||||
@ -33,6 +49,10 @@
|
||||
station: {},
|
||||
cameraActive: false,
|
||||
result: null,
|
||||
zoom: 15,
|
||||
center: [ 9.208858198755664, 49.14785422283188],
|
||||
rotation: 0,
|
||||
geolocPosition: undefined,
|
||||
}
|
||||
},
|
||||
beforeRouteUpdate(to, from, next) {
|
||||
|
||||
@ -21,16 +21,21 @@
|
||||
<q-tab-panels v-model="tab" animated swipeable class="col">
|
||||
<q-tab-panel name="solo" class="q-pa-md fit">
|
||||
<q-list>
|
||||
<q-card class="q-mb-md" v-for="(user,index) 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-section>
|
||||
<q-item-label><a class="text-black" style="text-decoration: none"><span>{{index+1}}. {{user.username}}</span></a></q-item-label>
|
||||
</q-item-section>
|
||||
<q-item-label v-if="username === user.username" @click="gotoProfile"><a class="text-green" style="text-decoration: none"><span>{{user.rank}}. {{user.username}}</span></a></q-item-label>
|
||||
<q-item-label v-if="username !== user.username"><a class="text-black" style="text-decoration: none"><span>{{user.rank}}. {{user.username}}</span></a></q-item-label>
|
||||
</q-item-section>
|
||||
<q-item-section side>
|
||||
<span class="text-grey">{{user.rankingPointsSum}} Punkte </span>
|
||||
</q-item-section>
|
||||
</q-item>
|
||||
</q-card>
|
||||
<div v-if="hasAdminState" class="row">
|
||||
<q-btn @click="resetRankingList" unelevated color="primary" label="Rangliste zurücksetzen"
|
||||
class="full-width"/>
|
||||
</div>
|
||||
</q-list>
|
||||
</q-tab-panel>
|
||||
|
||||
@ -69,7 +74,8 @@
|
||||
return {
|
||||
tab: 'solo',
|
||||
rankinglist: [],
|
||||
teamRankinglist: []
|
||||
teamRankinglist: [],
|
||||
username: null
|
||||
}
|
||||
},
|
||||
created: function() {
|
||||
@ -77,16 +83,34 @@
|
||||
console.log("created(): " + this.teamRankinglist);
|
||||
this.fetchRankinglist();
|
||||
this.fetchTeamRankinglist();
|
||||
this.username = JSON.parse(localStorage.getItem('userToken')).name;
|
||||
},
|
||||
computed: {
|
||||
hasAdminState() {
|
||||
return this.$store.getters['auth/GET_ADMINSTATE'];
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
fetchRankinglist() {
|
||||
this.$axios.get('/api/getRankingList')
|
||||
.then((response) => {
|
||||
console.log("Rankinglist: ");
|
||||
console.log(response.data);
|
||||
this.rankinglist = response.data;
|
||||
}).catch((error) => {
|
||||
})
|
||||
let token;
|
||||
if(localStorage.getItem('userToken')){
|
||||
token = JSON.parse(localStorage.getItem('userToken')).token;
|
||||
this.$axios.get('/api/getRankingList', {params: {token}})
|
||||
.then((response) => {
|
||||
console.log("Rankinglist: ");
|
||||
console.log(response.data);
|
||||
this.rankinglist = response.data;
|
||||
}).catch((error) => {
|
||||
})
|
||||
} else {
|
||||
this.$axios.get('/api/getRankingList')
|
||||
.then((response) => {
|
||||
console.log("Rankinglist: ");
|
||||
console.log(response.data);
|
||||
this.rankinglist = response.data;
|
||||
}).catch((error) => {
|
||||
})
|
||||
}
|
||||
},
|
||||
fetchTeamRankinglist() {
|
||||
this.$axios.get('/api/getTeamRankingList')
|
||||
@ -97,6 +121,30 @@
|
||||
}).catch((error) => {
|
||||
})
|
||||
},
|
||||
gotoProfile(){
|
||||
this.$router.push({path: `/Profile`})
|
||||
},
|
||||
resetRankingList(){
|
||||
let token = JSON.parse(localStorage.getItem('userToken')).token;
|
||||
this.$axios.get('/api/resetRankingList', {params: {token}})
|
||||
.then((response) => {
|
||||
console.log("Reset Rankinglist: ");
|
||||
console.log(response.data);
|
||||
this.$store.commit('dialog/NEW_MESSAGE_DIALOG', {
|
||||
message: "Die Rangliste wurde erfolgreich zurückgesetzt",
|
||||
color: "blue"
|
||||
});
|
||||
this.$axios.get('/api/getRankingList', {params: {token}})
|
||||
.then((response) => {
|
||||
console.log("Rankinglist: ");
|
||||
console.log(response.data);
|
||||
this.rankinglist = response.data;
|
||||
}).catch((error) => {
|
||||
})
|
||||
}).catch((error) => {
|
||||
}).then()
|
||||
|
||||
},
|
||||
calculateRank() {
|
||||
// TODO
|
||||
// let rank = 0;
|
||||
|
||||
245
package-lock.json
generated
Normal file
245
package-lock.json
generated
Normal file
@ -0,0 +1,245 @@
|
||||
{
|
||||
"requires": true,
|
||||
"lockfileVersion": 1,
|
||||
"dependencies": {
|
||||
"@babel/runtime-corejs2": {
|
||||
"version": "7.4.4",
|
||||
"resolved": "https://registry.npmjs.org/@babel/runtime-corejs2/-/runtime-corejs2-7.4.4.tgz",
|
||||
"integrity": "sha512-hE7oVwVsRws84u5/nkaWWdN2J4SXEGuXKjrAsP0E4nkYImjSbpdHfGTS2nvFc82aDGIuG6OzhAQMpIzTHuZeKA==",
|
||||
"requires": {
|
||||
"core-js": "^2.6.5",
|
||||
"regenerator-runtime": "^0.13.2"
|
||||
}
|
||||
},
|
||||
"@turf/bbox": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@turf/bbox/-/bbox-5.1.5.tgz",
|
||||
"integrity": "sha1-MFHfUUrUxQ9KT5uKLRX9i2hA7aM=",
|
||||
"requires": {
|
||||
"@turf/helpers": "^5.1.5",
|
||||
"@turf/meta": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"@turf/boolean-point-in-polygon": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@turf/boolean-point-in-polygon/-/boolean-point-in-polygon-5.1.5.tgz",
|
||||
"integrity": "sha1-8BzBlNHgMKVIv9qYHLpDz9YpQbc=",
|
||||
"requires": {
|
||||
"@turf/helpers": "^5.1.5",
|
||||
"@turf/invariant": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"@turf/center": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@turf/center/-/center-5.1.5.tgz",
|
||||
"integrity": "sha1-RKss2VT2PA03dX9xWKmcPvURS4A=",
|
||||
"requires": {
|
||||
"@turf/bbox": "^5.1.5",
|
||||
"@turf/helpers": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"@turf/clone": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@turf/clone/-/clone-5.1.5.tgz",
|
||||
"integrity": "sha1-JT6NNUdxgZduM636tQoPAqfw42c=",
|
||||
"requires": {
|
||||
"@turf/helpers": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"@turf/distance": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@turf/distance/-/distance-5.1.5.tgz",
|
||||
"integrity": "sha1-Oc8YIEu/h1h9cH5gmmARiQkVZAk=",
|
||||
"requires": {
|
||||
"@turf/helpers": "^5.1.5",
|
||||
"@turf/invariant": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"@turf/explode": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@turf/explode/-/explode-5.1.5.tgz",
|
||||
"integrity": "sha1-sSsvd0AEobSPYrqVsgocZVo94Rg=",
|
||||
"requires": {
|
||||
"@turf/helpers": "^5.1.5",
|
||||
"@turf/meta": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"@turf/helpers": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@turf/helpers/-/helpers-5.1.5.tgz",
|
||||
"integrity": "sha1-FTQFInq5M9AEpbuWQantmZ/L4M8="
|
||||
},
|
||||
"@turf/invariant": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@turf/invariant/-/invariant-5.2.0.tgz",
|
||||
"integrity": "sha1-8BUP9ykLOFd7c9CIt5MsHuCqkKc=",
|
||||
"requires": {
|
||||
"@turf/helpers": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"@turf/meta": {
|
||||
"version": "5.2.0",
|
||||
"resolved": "https://registry.npmjs.org/@turf/meta/-/meta-5.2.0.tgz",
|
||||
"integrity": "sha1-OxrUhe4MOwsXdRMqMsOE1T5LpT0=",
|
||||
"requires": {
|
||||
"@turf/helpers": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"@turf/nearest-point": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@turf/nearest-point/-/nearest-point-5.1.5.tgz",
|
||||
"integrity": "sha1-EgUN5Bw5hEMiTHl43g9iE5ANNPs=",
|
||||
"requires": {
|
||||
"@turf/clone": "^5.1.5",
|
||||
"@turf/distance": "^5.1.5",
|
||||
"@turf/helpers": "^5.1.5",
|
||||
"@turf/meta": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"@turf/point-on-feature": {
|
||||
"version": "5.1.5",
|
||||
"resolved": "https://registry.npmjs.org/@turf/point-on-feature/-/point-on-feature-5.1.5.tgz",
|
||||
"integrity": "sha1-MMfwMkMCd8ZBjZbSieRba/shP+c=",
|
||||
"requires": {
|
||||
"@turf/boolean-point-in-polygon": "^5.1.5",
|
||||
"@turf/center": "^5.1.5",
|
||||
"@turf/explode": "^5.1.5",
|
||||
"@turf/helpers": "^5.1.5",
|
||||
"@turf/nearest-point": "^5.1.5"
|
||||
}
|
||||
},
|
||||
"color-convert": {
|
||||
"version": "0.5.3",
|
||||
"resolved": "https://registry.npmjs.org/color-convert/-/color-convert-0.5.3.tgz",
|
||||
"integrity": "sha1-vbbGnOZg+t/+CwAHzER+G59ygr0="
|
||||
},
|
||||
"core-js": {
|
||||
"version": "2.6.5",
|
||||
"resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.5.tgz",
|
||||
"integrity": "sha512-klh/kDpwX8hryYL14M9w/xei6vrv6sE8gTHDG7/T/+SEovB/G4ejwcfE/CBzO6Edsu+OETZMZ3wcX/EjUkrl5A=="
|
||||
},
|
||||
"debounce-promise": {
|
||||
"version": "3.1.2",
|
||||
"resolved": "https://registry.npmjs.org/debounce-promise/-/debounce-promise-3.1.2.tgz",
|
||||
"integrity": "sha512-rZHcgBkbYavBeD9ej6sP56XfG53d51CD4dnaw989YX/nZ/ZJfgRx/9ePKmTNiUiyQvh4mtrMoS3OAWW+yoYtpg=="
|
||||
},
|
||||
"ieee754": {
|
||||
"version": "1.1.13",
|
||||
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
|
||||
"integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg=="
|
||||
},
|
||||
"merge-descriptors": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz",
|
||||
"integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E="
|
||||
},
|
||||
"ol": {
|
||||
"version": "5.3.2",
|
||||
"resolved": "https://registry.npmjs.org/ol/-/ol-5.3.2.tgz",
|
||||
"integrity": "sha512-PfS8Fe1iy4YNJ7P+TvebKME+8gp5NBfQuIldAHfBCkc7agmTezscQrsJWggz5B6Sprm/M/4YBtbyQtw4pIC65w==",
|
||||
"requires": {
|
||||
"pbf": "3.1.0",
|
||||
"pixelworks": "1.1.0",
|
||||
"rbush": "2.0.2"
|
||||
}
|
||||
},
|
||||
"ol-tilecache": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/ol-tilecache/-/ol-tilecache-3.0.2.tgz",
|
||||
"integrity": "sha512-oA+UM8juw775gVm0ZgH5WIV9DnDhfLYWnY7zxkpIR8FDZaoFiPa0idG+GFRdRokeCqMoeoNMSD8aRguFbDE9XA=="
|
||||
},
|
||||
"parse-color": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/parse-color/-/parse-color-1.0.0.tgz",
|
||||
"integrity": "sha1-e3SLlag/A/FqlPU15S1/PZRlhhk=",
|
||||
"requires": {
|
||||
"color-convert": "~0.5.0"
|
||||
}
|
||||
},
|
||||
"pbf": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.1.0.tgz",
|
||||
"integrity": "sha512-/hYJmIsTmh7fMkHAWWXJ5b8IKLWdjdlAFb3IHkRBn1XUhIYBChVGfVwmHEAV3UfXTxsP/AKfYTXTS/dCPxJd5w==",
|
||||
"requires": {
|
||||
"ieee754": "^1.1.6",
|
||||
"resolve-protobuf-schema": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"pixelworks": {
|
||||
"version": "1.1.0",
|
||||
"resolved": "https://registry.npmjs.org/pixelworks/-/pixelworks-1.1.0.tgz",
|
||||
"integrity": "sha1-Hwla1I3Ki/ihyCWOAJIDGkTyLKU="
|
||||
},
|
||||
"protocol-buffers-schema": {
|
||||
"version": "3.3.2",
|
||||
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.3.2.tgz",
|
||||
"integrity": "sha512-Xdayp8sB/mU+sUV4G7ws8xtYMGdQnxbeIfLjyO9TZZRJdztBGhlmbI5x1qcY4TG5hBkIKGnc28i7nXxaugu88w=="
|
||||
},
|
||||
"quickselect": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-1.1.1.tgz",
|
||||
"integrity": "sha512-qN0Gqdw4c4KGPsBOQafj6yj/PA6c/L63f6CaZ/DCF/xF4Esu3jVmKLUDYxghFx8Kb/O7y9tI7x2RjTSXwdK1iQ=="
|
||||
},
|
||||
"rbush": {
|
||||
"version": "2.0.2",
|
||||
"resolved": "https://registry.npmjs.org/rbush/-/rbush-2.0.2.tgz",
|
||||
"integrity": "sha512-XBOuALcTm+O/H8G90b6pzu6nX6v2zCKiFG4BJho8a+bY6AER6t8uQUZdi5bomQc0AprCWhEGa7ncAbbRap0bRA==",
|
||||
"requires": {
|
||||
"quickselect": "^1.0.1"
|
||||
}
|
||||
},
|
||||
"regenerator-runtime": {
|
||||
"version": "0.13.2",
|
||||
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.2.tgz",
|
||||
"integrity": "sha512-S/TQAZJO+D3m9xeN1WTI8dLKBBiRgXBlTJvbWjCThHWZj9EvHK70Ff50/tYj2J/fvBY6JtFVwRuazHN2E7M9BA=="
|
||||
},
|
||||
"resolve-protobuf-schema": {
|
||||
"version": "2.1.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
|
||||
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
|
||||
"requires": {
|
||||
"protocol-buffers-schema": "^3.3.1"
|
||||
}
|
||||
},
|
||||
"rxjs": {
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
|
||||
"integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
}
|
||||
},
|
||||
"tslib": {
|
||||
"version": "1.9.3",
|
||||
"resolved": "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz",
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
|
||||
},
|
||||
"uuid": {
|
||||
"version": "3.3.2",
|
||||
"resolved": "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz",
|
||||
"integrity": "sha512-yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA=="
|
||||
},
|
||||
"vuelayers": {
|
||||
"version": "0.11.4",
|
||||
"resolved": "https://registry.npmjs.org/vuelayers/-/vuelayers-0.11.4.tgz",
|
||||
"integrity": "sha512-6asCq2vDCPM4mS60NGeEBGKiVVJZ/GACYtu7UUVPkhtdmvI7bSzKjKuv0cTQkwcgh6YRtqzAIzML0l9fwb4AQw==",
|
||||
"requires": {
|
||||
"@babel/runtime-corejs2": "^7.1.2",
|
||||
"@turf/point-on-feature": "^5.1.5",
|
||||
"debounce-promise": "^3.1.0",
|
||||
"merge-descriptors": "^1.0.1",
|
||||
"ol": "^5.3.1",
|
||||
"ol-tilecache": "^3.0.1",
|
||||
"parse-color": "^1.0.0",
|
||||
"rxjs": "^6.3.3",
|
||||
"uuid": "^3.3.2",
|
||||
"whatwg-fetch": "^3.0.0"
|
||||
}
|
||||
},
|
||||
"whatwg-fetch": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/whatwg-fetch/-/whatwg-fetch-3.0.0.tgz",
|
||||
"integrity": "sha512-9GSJUgz1D4MfyKU7KRqwOjXCXTqWdFNvEr7eUBYchQiVc744mqK/MzXPNR2WsPkmkOa4ywfg8C2n8h+13Bey1Q=="
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -15,6 +15,7 @@ import io.swagger.annotations.ApiOperation;
|
||||
import io.swagger.annotations.ApiResponse;
|
||||
import io.swagger.annotations.ApiResponses;
|
||||
import org.springframework.beans.factory.annotation.Autowired;
|
||||
import org.springframework.http.HttpStatus;
|
||||
import org.springframework.http.ResponseEntity;
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
|
||||
@ -381,7 +382,7 @@ public class Controller {
|
||||
@CrossOrigin(origins = "*", allowedHeaders = "*") // only for dev purpose
|
||||
@RequestMapping(value = "/api/getRankingList", method = RequestMethod.GET, produces = "application/json")
|
||||
@ResponseBody
|
||||
public ResponseEntity getRankingList() {
|
||||
public ResponseEntity getRankingList(@RequestParam(value = "token", defaultValue = "null") String token) {
|
||||
|
||||
logger.warn("API CALL: /api/getRankingList");
|
||||
logger.debug("/api/getRankingList: PARAMETERS: -");
|
||||
@ -391,12 +392,55 @@ public class Controller {
|
||||
logger.debug("/api/getRankingList create sendBackUsers");
|
||||
List<Object[]> rankingUsers = userRepository.getRankingList();
|
||||
logger.debug("/api/getRankingList got Object[] from DB");
|
||||
int rank = 1;
|
||||
for (Object[] obj : rankingUsers) {
|
||||
RankingListHelper tmp = new RankingListHelper((String) obj[1], (Integer) obj[2]);
|
||||
RankingListHelper tmp = new RankingListHelper((String) obj[1], (Integer) obj[2], rank);
|
||||
sendBackUsers.add(tmp);
|
||||
rank++;
|
||||
}
|
||||
logger.debug("/api/getRankingList Converted Objects to RankingListHelper");
|
||||
logger.debug("/api/getRankingList RankingList: " + new GsonBuilder().setPrettyPrinting().create().toJson(sendBackUsers));
|
||||
|
||||
if(!token.equals("null")) {
|
||||
|
||||
// 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();
|
||||
|
||||
boolean userAlreadyInRankingList = false;
|
||||
for (RankingListHelper rankingListHelper: sendBackUsers) {
|
||||
logger.debug("RankingList Helper " + rankingListHelper.getUsername());
|
||||
logger.debug("User: " + user.getUsername());
|
||||
if(rankingListHelper.getUsername().equals(user.getUsername())){
|
||||
userAlreadyInRankingList = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
if(!userAlreadyInRankingList) {
|
||||
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());
|
||||
logger.debug(String.valueOf((Integer) singlePlace.getBody()));
|
||||
sendBackUsers.add(rankingListHelper);
|
||||
}
|
||||
}
|
||||
}
|
||||
return ResponseEntity.status(200).body(new Gson().toJson(sendBackUsers));
|
||||
}
|
||||
|
||||
@ -1117,6 +1161,128 @@ public class Controller {
|
||||
return ResponseEntity.status(200).body(new Gson().toJson(poi));
|
||||
}
|
||||
|
||||
@ApiOperation(value = "Resets the rankinglist")
|
||||
@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/resetRankingList", method = RequestMethod.GET, produces = "application/json")
|
||||
public ResponseEntity resetRankingList(@RequestParam String token) {
|
||||
logger.warn("API CALL: /api/resetRankingList");
|
||||
|
||||
// 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) {
|
||||
for (User_Info user_info : user_infoRepository.findAll()) {
|
||||
user_info.setRankingPointsSum(0);
|
||||
user_infoRepository.save(user_info);
|
||||
}
|
||||
for (Bearbeitet bearbeitet : bearbeitetRepository.findAll()) {
|
||||
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 = "Deletes the bearbeitet entry from a User from a Cache")
|
||||
@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/deleteCacheForUser", method = RequestMethod.DELETE, produces = "application/json")
|
||||
public ResponseEntity deleteCacheForUser(@RequestParam String token, @RequestParam String cacheID) {
|
||||
|
||||
logger.warn("API CALL: /api/deleteCacheForUser");
|
||||
// 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();
|
||||
|
||||
//----------------------
|
||||
//Get Cache
|
||||
ResponseEntity getCache = FinderUtil.findCacheById(cacheID);
|
||||
|
||||
if (getCache.getStatusCodeValue() != 200) {
|
||||
return getCache;
|
||||
}
|
||||
|
||||
Cache cache = (Cache) getCache.getBody();
|
||||
|
||||
//Get Bearbeitet entry
|
||||
ResponseEntity getBearbeitet = FinderUtil.findBearbeitetByUserAndCache(user, cache);
|
||||
|
||||
if (getBearbeitet.getStatusCodeValue() != 200) {
|
||||
return getBearbeitet;
|
||||
}
|
||||
|
||||
Bearbeitet bearbeitet = (Bearbeitet) getBearbeitet.getBody();
|
||||
|
||||
//Cache already finished
|
||||
if (bearbeitet.getCacheAccesDefinition().getId() == 1) {
|
||||
|
||||
int rankingPoints = cache.getRankingPoints();
|
||||
|
||||
//Get User_Info
|
||||
User_Info user_info = user_infoRepository.findUser_InfoByUser(user);
|
||||
|
||||
//Subtract RankingPoints
|
||||
user_info.setRankingPointsSum(user_info.getRankingPointsSum() - rankingPoints);
|
||||
|
||||
user_infoRepository.save(user_info);
|
||||
}
|
||||
|
||||
bearbeitetRepository.delete(bearbeitet);
|
||||
|
||||
return ResponseEntity.status(200).body("Cache for User " + user.getEmail() + " for cache " + cache.getName() + " reseted");
|
||||
|
||||
}
|
||||
|
||||
@ApiOperation(value = "Test method (Changes its purpose often)")
|
||||
@ApiResponses(value = {
|
||||
@ApiResponse(code = 404, message = "Database error"),
|
||||
@ -1129,6 +1295,7 @@ public class Controller {
|
||||
return ResponseEntity.status(200).body(userRepository.getRankingPlaceFromUser(name));
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -4,10 +4,12 @@ public class RankingListHelper {
|
||||
|
||||
private String username;
|
||||
private int rankingPointsSum;
|
||||
private int rank;
|
||||
|
||||
public RankingListHelper(String username, int ranking_Points) {
|
||||
public RankingListHelper(String username, int ranking_Points, int rank) {
|
||||
this.username = username;
|
||||
this.rankingPointsSum = ranking_Points;
|
||||
this.rank = rank;
|
||||
}
|
||||
|
||||
public String getUsername() {
|
||||
@ -26,6 +28,14 @@ public class RankingListHelper {
|
||||
this.rankingPointsSum = ranking_Points;
|
||||
}
|
||||
|
||||
public int getRank() {
|
||||
return rank;
|
||||
}
|
||||
|
||||
public void setRank(int rank) {
|
||||
this.rank = rank;
|
||||
}
|
||||
|
||||
@Override
|
||||
public String toString() {
|
||||
return "( " + username + " | " + rankingPointsSum + " )";
|
||||
|
||||
@ -27,8 +27,8 @@ public interface UserRepository extends CrudRepository<User, Integer> {
|
||||
" SELECT DISTINCT u.Email AS Name,\n" +
|
||||
" ui.ranking_points_sum AS Ranglistenpunkte\n" +
|
||||
" FROM user u,\n" +
|
||||
" buga19geocaching.user_info ui,\n" +
|
||||
" buga19geocaching.user_roles ur\n" +
|
||||
" user_info ui,\n" +
|
||||
" user_roles ur\n" +
|
||||
" WHERE u.id = ui.user_id\n" +
|
||||
" AND u.id = ur.user_id\n" +
|
||||
" order by ranking_points_sum DESC) as INR) as RN\n" +
|
||||
@ -45,7 +45,7 @@ public interface UserRepository extends CrudRepository<User, Integer> {
|
||||
" AND t.id = ui.team_id\n" +
|
||||
" AND ui.team_id IS NOT NULL\n" +
|
||||
"GROUP BY teamname\n" +
|
||||
"ORDER by ranking_points_sum DESC\n" +
|
||||
"ORDER by Ranglistenpunkte DESC\n" +
|
||||
"LIMIT 10;", nativeQuery = true)
|
||||
List<Object[]> getTeamRankingList();
|
||||
|
||||
|
||||
Loading…
Reference in New Issue
Block a user