diff --git a/.gitignore b/.gitignore index 6c08a57..41ca351 100644 --- a/.gitignore +++ b/.gitignore @@ -7,6 +7,7 @@ .idea/**/usage.statistics.xml .idea/**/dictionaries .idea/**/shelf +done.txt # Generated files .idea/**/contentModel.xml diff --git a/build.gradle b/build.gradle index 26ee00d..36bed90 100644 --- a/build.gradle +++ b/build.gradle @@ -35,11 +35,15 @@ dependencies { //JSON Parser implementation 'com.google.code.gson:gson:2.8.5' +<<<<<<< HEAD compile 'org.springframework.boot:spring-boot-starter-tomcat' compile 'org.springframework.boot:spring-boot-starter-security' compile 'org.springframework.boot:spring-boot-starter-actuator' compile 'org.springframework.boot:spring-boot-starter-aop' compile group: 'org.springframework.boot', name: 'spring-boot-starter-mail', version: '1.2.0.RELEASE' +======= + compile group: 'org.springframework.security', name: 'spring-security-core', version: '5.1.4.RELEASE' +>>>>>>> develop } diff --git a/frontend/.eslintrc.js b/frontend/.eslintrc.js index 6ef542c..c4e9e64 100644 --- a/frontend/.eslintrc.js +++ b/frontend/.eslintrc.js @@ -14,7 +14,7 @@ module.exports = { // consider switching to `plugin:vue/strongly-recommended` or `plugin:vue/recommended` for stricter rules. extends: [ 'plugin:vue/essential', - '@vue/prettier' + // '@vue/prettier' ], // required to lint *.vue files diff --git a/frontend/package-lock.json b/frontend/package-lock.json index baed0e9..a4b3ba4 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -255,9 +255,9 @@ } }, "@babel/helpers": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.0.tgz", - "integrity": "sha512-2Lfcn74A2WSFUbYJ76ilYE1GnegCKUHTfXxp25EL2zPZHjV7OcDncqNjl295mUH0VnB65mNriXW4J5ROvxsgGg==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.4.2.tgz", + "integrity": "sha512-gQR1eQeroDzFBikhrCccm5Gs2xBjZ57DNjGbqTaHo911IpmSxflOQWMAHPw/TXk8L3isv7s9lYzUkexOeTQUYg==", "dev": true, "requires": { "@babel/template": "^7.4.0", @@ -277,9 +277,9 @@ } }, "@babel/parser": { - "version": "7.4.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.0.tgz", - "integrity": "sha512-ZmMhJfU/+SXXvy9ALjDZopa3T3EixQtQai89JRC48eM9OUwrxJjYjuM/0wmdl2AekytlzMVhPY8cYdLb13kpKQ==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.4.2.tgz", + "integrity": "sha512-9fJTDipQFvlfSVdD/JBtkiY0br9BtfvW2R8wo6CX/Ej2eMuV0gWPk1M67Mt3eggQvBqYW1FCEk8BN7WvGm/g5g==", "dev": true }, "@babel/plugin-proposal-async-generator-functions": { @@ -668,9 +668,9 @@ } }, "@babel/plugin-transform-named-capturing-groups-regex": { - "version": "7.3.0", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.3.0.tgz", - "integrity": "sha512-NxIoNVhk9ZxS+9lSoAQ/LM0V2UEvARLttEHUrRDGKFaAxOYQcrkN/nLRE+BbbicCAvZPl7wMP0X60HsHE5DtQw==", + "version": "7.4.2", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.4.2.tgz", + "integrity": "sha512-NsAuliSwkL3WO2dzWTOL1oZJHm0TM8ZY8ZSxk2ANyKkt5SQlToGA4pzctmq1BEjoacurdwZ3xp2dCQWJkME0gQ==", "dev": true, "requires": { "regexp-tree": "^0.1.0" @@ -907,9 +907,9 @@ "dev": true }, "@quasar/app": { - "version": "1.0.0-beta.12", - "resolved": "https://registry.npmjs.org/@quasar/app/-/app-1.0.0-beta.12.tgz", - "integrity": "sha512-lQSqW+LuBG9jmglGj82fZ/9J6Dm0nz+dbSna6rOiy4zkt1FjmQ3PCRrImyd+WIsbKUntlTcKJ4+uN6fOlblcvg==", + "version": "1.0.0-beta.13", + "resolved": "https://registry.npmjs.org/@quasar/app/-/app-1.0.0-beta.13.tgz", + "integrity": "sha512-BMF/U/5xE7EntvVWVeQ0ud2k9z5xo4TGast5/Wv/g2+X4/VBIYUFPlDMNJh93okZ6QnRaNycU5xORo+dUiF8Cg==", "dev": true, "requires": { "@quasar/babel-preset-app": "1.0.2", @@ -949,7 +949,7 @@ "minimist": "1.2.0", "ms": "2.1.1", "node-loader": "0.6.0", - "opn": "5.4.0", + "opn": "5.5.0", "optimize-css-assets-webpack-plugin": "5.0.1", "ouch": "2.0.0", "postcss-loader": "3.0.0", @@ -962,12 +962,12 @@ "stylus-loader": "3.0.2", "terser-webpack-plugin": "1.2.3", "url-loader": "1.1.2", - "vue": "2.6.9", + "vue": "2.6.10", "vue-loader": "15.7.0", "vue-router": "3.0.2", - "vue-server-renderer": "2.6.9", + "vue-server-renderer": "2.6.10", "vue-style-loader": "4.1.2", - "vue-template-compiler": "2.6.9", + "vue-template-compiler": "2.6.10", "vuex": "3.1.0", "webpack": "4.29.6", "webpack-bundle-analyzer": "3.1.0", @@ -1002,9 +1002,9 @@ } }, "@quasar/extras": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.1.0.tgz", - "integrity": "sha512-594TNuQrQLwzSwhlZMkMn5AIAcNk8zPrsCkdHT021dswMv+IHATGyKJaTH4KuLKLWse+oPRoB0NddLNf9PXiuw==" + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/@quasar/extras/-/extras-1.1.1.tgz", + "integrity": "sha512-n9aQ9N9GBaRF15v3Rm5QDoeLOHFzjQ874f+54TthWmaQvx/8DV6fG/bwLgA6AjLUIZJs3ogm4J1KqWO+4zSg1g==" }, "@types/q": { "version": "1.5.2", @@ -1313,7 +1313,6 @@ "version": "6.8.1", "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.8.1.tgz", "integrity": "sha512-eqxCp82P+JfqL683wwsL73XmFs1eG6qjw+RD3YHx+Jll1r0jNd4dh8QG9NYAeNGA/hnZjeEDgtTskgJULbxpWQ==", - "dev": true, "requires": { "fast-deep-equal": "^2.0.1", "fast-json-stable-stringify": "^2.0.0", @@ -1974,12 +1973,12 @@ } }, "browserslist": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.1.tgz", - "integrity": "sha512-/pPw5IAUyqaQXGuD5vS8tcbudyPZ241jk1W5pQBsGDfcjNQt7p8qxZhgMNuygDShte1PibLFexecWUPgmVLfrg==", + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.5.2.tgz", + "integrity": "sha512-zmJVLiKLrzko0iszd/V4SsjTaomFeoVzQGYYOYgRgsbh7WNh95RgDB0CmBdFWYs/3MyFSt69NypjL/h3iaddKQ==", "dev": true, "requires": { - "caniuse-lite": "^1.0.30000949", + "caniuse-lite": "^1.0.30000951", "electron-to-chromium": "^1.3.116", "node-releases": "^1.1.11" } @@ -2123,9 +2122,9 @@ } }, "caniuse-lite": { - "version": "1.0.30000950", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000950.tgz", - "integrity": "sha512-Cs+4U9T0okW2ftBsCIHuEYXXkki7mjXmjCh4c6PzYShk04qDEr76/iC7KwhLoWoY65wcra1XOsRD+S7BptEb5A==", + "version": "1.0.30000953", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000953.tgz", + "integrity": "sha512-2stdF/q5MZTDhQ6uC65HWbSgI9UMKbc7+HKvlwH5JBIslKoD/J9dvabP4J4Uiifu3NljbHj3iMpfYflLSNt09A==", "dev": true }, "chalk": { @@ -2646,15 +2645,14 @@ "dev": true }, "cosmiconfig": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.1.0.tgz", - "integrity": "sha512-kCNPvthka8gvLtzAxQXvWo4FxqRB+ftRZyPZNuab5ngvM9Y7yw7hbEysglptLgpkGX9nAOKTBVkHUAe8xtYR6Q==", + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.0.tgz", + "integrity": "sha512-nxt+Nfc3JAqf4WIWd0jXLjTJZmsPLrA9DDc4nRw2KFJQJK7DNooqSXrNI7tzLG50CF8axczly5UV929tBmh/7g==", "dev": true, "requires": { "import-fresh": "^2.0.0", "is-directory": "^0.3.1", - "js-yaml": "^3.9.0", - "lodash.get": "^4.4.2", + "js-yaml": "^3.13.0", "parse-json": "^4.0.0" } }, @@ -3253,9 +3251,9 @@ "dev": true }, "electron-to-chromium": { - "version": "1.3.116", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.116.tgz", - "integrity": "sha512-NKwKAXzur5vFCZYBHpdWjTMO8QptNLNP80nItkSIgUOapPAo9Uia+RvkCaZJtO7fhQaVElSvBPWEc2ku6cKsPA==", + "version": "1.3.119", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.119.tgz", + "integrity": "sha512-3mtqcAWa4HgG+Djh/oNXlPH0cOH6MmtwxN1nHSaReb9P0Vn51qYPqYwLeoSuAX9loU1wrOBhFbiX3CkeIxPfgg==", "dev": true }, "elementtree": { @@ -3870,8 +3868,7 @@ "fast-deep-equal": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz", - "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=", - "dev": true + "integrity": "sha1-ewUhjd+WZ79/Nwv3/bLLFf3Qqkk=" }, "fast-diff": { "version": "1.2.0", @@ -3913,8 +3910,7 @@ "fast-json-stable-stringify": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", - "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", - "dev": true + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=" }, "fast-levenshtein": { "version": "2.0.6", @@ -5254,9 +5250,9 @@ } }, "ieee754": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz", - "integrity": "sha512-GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==", + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz", + "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==", "dev": true }, "iferr": { @@ -5779,9 +5775,9 @@ "dev": true }, "js-yaml": { - "version": "3.12.2", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.12.2.tgz", - "integrity": "sha512-QHn/Lh/7HhZ/Twc7vJYQTkjuCa0kaCcDcjK5Zlk2rvnUpy7DxMJ23+Jc2dcyvltwQVg1nygAVlB2oRDFHoRS5Q==", + "version": "3.13.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz", + "integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==", "dev": true, "requires": { "argparse": "^1.0.7", @@ -5803,8 +5799,7 @@ "json-schema-traverse": { "version": "0.4.1", "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true + "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==" }, "json-stable-stringify": { "version": "1.0.1", @@ -6017,12 +6012,6 @@ "integrity": "sha1-gwWOkDtRy7dZ0JzPVG3qPqOcRxg=", "dev": true }, - "lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha1-LRd/ZS+jHpObRDjVNBSZ36OCXpk=", - "dev": true - }, "lodash.kebabcase": { "version": "4.1.1", "resolved": "https://registry.npmjs.org/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz", @@ -6434,9 +6423,9 @@ "dev": true }, "nan": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.1.tgz", - "integrity": "sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==", + "version": "2.13.2", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.2.tgz", + "integrity": "sha512-TghvYc72wlMGMVMluVo9WRJc0mB8KxxF/gZ4YYFy7V2ZQX9l7rgbPg7vjS9mt6U5HXODVFVI2bOduCzwOMv/lw==", "dev": true, "optional": true }, @@ -6747,9 +6736,9 @@ "dev": true }, "opn": { - "version": "5.4.0", - "resolved": "https://registry.npmjs.org/opn/-/opn-5.4.0.tgz", - "integrity": "sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz", + "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==", "dev": true, "requires": { "is-wsl": "^1.1.0" @@ -7717,8 +7706,7 @@ "punycode": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz", - "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", - "dev": true + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" }, "q": { "version": "1.5.1", @@ -7733,9 +7721,9 @@ "dev": true }, "quasar": { - "version": "1.0.0-beta.11", - "resolved": "https://registry.npmjs.org/quasar/-/quasar-1.0.0-beta.11.tgz", - "integrity": "sha512-g6VBCNa9fwNCyrWfxi8GwpXL6qNtyynweVKT+wqMZajjvE6fQ/EwETWF2zsla1Rv9NYsTCnW6o//bQn1vcqJbw==" + "version": "1.0.0-beta.13", + "resolved": "https://registry.npmjs.org/quasar/-/quasar-1.0.0-beta.13.tgz", + "integrity": "sha512-9sDSUYRVzQu2WezUy329K9yBCGaoXFkeVYp9NnvKtzs7b/Wk76GrV4kwkBqVvFZDdOYuI4OFFdjPdKdDDMAILw==" }, "querystring": { "version": "0.2.0", @@ -7750,9 +7738,9 @@ "dev": true }, "querystringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.0.tgz", - "integrity": "sha512-sluvZZ1YiTLD5jsqZcDmFyV2EwToyXZBfpoVOmktMmW+VEnhgakFHnasVph65fOjGPTWN0Nw3+XQaSeMayr0kg==", + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.1.1.tgz", + "integrity": "sha512-w7fLxIRCRT7U8Qu53jQnJyPkYZIaR4n5151KMfcJlO/A9397Wxb1amJvROTK6TOnp7PfoAmg/qXiNHI+08jRfA==", "dev": true }, "randombytes": { @@ -9401,7 +9389,6 @@ "version": "4.2.2", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz", "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==", - "dev": true, "requires": { "punycode": "^2.1.0" } @@ -9530,9 +9517,9 @@ } }, "vue": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.9.tgz", - "integrity": "sha512-t1+tvH8hybPM86oNne3ZozCD02zj/VoZIiojOBPJLjwBn7hxYU5e1gBObFpq8ts1NEn1VhPf/hVXBDAJ3X5ljg==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz", + "integrity": "sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==", "dev": true }, "vue-eslint-parser": { @@ -9588,9 +9575,9 @@ "dev": true }, "vue-server-renderer": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.9.tgz", - "integrity": "sha512-UAwI9R+H9oh6YIG9xmS4uU1X8MD9bBzDLGIhqB8UHX9tJPrWQTrBijfXfnytDpefIisfz3qLa27qFOKuX4vnsw==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue-server-renderer/-/vue-server-renderer-2.6.10.tgz", + "integrity": "sha512-UYoCEutBpKzL2fKCwx8zlRtRtwxbPZXKTqbl2iIF4yRZUNO/ovrHyDAJDljft0kd+K0tZhN53XRHkgvCZoIhug==", "dev": true, "requires": { "chalk": "^1.1.3", @@ -9647,9 +9634,9 @@ } }, "vue-template-compiler": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.9.tgz", - "integrity": "sha512-QgO0LSCdeH6zUMSgtqel+yDWsZWQPXiWBdFg9qzOhWfQL8vZ+ywinAzE04rm1XrWc+3SU0YAdWISlEgs/i8WWA==", + "version": "2.6.10", + "resolved": "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz", + "integrity": "sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg==", "dev": true, "requires": { "de-indent": "^1.0.2", diff --git a/frontend/package.json b/frontend/package.json index 2ef2eeb..afc8e77 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -13,12 +13,13 @@ "build": "quasar build" }, "dependencies": { - "@quasar/extras": "^1.0.0", + "@quasar/extras": "^1.1.1", + "ajv": "6.8.1", "axios": "^0.18.0", - "quasar": "^1.0.0-beta.0" + "quasar": "^1.0.0-beta.13" }, "devDependencies": { - "@quasar/app": "^1.0.0-beta.0", + "@quasar/app": "^1.0.0-beta.13", "@vue/eslint-config-prettier": "^4.0.0", "babel-eslint": "^10.0.1", "eslint": "^5.10.0", diff --git a/frontend/quasar.conf.js b/frontend/quasar.conf.js index 3f82b10..42861b5 100644 --- a/frontend/quasar.conf.js +++ b/frontend/quasar.conf.js @@ -46,11 +46,29 @@ module.exports = function (ctx) { 'QCardSection', 'QCardActions', 'QCheckbox', - 'QSeparator' + 'QSeparator', + 'QImg', + 'QTabs', + 'QTab', + 'QRouteTab', + 'QTabPanels', + 'QTabPanel', + 'QInput', + 'QFab', + 'QFabAction', + 'QDialog', + 'QFooter', + 'QPageSticky', + 'QAvatar', + 'QSpinnerPuff', + 'QExpansionItem', + 'QParallax', + 'QEditor', ], directives: [ - 'Ripple' + 'Ripple', + 'ClosePopup' ], // Quasar plugins @@ -85,8 +103,8 @@ module.exports = function (ctx) { devServer: { // https: true, - // port: 8080, - open: true // opens browser window automatically + port: 8081, + open: false // opens browser window automatically }, // animations: 'all' --- includes all animations diff --git a/frontend/src/layouts/MyLayout.vue b/frontend/src/layouts/MyLayout.vue index da749d4..ed0e123 100644 --- a/frontend/src/layouts/MyLayout.vue +++ b/frontend/src/layouts/MyLayout.vue @@ -1,7 +1,13 @@ diff --git a/frontend/src/pages/CacheView.vue b/frontend/src/pages/CacheView.vue index e69de29..6257998 100644 --- a/frontend/src/pages/CacheView.vue +++ b/frontend/src/pages/CacheView.vue @@ -0,0 +1,199 @@ + + + diff --git a/frontend/src/pages/Dashboard.vue b/frontend/src/pages/Dashboard.vue deleted file mode 100644 index 7abcc05..0000000 --- a/frontend/src/pages/Dashboard.vue +++ /dev/null @@ -1,14 +0,0 @@ - diff --git a/frontend/src/pages/Index.vue b/frontend/src/pages/Index.vue index 4f72725..2d9c188 100644 --- a/frontend/src/pages/Index.vue +++ b/frontend/src/pages/Index.vue @@ -1,185 +1,49 @@ - - diff --git a/frontend/src/pages/Login.vue b/frontend/src/pages/Login.vue index e69de29..c5d83e3 100644 --- a/frontend/src/pages/Login.vue +++ b/frontend/src/pages/Login.vue @@ -0,0 +1,139 @@ + + + diff --git a/frontend/src/pages/Overview.vue b/frontend/src/pages/Overview.vue new file mode 100644 index 0000000..f9285c7 --- /dev/null +++ b/frontend/src/pages/Overview.vue @@ -0,0 +1,136 @@ + + + + diff --git a/frontend/src/pages/Station.vue b/frontend/src/pages/Station.vue new file mode 100644 index 0000000..61c7d06 --- /dev/null +++ b/frontend/src/pages/Station.vue @@ -0,0 +1,59 @@ + + + + + diff --git a/frontend/src/pages/TestCaches.vue b/frontend/src/pages/TestCaches.vue new file mode 100644 index 0000000..59402e7 --- /dev/null +++ b/frontend/src/pages/TestCaches.vue @@ -0,0 +1,84 @@ + + + + + diff --git a/frontend/src/router/routes.js b/frontend/src/router/routes.js index 8571b3d..c027592 100644 --- a/frontend/src/router/routes.js +++ b/frontend/src/router/routes.js @@ -5,9 +5,34 @@ const routes = [ children: [{ path: "", component: () => import("pages/Index.vue") }] }, { - path: "/dashboard/", + path: "/overview/", component: () => import("layouts/MyLayout.vue"), - children: [{ path: "", component: () => import("pages/Dashboard.vue") }] + children: [{ path: "", component: () => import("pages/Overview.vue") }] + }, + { + path: "/testcaches/", + component: () => import("layouts/MyLayout.vue"), + children: [{path: "", component: () => import("pages/TestCaches.vue")}] + }, + { + path: "/cacheview/", + component: () => import("layouts/MyLayout.vue"), + children: [{ path: "", component: () => import("pages/CacheView.vue") }] + }, + { + path: "/station/", + component: () => import("layouts/MyLayout.vue"), + children: [{ path: "", component: () => import("pages/Station.vue") }] + }, + { + path: "/station/:id", + component: () => import("layouts/MyLayout.vue"), + children: [{ path: "", component: () => import("pages/Station.vue") }] + }, + { + path: "/login/", + component: () => import("layouts/MyLayout.vue"), + children: [{ path: "", component: () => import("pages/Login.vue") }] } ]; diff --git a/frontend/src/statics/buga_logo.svg b/frontend/src/statics/buga_logo.svg new file mode 100644 index 0000000..c9eac10 --- /dev/null +++ b/frontend/src/statics/buga_logo.svg @@ -0,0 +1,35 @@ + + + + + buga_logo + + + + + + + + + diff --git a/frontend/src/statics/osm_mock.png b/frontend/src/statics/osm_mock.png new file mode 100644 index 0000000..26eea45 Binary files /dev/null and b/frontend/src/statics/osm_mock.png differ diff --git a/frontend/src/store/auth/actions.js b/frontend/src/store/auth/actions.js new file mode 100644 index 0000000..4787a5f --- /dev/null +++ b/frontend/src/store/auth/actions.js @@ -0,0 +1,4 @@ +/* +export function someAction (context) { +} +*/ diff --git a/frontend/src/store/auth/getters.js b/frontend/src/store/auth/getters.js new file mode 100644 index 0000000..cc054a3 --- /dev/null +++ b/frontend/src/store/auth/getters.js @@ -0,0 +1,4 @@ +/* +export function someGetter (state) { +} +*/ diff --git a/frontend/src/store/auth/index.js b/frontend/src/store/auth/index.js new file mode 100644 index 0000000..b41a219 --- /dev/null +++ b/frontend/src/store/auth/index.js @@ -0,0 +1,12 @@ +import state from './state' +import * as getters from './getters' +import * as mutations from './mutations' +import * as actions from './actions' + +export default { + namespaced: true, + state, + getters, + mutations, + actions +} diff --git a/frontend/src/store/auth/mutations.js b/frontend/src/store/auth/mutations.js new file mode 100644 index 0000000..ffa7222 --- /dev/null +++ b/frontend/src/store/auth/mutations.js @@ -0,0 +1,38 @@ +import axios from 'axios' +/* +export function someMutation (state) { +} +*/ +export const evalAuth = (state) => { + console.log("isAuthenticated()"); + console.log(localStorage.getItem('userToken')); + if (localStorage.getItem('userToken')) { // TODO hier muss Abfrage mit API, z.B. /api/user?token="ME" stattfinden. + state.user.isAuthenticated = true; + } else { + state.user.isAuthenticated = false; + } +}; +export const logout = (state) => { + console.log("logout()"); + console.log(localStorage.getItem('userToken')); + localStorage.removeItem('userToken'); + console.log(localStorage.getItem('userToken')); + state.commit(evalAuth(state)); +}; +export const login = (state) => { + const data = { + username: state.user.username, + password: state.user.password + }; + console.log("GET http://localhost:8080/api/login/ - json: " + JSON.stringify(data)); + this.state.$axios.post('http://localhost:8080/api/login', data) // TODO muss GET mit AUTH Header werden + .then((response) => { + console.log("GET/POST http://localhost:8080/api/login/ - response: " + response.data); + localStorage.setItem('userToken', JSON.stringify(response)); + state.commit(evalAuth(state)); + }) + .catch((error) => { + console.log("error: " + error); + //errorDialog = true; + }) +}; diff --git a/frontend/src/store/auth/state.js b/frontend/src/store/auth/state.js new file mode 100644 index 0000000..307952d --- /dev/null +++ b/frontend/src/store/auth/state.js @@ -0,0 +1,7 @@ +export default { + user: { + username: "moximoti", + password: "1234", + isAuthenticated: false + }, +} diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index ca79aab..dfbcdb1 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -1,25 +1,54 @@ import Vue from "vue"; import Vuex from "vuex"; +import Axios from "axios"; +import auth from "./auth" // import example from './module-example' -Vue.use(Vuex); +Vue.use(Vuex, Axios); /* * If not building with SSR mode, you can * directly export the Store instantiation */ -export default function(/* { ssrContext } */) { +// export default function(/* { ssrContext } */) { +// const Store = new Vuex.Store({ +// modules: { +// // example +// }, +// +// // enable strict mode (adds overhead!) +// // for dev mode only +// strict: process.env.DEV +// }); +// +// return Store; +// } + +export default function (/* { ssrContext } */) { const Store = new Vuex.Store({ modules: { - // example + auth }, // enable strict mode (adds overhead!) // for dev mode only strict: process.env.DEV - }); + }) - return Store; -} + /* + if we want some HMR magic for it, we handle + the hot update like below. Notice we guard this + code with "process.env.DEV" -- so this doesn't + get into our production build (and it shouldn't). + */ + if (process.env.DEV && module.hot) { + module.hot.accept(['./auth'], () => { + const newShowcase = require('./auth').default; + store.hotUpdate({ modules: { showcase: newShowcase } }) + }) + } + + return Store +}; diff --git a/frontend/yarn.lock b/frontend/yarn.lock index 1b81d26..7d7f4e1 100644 --- a/frontend/yarn.lock +++ b/frontend/yarn.lock @@ -745,10 +745,10 @@ resolved "https://registry.yarnpkg.com/@positron/stack-trace/-/stack-trace-1.0.0.tgz#14fcc712a530038ef9be1ce6952315a839f466a8" integrity sha1-FPzHEqUwA475vhzmlSMVqDn0Zqg= -"@quasar/app@^1.0.0-beta.0": - version "1.0.0-beta.12" - resolved "https://registry.yarnpkg.com/@quasar/app/-/app-1.0.0-beta.12.tgz#fa5e4a0ea662e969d1306dd8d50345d136051212" - integrity sha512-lQSqW+LuBG9jmglGj82fZ/9J6Dm0nz+dbSna6rOiy4zkt1FjmQ3PCRrImyd+WIsbKUntlTcKJ4+uN6fOlblcvg== +"@quasar/app@^1.0.0-beta.13": + version "1.0.0-beta.13" + resolved "https://registry.yarnpkg.com/@quasar/app/-/app-1.0.0-beta.13.tgz#55127104ed2fc3b7bbed2882ecbaf8412a00a3e2" + integrity sha512-BMF/U/5xE7EntvVWVeQ0ud2k9z5xo4TGast5/Wv/g2+X4/VBIYUFPlDMNJh93okZ6QnRaNycU5xORo+dUiF8Cg== dependencies: "@quasar/babel-preset-app" "1.0.2" "@vue/preload-webpack-plugin" "1.1.0" @@ -787,7 +787,7 @@ minimist "1.2.0" ms "2.1.1" node-loader "0.6.0" - opn "5.4.0" + opn "5.5.0" optimize-css-assets-webpack-plugin "5.0.1" ouch "2.0.0" postcss-loader "3.0.0" @@ -800,12 +800,12 @@ stylus-loader "3.0.2" terser-webpack-plugin "1.2.3" url-loader "1.1.2" - vue "2.6.9" + vue "2.6.10" vue-loader "15.7.0" vue-router "3.0.2" - vue-server-renderer "2.6.9" + vue-server-renderer "2.6.10" vue-style-loader "4.1.2" - vue-template-compiler "2.6.9" + vue-template-compiler "2.6.10" vuex "3.1.0" webpack "4.29.6" webpack-bundle-analyzer "3.1.0" @@ -836,10 +836,10 @@ babel-plugin-dynamic-import-node "2.2.0" core-js "2.6.5" -"@quasar/extras@^1.0.0": - version "1.1.0" - resolved "https://registry.yarnpkg.com/@quasar/extras/-/extras-1.1.0.tgz#acb43f7b2bb8e65851b5ba30bc05147c48854168" - integrity sha512-594TNuQrQLwzSwhlZMkMn5AIAcNk8zPrsCkdHT021dswMv+IHATGyKJaTH4KuLKLWse+oPRoB0NddLNf9PXiuw== +"@quasar/extras@^1.1.1": + version "1.1.1" + resolved "https://registry.yarnpkg.com/@quasar/extras/-/extras-1.1.1.tgz#f514bf5108c5de964949aaa336ba65266a25fd88" + integrity sha512-n9aQ9N9GBaRF15v3Rm5QDoeLOHFzjQ874f+54TthWmaQvx/8DV6fG/bwLgA6AjLUIZJs3ogm4J1KqWO+4zSg1g== "@types/q@^1.5.1": version "1.5.2" @@ -4925,14 +4925,7 @@ opener@^1.5.1: resolved "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz#6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed" integrity sha512-goYSy5c2UXE4Ra1xixabeVh1guIX/ZV/YokJksb6q2lubWu6UbvPQ20p542/sFIll1nl8JnCyK9oBaOcCWXwvA== -opn@5.4.0: - version "5.4.0" - resolved "https://registry.yarnpkg.com/opn/-/opn-5.4.0.tgz#cb545e7aab78562beb11aa3bfabc7042e1761035" - integrity sha512-YF9MNdVy/0qvJvDtunAOzFw9iasOQHpVthTCvGzxt61Il64AYSGdK+rYwld7NAfk9qJ7dt+hymBNSc9LNYS+Sw== - dependencies: - is-wsl "^1.1.0" - -opn@^5.1.0: +opn@5.5.0, opn@^5.1.0: version "5.5.0" resolved "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz#fc7164fab56d235904c51c3b27da6758ca3b9bfc" integrity sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA== @@ -5727,10 +5720,10 @@ qs@6.5.2: resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" integrity sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA== -quasar@^1.0.0-beta.0: - version "1.0.0-beta.11" - resolved "https://registry.yarnpkg.com/quasar/-/quasar-1.0.0-beta.11.tgz#cbccd35e2a41f333492dad2cd15b8ccf5225e918" - integrity sha512-g6VBCNa9fwNCyrWfxi8GwpXL6qNtyynweVKT+wqMZajjvE6fQ/EwETWF2zsla1Rv9NYsTCnW6o//bQn1vcqJbw== +quasar@^1.0.0-beta.13: + version "1.0.0-beta.13" + resolved "https://registry.yarnpkg.com/quasar/-/quasar-1.0.0-beta.13.tgz#81622ece941b93a0186c646f1b343f400c16ebe6" + integrity sha512-9sDSUYRVzQu2WezUy329K9yBCGaoXFkeVYp9NnvKtzs7b/Wk76GrV4kwkBqVvFZDdOYuI4OFFdjPdKdDDMAILw== querystring-es3@^0.2.0: version "0.2.1" @@ -7012,10 +7005,10 @@ vue-router@3.0.2: resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.0.2.tgz#dedc67afe6c4e2bc25682c8b1c2a8c0d7c7e56be" integrity sha512-opKtsxjp9eOcFWdp6xLQPLmRGgfM932Tl56U9chYTnoWqKxQ8M20N7AkdEbM5beUh6wICoFGYugAX9vQjyJLFg== -vue-server-renderer@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.6.9.tgz#74b970be513887ad255b2132daa1720a16af69ed" - integrity sha512-UAwI9R+H9oh6YIG9xmS4uU1X8MD9bBzDLGIhqB8UHX9tJPrWQTrBijfXfnytDpefIisfz3qLa27qFOKuX4vnsw== +vue-server-renderer@2.6.10: + version "2.6.10" + resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.6.10.tgz#cb2558842ead360ae2ec1f3719b75564a805b375" + integrity sha512-UYoCEutBpKzL2fKCwx8zlRtRtwxbPZXKTqbl2iIF4yRZUNO/ovrHyDAJDljft0kd+K0tZhN53XRHkgvCZoIhug== dependencies: chalk "^1.1.3" hash-sum "^1.0.2" @@ -7034,10 +7027,10 @@ vue-style-loader@4.1.2, vue-style-loader@^4.1.0: hash-sum "^1.0.2" loader-utils "^1.0.2" -vue-template-compiler@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.9.tgz#26600415ff81a7a241aebc2d4e0abaa0f1a07915" - integrity sha512-QgO0LSCdeH6zUMSgtqel+yDWsZWQPXiWBdFg9qzOhWfQL8vZ+ywinAzE04rm1XrWc+3SU0YAdWISlEgs/i8WWA== +vue-template-compiler@2.6.10: + version "2.6.10" + resolved "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz#323b4f3495f04faa3503337a82f5d6507799c9cc" + integrity sha512-jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg== dependencies: de-indent "^1.0.2" he "^1.1.0" @@ -7047,10 +7040,10 @@ vue-template-es2015-compiler@^1.9.0: resolved "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz#1ee3bc9a16ecbf5118be334bb15f9c46f82f5825" integrity sha512-4gDntzrifFnCEvyoO8PqyJDmguXgVPxKiIxrBKjIowvL9l+N66196+72XVYR8BBf1Uv1Fgt3bGevJ+sEmxfZzw== -vue@2.6.9: - version "2.6.9" - resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.9.tgz#415c1cc1a5ed00c8f0acdd0a948139d12b7ea6b3" - integrity sha512-t1+tvH8hybPM86oNne3ZozCD02zj/VoZIiojOBPJLjwBn7hxYU5e1gBObFpq8ts1NEn1VhPf/hVXBDAJ3X5ljg== +vue@2.6.10: + version "2.6.10" + resolved "https://registry.yarnpkg.com/vue/-/vue-2.6.10.tgz#a72b1a42a4d82a721ea438d1b6bf55e66195c637" + integrity sha512-ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ== vuex@3.1.0: version "3.1.0" diff --git a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java index f4f83a6..e850b57 100644 --- a/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java +++ b/src/main/java/hhn/labsw/bugageocaching/controller/Controller.java @@ -4,17 +4,17 @@ import com.google.gson.Gson; import hhn.labsw.bugageocaching.entities.*; import hhn.labsw.bugageocaching.exceptions.IllegalParameterException; import hhn.labsw.bugageocaching.repositories.*; -import hhn.labsw.bugageocaching.service.SecurityService; -import hhn.labsw.bugageocaching.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; -import org.springframework.security.access.prepost.PreAuthorize; -import org.springframework.ui.Model; -import org.springframework.validation.BindingResult; +import org.springframework.security.crypto.bcrypt.BCrypt; import org.springframework.web.bind.annotation.*; +import java.util.ArrayList; +import java.util.List; import java.util.Optional; +import java.util.Random; +import java.util.concurrent.atomic.AtomicLong; @RestController public class Controller { @@ -41,50 +41,72 @@ public class Controller { UserRepository userRepository; @Autowired - private UserService userService; + StationReihenfolgeRepository stationReihenfolgeRepository; - @Autowired - private SecurityService securityService; + private AtomicLong counter = new AtomicLong(); - - @RequestMapping("/allCaches") + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/allCaches") @ResponseBody public String getAllCaches() { return new Gson().toJson(cacheRepository.findAll()); } - @RequestMapping("/startCache") - public @ResponseBody - String startCache(@RequestParam(value = "userID", defaultValue = "-1") String userID, - @RequestParam String cacheID) throws IllegalParameterException { + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/login") + @ResponseBody + public ResponseEntity login(@RequestBody User user) { + if (user.getUsername() == null || user.getPassword() == null) { + System.out.println(user.getUsername()); + System.out.println(user.getPassword()); + return ResponseEntity.status(401).body(null); + } + if (userRepository.findByUsername(user.getUsername()) == null) { + return ResponseEntity.status(401).body(null); + } - if (!userID.equals("-1")) { // ein angemeldeter user startet den cache(es werden zwei parameter übergeben) + if (BCrypt.checkpw(user.getPassword(), userRepository.findByUsername(user.getUsername()).getPassword())) { + String token = user.getUsername() + BCrypt.hashpw(String.valueOf(System.currentTimeMillis() + counter.incrementAndGet()), BCrypt.gensalt()); + String hashedToken = BCrypt.hashpw(token, BCrypt.gensalt()); + userRepository.findByUsername(user.getUsername()).setToken(hashedToken); + userRepository.save(userRepository.findByUsername(user.getUsername())); + //return ResponseEntity.ok(new Gson().toJson(token)); + return ResponseEntity.ok(token); + } + return ResponseEntity.status(HttpStatus.BAD_GATEWAY).body(null); + } + + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/startCache") + @ResponseBody + public String startCache(@RequestParam(value = "token", defaultValue = "-1") String token, + @RequestParam String cacheID) throws IllegalParameterException { + + if (!token.equals("-1")) { // ein angemeldeter user startet den cache(es werden zwei parameter übergeben) Bearbeitet bearbeitet = new Bearbeitet(); - Optional userOptional = userRepository.findById(Integer.valueOf(userID)); - if (userOptional.isPresent()) { - User user = userOptional.get(); - bearbeitet.setUser(user); - } else { - throw new IllegalParameterException("There is no user with the ID " + userID); - } + User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); + bearbeitet.setUser(user); Optional cacheOptional = cacheRepository.findById(Integer.valueOf(cacheID)); if (cacheOptional.isPresent()) { Cache cache = cacheOptional.get(); bearbeitet.setCache(cache); + + Station startStation = cache.getStartStation(); + bearbeitet.setAktuelleStation(startStation); } else { - throw new IllegalParameterException( "There is no cache with the ID " + cacheID); + throw new IllegalParameterException("There is no cache with the ID " + cacheID); } Optional cacheAccesDefinitionOptional = - cacheAccesDefinitionRepository.findById(1); // bearbeitet + cacheAccesDefinitionRepository.findById(0); // angefangen if (cacheAccesDefinitionOptional.isPresent()) { CacheAccesDefinition cacheAccesDefinition = cacheAccesDefinitionOptional.get(); bearbeitet.setCacheAccesDefinition(cacheAccesDefinition); } else { - throw new IllegalParameterException("There is no cacheAccesDefinition with the ID " + 1); + throw new IllegalParameterException("There is no cacheAccesDefinition with the ID " + 0); } bearbeitetRepository.save(bearbeitet); @@ -97,15 +119,222 @@ public class Controller { Cache cache = cacheOptional.get(); return new Gson().toJson(cache); } else { - throw new IllegalParameterException( "There is no cache with the ID " + cacheID); + throw new IllegalParameterException("There is no cache with the ID " + cacheID); } } } - @RequestMapping("/securityCheck") + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/logout") @ResponseBody - public String securityCheck(){ - return "Angemeldet"; + boolean logout(@RequestParam String token) { +// System.out.println("logout"); + User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); +// System.out.println(token); +// System.out.println(user.getToken()); + if (user == null || user.getToken().isEmpty() ) + return false; + user.setToken(null); + userRepository.save(user); + return true; } + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/createStation") + @ResponseBody + String createStation(@RequestParam String description, + @RequestParam String lattitude, + @RequestParam String longitude, + @RequestParam String solution) throws IllegalParameterException { + + if (description.length() == 0 || lattitude.length() == 0 || longitude.length() == 0 || solution.length() == 0) { + throw new IllegalParameterException("Fields can´t be empty"); + } + + double latti; + double longi; + + try { + latti = Double.valueOf(lattitude); + if (latti < -90 || latti > 90) { + throw new IllegalParameterException("Lattitude has to be in the range of -90 to 90 degrees"); + } + } catch (NumberFormatException e) { + throw new NumberFormatException("Lattitude has to be a decimal number"); + } + + try { + longi = Double.valueOf(longitude); + if (longi < -180 || longi > 180) { + throw new IllegalParameterException("Longitude has to be in the range of -180 to 180 degrees"); + } + } catch (NumberFormatException e) { + throw new NumberFormatException("Longitude has to be a decimal number"); + } + + Station station = new Station(); + station.setDescription(description); + station.setLattitude(latti); + station.setLongitude(longi); + station.setSolution(solution); + Random r = new Random(); + int low = 100000; + int high = 1000000; + int code = r.nextInt(high - low) + low; + station.setCode(code); + + stationRepository.save(station); + + return new Gson().toJson(station); + + } + + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/checkAdmin") + @ResponseBody + boolean checkAdmin(@RequestParam String token) { + User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); + for (Role role : user.getRoles()) { + if (role.getId() == 0) { // is admin + return true; + } + } + return false; + } + + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/getAllStations") + @ResponseBody + ResponseEntity getAllStations() { + return ResponseEntity.status(200).body(new Gson().toJson(stationRepository.findAll())); + } + + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/createCache") + @ResponseBody + ResponseEntity createCache(@RequestParam String description, + @RequestParam String name, + @RequestParam String rankingPoints, + @RequestParam(value = "rewardID", defaultValue = "-1") String rewardID, + @RequestParam List stationen) throws IllegalParameterException { + + if (description.length() == 0 || name.length() == 0 || rankingPoints.length() == 0 || stationen.size() == 0) { + return ResponseEntity.status(400).body("Fields can´t be empty"); + } + + for (Cache cache : cacheRepository.findAll()) { + if (cache.getName().equals(name)) { + return ResponseEntity.status(400).body("name is already taken"); + } + } + + int points; + + try { + points = Integer.valueOf(rankingPoints); + if (points < 0) { + return ResponseEntity.status(400).body("Ranking points has to be a positive number"); + } + } catch (NumberFormatException e) { + return ResponseEntity.status(400).body("Ranking points has to be an integer"); + } + + Optional rewardOptional = rewardRepository.findById(Integer.valueOf(rewardID)); + Reward reward = rewardOptional.orElse(null); + + Cache cache = new Cache(); + cache.setDescription(description); + cache.setName(name); + cache.setRankingPoints(Integer.valueOf(rankingPoints)); + cache.setReward(reward); + cache.setStartStation(stationen.get(0)); + cache.setStationen(stationen); + + cacheRepository.save(cache); + + for (int i = 0; i + 1 < stationen.size(); i++) { + StationReihenfolge stationReihenfolge = new StationReihenfolge(); + stationReihenfolge.setCache(cache); + stationReihenfolge.setStation(stationen.get(i)); + stationReihenfolge.setNachfolgeStation(stationen.get(i + 1)); + stationReihenfolgeRepository.save(stationReihenfolge); + } + + return ResponseEntity.status(200).body(new Gson().toJson(cache)); + } + + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/deleteCache") + @ResponseBody + ResponseEntity deleteCache(@RequestParam String cacheID) { + Optional optionalCache = cacheRepository.findById(Integer.valueOf(cacheID)); + if (!optionalCache.isPresent()) { + return ResponseEntity.status(404).body(new Gson().toJson("There is no cache with the ID " + cacheID)); + } + + Cache cache = optionalCache.get(); + + for (StationReihenfolge stationReihenfolge : stationReihenfolgeRepository.findAll()) { + if (stationReihenfolge.getCache().getId() == cache.getId()) { + stationReihenfolgeRepository.delete(stationReihenfolge); + } + } + + for (Bearbeitet bearbeitet : bearbeitetRepository.findAll()) { + if (bearbeitet.getCache().getId() == cache.getId()) { + bearbeitetRepository.delete(bearbeitet); + } + } + + cacheRepository.delete(cache); + + return ResponseEntity.status(200).body(new Gson().toJson(true)); + } + + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/getMyCaches") + @ResponseBody + ResponseEntity getMyCaches(@RequestParam String token) { + try { + User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); + if (user != null) { + ArrayList bearbeitetList = new ArrayList<>(); + + for (Bearbeitet bearbeitet : bearbeitetRepository.findAll()) { + if (bearbeitet.getUser().getId() == user.getId()) { + bearbeitetList.add(bearbeitet); + } + } + return ResponseEntity.status(200).body(new Gson().toJson(bearbeitetList)); + } else { + return ResponseEntity.status(404).body("User was not found in the database"); + } + } catch (StringIndexOutOfBoundsException e) { + return ResponseEntity.status(400).body("Invalid token"); + } + } + + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/getRankingList") + @ResponseBody + ResponseEntity getRankingList() { + return ResponseEntity.status(200).body(new Gson().toJson(userRepository.getRankingList())); + } + + @CrossOrigin(origins = "http://localhost:8081") // only for dev purpose + @RequestMapping("/api/getUser") + @ResponseBody + ResponseEntity getUser(@RequestParam String token) { + try { + User user = userRepository.findByUsername(token.substring(0, token.indexOf("$"))); + if (user != null) { + return ResponseEntity.status(200).body(new Gson().toJson(user)); + } else { + return ResponseEntity.status(404).body("User was not found in the database"); + } + } catch (StringIndexOutOfBoundsException e) { + return ResponseEntity.status(400).body("Invalid token"); + } + } } + diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/Bearbeitet.java b/src/main/java/hhn/labsw/bugageocaching/entities/Bearbeitet.java index c2c284d..f046d84 100644 --- a/src/main/java/hhn/labsw/bugageocaching/entities/Bearbeitet.java +++ b/src/main/java/hhn/labsw/bugageocaching/entities/Bearbeitet.java @@ -20,6 +20,9 @@ public class Bearbeitet { @OneToOne private CacheAccesDefinition cacheAccesDefinition; + @OneToOne + private Station aktuelleStation; + public int getId() { return id; } @@ -51,4 +54,12 @@ public class Bearbeitet { public void setCacheAccesDefinition(CacheAccesDefinition cacheAccesDefinition) { this.cacheAccesDefinition = cacheAccesDefinition; } + + public Station getAktuelleStation() { + return aktuelleStation; + } + + public void setAktuelleStation(Station aktuelleStation) { + this.aktuelleStation = aktuelleStation; + } } \ No newline at end of file diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/Cache.java b/src/main/java/hhn/labsw/bugageocaching/entities/Cache.java index d514df3..6846b04 100644 --- a/src/main/java/hhn/labsw/bugageocaching/entities/Cache.java +++ b/src/main/java/hhn/labsw/bugageocaching/entities/Cache.java @@ -23,6 +23,9 @@ public class Cache { @ManyToOne private Reward reward; + @ManyToOne + private Station startStation; + public Cache() { } @@ -73,4 +76,12 @@ public class Cache { public void setReward(Reward reward) { this.reward = reward; } + + public Station getStartStation() { + return startStation; + } + + public void setStartStation(Station startStation) { + this.startStation = startStation; + } } diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/Role.java b/src/main/java/hhn/labsw/bugageocaching/entities/Role.java index 47da1bd..6eacf93 100644 --- a/src/main/java/hhn/labsw/bugageocaching/entities/Role.java +++ b/src/main/java/hhn/labsw/bugageocaching/entities/Role.java @@ -3,20 +3,32 @@ package hhn.labsw.bugageocaching.entities; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; +<<<<<<< HEAD import javax.persistence.ManyToMany; import java.util.Set; +======= +>>>>>>> develop @Entity public class Role { @Id @GeneratedValue +<<<<<<< HEAD int id; private String name; @ManyToMany(mappedBy = "roles") private Set users; +======= + private int id; + private String name; + + public Role() { + + } +>>>>>>> develop public int getId() { return id; @@ -33,6 +45,7 @@ public class Role { public void setName(String name) { this.name = name; } +<<<<<<< HEAD public Set getUsers() { return users; @@ -41,4 +54,6 @@ public class Role { public void setUsers(Set users) { this.users = users; } +======= +>>>>>>> develop } diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/Station.java b/src/main/java/hhn/labsw/bugageocaching/entities/Station.java index 0acfaa9..fe1344f 100644 --- a/src/main/java/hhn/labsw/bugageocaching/entities/Station.java +++ b/src/main/java/hhn/labsw/bugageocaching/entities/Station.java @@ -14,6 +14,8 @@ public class Station { private String description; private double longitude; private double lattitude; + private int code; + private String solution; public Station() { } @@ -50,4 +52,19 @@ public class Station { this.lattitude = lattitude; } + public int getCode() { + return code; + } + + public void setCode(int code) { + this.code = code; + } + + public String getSolution() { + return solution; + } + + public void setSolution(String solution) { + this.solution = solution; + } } diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/StationReihenfolge.java b/src/main/java/hhn/labsw/bugageocaching/entities/StationReihenfolge.java new file mode 100644 index 0000000..b51ef51 --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/entities/StationReihenfolge.java @@ -0,0 +1,53 @@ +package hhn.labsw.bugageocaching.entities; + +import javax.persistence.*; + +@Entity +@Table +public class StationReihenfolge { + + @Id + @GeneratedValue + private int id; + + @OneToOne + private Cache cache; + + @OneToOne + private Station station; + + @OneToOne + private Station nachfolgeStation; + + public int getId() { + return id; + } + + public void setId(int id) { + this.id = id; + } + + public Cache getCache() { + return cache; + } + + public void setCache(Cache cache) { + this.cache = cache; + } + + public Station getStation() { + return station; + } + + public void setStation(Station station) { + this.station = station; + } + + public Station getNachfolgeStation() { + return nachfolgeStation; + } + + public void setNachfolgeStation(Station nachfolgeStation) { + this.nachfolgeStation = nachfolgeStation; + } +} diff --git a/src/main/java/hhn/labsw/bugageocaching/entities/User.java b/src/main/java/hhn/labsw/bugageocaching/entities/User.java index 7c0abe4..3e98d14 100644 --- a/src/main/java/hhn/labsw/bugageocaching/entities/User.java +++ b/src/main/java/hhn/labsw/bugageocaching/entities/User.java @@ -1,7 +1,11 @@ package hhn.labsw.bugageocaching.entities; import javax.persistence.*; +<<<<<<< HEAD import java.util.Set; +======= +import java.util.List; +>>>>>>> develop @Entity @Table @@ -17,6 +21,14 @@ public class User { private int rankingPointsSum; private String email; private String password; +<<<<<<< HEAD +======= + + @ManyToMany + private List roles; + + private String token; +>>>>>>> develop @ManyToOne private Team team; @@ -91,6 +103,7 @@ public class User { this.team = team; } +<<<<<<< HEAD public Set getRoles() { return roles; } @@ -105,5 +118,21 @@ public class User { public void setPasswordConfirm(String passwordConfirm) { this.passwordConfirm = passwordConfirm; +======= + public List getRoles() { + return roles; + } + + public void setRoles(List roles) { + this.roles = roles; + } + + public String getToken() { + return token; + } + + public void setToken(String token) { + this.token = token; +>>>>>>> develop } } diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/StationReihenfolgeRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/StationReihenfolgeRepository.java new file mode 100644 index 0000000..8897965 --- /dev/null +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/StationReihenfolgeRepository.java @@ -0,0 +1,7 @@ +package hhn.labsw.bugageocaching.repositories; + +import hhn.labsw.bugageocaching.entities.StationReihenfolge; +import org.springframework.data.repository.CrudRepository; + +public interface StationReihenfolgeRepository extends CrudRepository { +} diff --git a/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java b/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java index a56391e..99b0fb2 100644 --- a/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java +++ b/src/main/java/hhn/labsw/bugageocaching/repositories/UserRepository.java @@ -1,9 +1,23 @@ package hhn.labsw.bugageocaching.repositories; import hhn.labsw.bugageocaching.entities.User; +<<<<<<< HEAD import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.repository.CrudRepository; public interface UserRepository extends JpaRepository { User findByUsername(String username); +======= +import org.springframework.data.jpa.repository.Query; +import org.springframework.data.repository.CrudRepository; + +import java.util.Collection; +import java.util.List; + +public interface UserRepository extends CrudRepository { + User findByUsername(String username); + + @Query(value = "SELECT u.username, u.ranking_points_sum from user u order by ranking_points_sum DESC", nativeQuery = true) + List getRankingList(); +>>>>>>> develop } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 3fd5f91..e29f753 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -2,4 +2,5 @@ spring.datasource.url=jdbc:mariadb://seserver.se.hs-heilbronn.de:3406/buga19Geoc spring.datasource.username=BuGa19GeocachingUser spring.datasource.password=GeocachingPw spring.datasource.driver-class-name=org.mariadb.jdbc.Driver -spring.jpa.hibernate.ddl-auto=update \ No newline at end of file +spring.jpa.hibernate.ddl-auto=update +spring.jpa.show-sql=true \ No newline at end of file