Merge branch 'develop' into frontend/timo

This commit is contained in:
Timo Volkmann 2019-05-26 16:33:29 +02:00
commit c3c605d298
13 changed files with 2498 additions and 326 deletions

File diff suppressed because it is too large Load Diff

View File

@ -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
View 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);
}

View 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>

View File

@ -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() {

View File

@ -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"/>
<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>
</q-img>
</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) {

View File

@ -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"/>

View File

@ -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) {

View File

@ -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-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,9 +83,26 @@
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() {
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: ");
@ -87,6 +110,7 @@
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
View 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=="
}
}
}

View File

@ -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));
}
}

View File

@ -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 + " )";

View File

@ -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();