diff --git a/build.gradle.kts b/build.gradle.kts
index 77f6f5e..24ded25 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -30,6 +30,7 @@ dependencies {
implementation("ch.qos.logback:logback-classic:$logback_version")
implementation("io.ktor:ktor-server-call-logging:$ktor_version")
implementation("io.ktor:ktor-server-metrics-micrometer:$ktor_version")
+ implementation("io.ktor:ktor-server-cors:$ktor_version")
implementation("org.jetbrains.exposed:exposed-core:$exposedVersion")
implementation("org.jetbrains.exposed:exposed-dao:$exposedVersion")
diff --git a/src/main/js/pluckr-app/package-lock.json b/src/main/js/pluckr-app/package-lock.json
index 8baeceb..ae7b01e 100644
--- a/src/main/js/pluckr-app/package-lock.json
+++ b/src/main/js/pluckr-app/package-lock.json
@@ -20,7 +20,7 @@
"@open-wc/eslint-config": "^4.3.0",
"@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-node-resolve": "^13.0.6",
- "@web/dev-server": "^0.1.28",
+ "@web/dev-server": "^0.1.32",
"@web/rollup-plugin-html": "^1.10.1",
"@web/rollup-plugin-import-meta-assets": "^1.0.7",
"babel-plugin-template-html-minifier": "^4.1.0",
@@ -28,6 +28,7 @@
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0",
"husky": "^4.3.8",
+ "koa-proxies": "^0.12.2",
"lint-staged": "^10.5.4",
"prettier": "^2.4.1",
"rimraf": "^3.0.2",
@@ -4688,6 +4689,12 @@
"node": ">= 0.6"
}
},
+ "node_modules/eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
"node_modules/execa": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
@@ -4881,6 +4888,26 @@
"integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
"dev": true
},
+ "node_modules/follow-redirects": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
+ "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "individual",
+ "url": "https://github.com/sponsors/RubenVerborgh"
+ }
+ ],
+ "engines": {
+ "node": ">=4.0"
+ },
+ "peerDependenciesMeta": {
+ "debug": {
+ "optional": true
+ }
+ }
+ },
"node_modules/fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -5267,6 +5294,20 @@
"node": ">= 0.6"
}
},
+ "node_modules/http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "dependencies": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=8.0.0"
+ }
+ },
"node_modules/human-signals": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@@ -5833,6 +5874,12 @@
"node": ">=8"
}
},
+ "node_modules/isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true
+ },
"node_modules/isbinaryfile": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
@@ -6153,6 +6200,20 @@
"etag": "^1.8.1"
}
},
+ "node_modules/koa-proxies": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/koa-proxies/-/koa-proxies-0.12.2.tgz",
+ "integrity": "sha512-1YAwwKv1Y8azyly4WChBA5Tsnj2M0VkJqSjk5VPzEKu2pBjAlWH8QNUSitGYyGQu12x90GsI6P5kGG7nrlH1LA==",
+ "dev": true,
+ "dependencies": {
+ "http-proxy": "^1.18.1",
+ "path-match": "^1.2.4",
+ "uuid": "^8.3.2"
+ },
+ "peerDependencies": {
+ "koa": ">=2"
+ }
+ },
"node_modules/koa-send": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz",
@@ -7135,12 +7196,50 @@
"node": ">=8"
}
},
+ "node_modules/path-match": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/path-match/-/path-match-1.2.4.tgz",
+ "integrity": "sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==",
+ "dev": true,
+ "dependencies": {
+ "http-errors": "~1.4.0",
+ "path-to-regexp": "^1.0.0"
+ }
+ },
+ "node_modules/path-match/node_modules/http-errors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz",
+ "integrity": "sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "2.0.1",
+ "statuses": ">= 1.2.1 < 2"
+ },
+ "engines": {
+ "node": ">= 0.6"
+ }
+ },
+ "node_modules/path-match/node_modules/inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
+ "dev": true
+ },
"node_modules/path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
+ "node_modules/path-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "dev": true,
+ "dependencies": {
+ "isarray": "0.0.1"
+ }
+ },
"node_modules/path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -7556,6 +7655,12 @@
"node": ">=0.10.5"
}
},
+ "node_modules/requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
"node_modules/resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
@@ -8653,6 +8758,15 @@
"punycode": "^2.1.0"
}
},
+ "node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
@@ -12682,6 +12796,12 @@
"integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==",
"dev": true
},
+ "eventemitter3": {
+ "version": "4.0.7",
+ "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-4.0.7.tgz",
+ "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==",
+ "dev": true
+ },
"execa": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/execa/-/execa-4.1.0.tgz",
@@ -12840,6 +12960,12 @@
"integrity": "sha512-0sQoMh9s0BYsm+12Huy/rkKxVu4R1+r96YX5cG44rHV0pQ6iC3Q+mkoMFaGWObMFYQxCVT+ssG1ksneA2MI9KQ==",
"dev": true
},
+ "follow-redirects": {
+ "version": "1.15.1",
+ "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.1.tgz",
+ "integrity": "sha512-yLAMQs+k0b2m7cVxpS1VKJVvoz7SS9Td1zss3XRwXj+ZDH00RJgnuLx7E44wx02kQLrdM3aOOy+FpzS7+8OizA==",
+ "dev": true
+ },
"fresh": {
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
@@ -13120,6 +13246,17 @@
}
}
},
+ "http-proxy": {
+ "version": "1.18.1",
+ "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.18.1.tgz",
+ "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==",
+ "dev": true,
+ "requires": {
+ "eventemitter3": "^4.0.0",
+ "follow-redirects": "^1.0.0",
+ "requires-port": "^1.0.0"
+ }
+ },
"human-signals": {
"version": "1.1.1",
"resolved": "https://registry.npmjs.org/human-signals/-/human-signals-1.1.1.tgz",
@@ -13503,6 +13640,12 @@
"is-docker": "^2.0.0"
}
},
+ "isarray": {
+ "version": "0.0.1",
+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz",
+ "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==",
+ "dev": true
+ },
"isbinaryfile": {
"version": "4.0.10",
"resolved": "https://registry.npmjs.org/isbinaryfile/-/isbinaryfile-4.0.10.tgz",
@@ -13756,6 +13899,17 @@
"etag": "^1.8.1"
}
},
+ "koa-proxies": {
+ "version": "0.12.2",
+ "resolved": "https://registry.npmjs.org/koa-proxies/-/koa-proxies-0.12.2.tgz",
+ "integrity": "sha512-1YAwwKv1Y8azyly4WChBA5Tsnj2M0VkJqSjk5VPzEKu2pBjAlWH8QNUSitGYyGQu12x90GsI6P5kGG7nrlH1LA==",
+ "dev": true,
+ "requires": {
+ "http-proxy": "^1.18.1",
+ "path-match": "^1.2.4",
+ "uuid": "^8.3.2"
+ }
+ },
"koa-send": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/koa-send/-/koa-send-5.0.1.tgz",
@@ -14530,12 +14684,49 @@
"integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==",
"dev": true
},
+ "path-match": {
+ "version": "1.2.4",
+ "resolved": "https://registry.npmjs.org/path-match/-/path-match-1.2.4.tgz",
+ "integrity": "sha512-UWlehEdqu36jmh4h5CWJ7tARp1OEVKGHKm6+dg9qMq5RKUTV5WJrGgaZ3dN2m7WFAXDbjlHzvJvL/IUpy84Ktw==",
+ "dev": true,
+ "requires": {
+ "http-errors": "~1.4.0",
+ "path-to-regexp": "^1.0.0"
+ },
+ "dependencies": {
+ "http-errors": {
+ "version": "1.4.0",
+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.4.0.tgz",
+ "integrity": "sha512-oLjPqve1tuOl5aRhv8GK5eHpqP1C9fb+Ol+XTLjKfLltE44zdDbEdjPSbU7Ch5rSNsVFqZn97SrMmZLdu1/YMw==",
+ "dev": true,
+ "requires": {
+ "inherits": "2.0.1",
+ "statuses": ">= 1.2.1 < 2"
+ }
+ },
+ "inherits": {
+ "version": "2.0.1",
+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
+ "integrity": "sha512-8nWq2nLTAwd02jTqJExUYFSD/fKq6VH9Y/oG2accc/kdI0V98Bag8d5a4gi3XHz73rDWa2PvTtvcWYquKqSENA==",
+ "dev": true
+ }
+ }
+ },
"path-parse": {
"version": "1.0.7",
"resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.7.tgz",
"integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==",
"dev": true
},
+ "path-to-regexp": {
+ "version": "1.8.0",
+ "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-1.8.0.tgz",
+ "integrity": "sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==",
+ "dev": true,
+ "requires": {
+ "isarray": "0.0.1"
+ }
+ },
"path-type": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz",
@@ -14835,6 +15026,12 @@
"integrity": "sha512-L9jEkOi3ASd9PYit2cwRfyppc9NoABujTP8/5gFcbERmo5jUoAKovIC3fsF17pkTnGsrByysqX+Kxd2OTNI1ww==",
"dev": true
},
+ "requires-port": {
+ "version": "1.0.0",
+ "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz",
+ "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==",
+ "dev": true
+ },
"resize-observer-polyfill": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz",
@@ -15666,6 +15863,12 @@
"punycode": "^2.1.0"
}
},
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true
+ },
"v8-compile-cache": {
"version": "2.3.0",
"resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz",
diff --git a/src/main/js/pluckr-app/package.json b/src/main/js/pluckr-app/package.json
index 993abb1..6cce110 100644
--- a/src/main/js/pluckr-app/package.json
+++ b/src/main/js/pluckr-app/package.json
@@ -25,7 +25,7 @@
"@open-wc/eslint-config": "^4.3.0",
"@rollup/plugin-babel": "^5.3.0",
"@rollup/plugin-node-resolve": "^13.0.6",
- "@web/dev-server": "^0.1.28",
+ "@web/dev-server": "^0.1.32",
"@web/rollup-plugin-html": "^1.10.1",
"@web/rollup-plugin-import-meta-assets": "^1.0.7",
"babel-plugin-template-html-minifier": "^4.1.0",
@@ -33,6 +33,7 @@
"eslint": "^7.32.0",
"eslint-config-prettier": "^8.3.0",
"husky": "^4.3.8",
+ "koa-proxies": "^0.12.2",
"lint-staged": "^10.5.4",
"prettier": "^2.4.1",
"rimraf": "^3.0.2",
diff --git a/src/main/js/pluckr-app/src/PluckrApp.js b/src/main/js/pluckr-app/src/PluckrApp.js
index 490f1a8..1d66595 100644
--- a/src/main/js/pluckr-app/src/PluckrApp.js
+++ b/src/main/js/pluckr-app/src/PluckrApp.js
@@ -2,12 +2,19 @@ import { LitElement, html, css } from 'lit';
import {
map as createMap,
tileLayer,
+ marker,
+ icon,
} from '../node_modules/leaflet/dist/leaflet-src.esm.js';
export class PluckrApp extends LitElement {
+
+ map = null;
+ defaultIcon = icon({iconUrl: 'data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABkAAAApCAYAAADAk4LOAAAFgUlEQVR4Aa1XA5BjWRTN2oW17d3YaZtr2962HUzbDNpjszW24mRt28p47v7zq/bXZtrp/lWnXr337j3nPCe85NcypgSFdugCpW5YoDAMRaIMqRi6aKq5E3YqDQO3qAwjVWrD8Ncq/RBpykd8oZUb/kaJutow8r1aP9II0WmLKLIsJyv1w/kqw9Ch2MYdB++12Onxee/QMwvf4/Dk/Lfp/i4nxTXtOoQ4pW5Aj7wpici1A9erdAN2OH64x8OSP9j3Ft3b7aWkTg/Fm91siTra0f9on5sQr9INejH6CUUUpavjFNq1B+Oadhxmnfa8RfEmN8VNAsQhPqF55xHkMzz3jSmChWU6f7/XZKNH+9+hBLOHYozuKQPxyMPUKkrX/K0uWnfFaJGS1QPRtZsOPtr3NsW0uyh6NNCOkU3Yz+bXbT3I8G3xE5EXLXtCXbbqwCO9zPQYPRTZ5vIDXD7U+w7rFDEoUUf7ibHIR4y6bLVPXrz8JVZEql13trxwue/uDivd3fkWRbS6/IA2bID4uk0UpF1N8qLlbBlXs4Ee7HLTfV1j54APvODnSfOWBqtKVvjgLKzF5YdEk5ewRkGlK0i33Eofffc7HT56jD7/6U+qH3Cx7SBLNntH5YIPvODnyfIXZYRVDPqgHtLs5ABHD3YzLuespb7t79FY34DjMwrVrcTuwlT55YMPvOBnRrJ4VXTdNnYug5ucHLBjEpt30701A3Ts+HEa73u6dT3FNWwflY86eMHPk+Yu+i6pzUpRrW7SNDg5JHR4KapmM5Wv2E8Tfcb1HoqqHMHU+uWDD7zg54mz5/2BSnizi9T1Dg4QQXLToGNCkb6tb1NU+QAlGr1++eADrzhn/u8Q2YZhQVlZ5+CAOtqfbhmaUCS1ezNFVm2imDbPmPng5wmz+gwh+oHDce0eUtQ6OGDIyR0uUhUsoO3vfDmmgOezH0mZN59x7MBi++WDL1g/eEiU3avlidO671bkLfwbw5XV2P8Pzo0ydy4t2/0eu33xYSOMOD8hTf4CrBtGMSoXfPLchX+J0ruSePw3LZeK0juPJbYzrhkH0io7B3k164hiGvawhOKMLkrQLyVpZg8rHFW7E2uHOL888IBPlNZ1FPzstSJM694fWr6RwpvcJK60+0HCILTBzZLFNdtAzJaohze60T8qBzyh5ZuOg5e7uwQppofEmf2++DYvmySqGBuKaicF1blQjhuHdvCIMvp8whTTfZzI7RldpwtSzL+F1+wkdZ2TBOW2gIF88PBTzD/gpeREAMEbxnJcaJHNHrpzji0gQCS6hdkEeYt9DF/2qPcEC8RM28Hwmr3sdNyht00byAut2k3gufWNtgtOEOFGUwcXWNDbdNbpgBGxEvKkOQsxivJx33iow0Vw5S6SVTrpVq11ysA2Rp7gTfPfktc6zhtXBBC+adRLshf6sG2RfHPZ5EAc4sVZ83yCN00Fk/4kggu40ZTvIEm5g24qtU4KjBrx/BTTH8ifVASAG7gKrnWxJDcU7x8X6Ecczhm3o6YicvsLXWfh3Ch1W0k8x0nXF+0fFxgt4phz8QvypiwCCFKMqXCnqXExjq10beH+UUA7+nG6mdG/Pu0f3LgFcGrl2s0kNNjpmoJ9o4B29CMO8dMT4Q5ox8uitF6fqsrJOr8qnwNbRzv6hSnG5wP+64C7h9lp30hKNtKdWjtdkbuPA19nJ7Tz3zR/ibgARbhb4AlhavcBebmTHcFl2fvYEnW0ox9xMxKBS8btJ+KiEbq9zA4RthQXDhPa0T9TEe69gWupwc6uBUphquXgf+/FrIjweHQS4/pduMe5ERUMHUd9xv8ZR98CxkS4F2n3EUrUZ10EYNw7BWm9x1GiPssi3GgiGRDKWRYZfXlON+dfNbM+GgIwYdwAAAAASUVORK5CYII='});
+
static get properties() {
return {
title: { type: String },
+ location: {type: Object},
};
}
@@ -41,13 +48,14 @@ export class PluckrApp extends LitElement {
constructor() {
super();
this.title = 'My app';
+ this.location = { x: 52.0474828687443, y: 5.080036739440433};
}
firstUpdated(_changedProperties) {
super.firstUpdated(_changedProperties);
- const map = createMap(this.renderRoot.querySelector('#map')).setView(
- [51.505, -0.09],
+ this.map = createMap(this.renderRoot.querySelector('#map')).setView(
+ [this.location.x, this.location.y],
13
);
@@ -58,7 +66,32 @@ export class PluckrApp extends LitElement {
attribution:
'© Mapbox © OpenStreetMap',
}
- ).addTo(map);
+ ).addTo(this.map);
+
+ this.map.on('moveend', this.moveEnd.bind(this));
+
+ // Load once
+ this.loadMarkers(this.map.getBounds());
+ }
+
+ loadMarkers(bounds){
+ console.log('Success: ;eihgwe;rghwekl;ge');
+ fetch(`/api/trees?bbox=${bounds._northEast.lat},${bounds._northEast.lng},${bounds._southWest.lat},${bounds._southWest.lng}`)
+ .then(response => response.json())
+ .then(data => {
+ console.log('Loaded POIs', data);
+ data.map(p =>
+ marker([p.location.x, p.location.y], {icon : this.defaultIcon}).addTo(this.map)
+ );
+
+ })
+ .catch((error) => {
+ console.error('Impossible to log Points of Interests:', error);
+ });
+ }
+
+ moveEnd(e) {
+ this.loadMarkers(e.target.getBounds());
}
render() {
diff --git a/src/main/js/pluckr-app/web-dev-server.config.mjs b/src/main/js/pluckr-app/web-dev-server.config.mjs
index 8d82ff5..959af9c 100644
--- a/src/main/js/pluckr-app/web-dev-server.config.mjs
+++ b/src/main/js/pluckr-app/web-dev-server.config.mjs
@@ -1,16 +1,23 @@
// import { hmrPlugin, presets } from '@open-wc/dev-server-hmr';
+import proxy from 'koa-proxies';
/** Use Hot Module replacement by adding --hmr to the start command */
const hmr = process.argv.includes('--hmr');
export default /** @type {import('@web/dev-server').DevServerConfig} */ ({
+ middleware: [
+ proxy('/api', {
+ target: 'http://localhost:9090',
+ }),
+ ],
+
open: '/',
watch: !hmr,
/** Resolve bare module imports */
nodeResolve: {
exportConditions: ['browser', 'development'],
},
-
+
/** Compile JS for older browsers. Requires @web/dev-server-esbuild plugin */
// esbuildTarget: 'auto'
diff --git a/src/main/kotlin/nl/lengrand/pluckr/Application.kt b/src/main/kotlin/nl/lengrand/pluckr/Application.kt
index 19b7df9..7ee1e57 100644
--- a/src/main/kotlin/nl/lengrand/pluckr/Application.kt
+++ b/src/main/kotlin/nl/lengrand/pluckr/Application.kt
@@ -7,6 +7,7 @@ import io.ktor.server.metrics.micrometer.*
import io.ktor.server.netty.*
import io.ktor.server.plugins.callloging.*
import io.ktor.server.plugins.contentnegotiation.*
+import io.ktor.server.plugins.cors.routing.*
import kotlinx.serialization.json.Json
import net.postgis.jdbc.geometry.Point
import nl.lengrand.pluckr.plugins.*
@@ -17,6 +18,7 @@ fun Application.myapp(){
val database = initDb()
+ install(CORS)
install(ContentNegotiation){
json(Json {
prettyPrint = true
@@ -24,7 +26,7 @@ fun Application.myapp(){
})
}
install(CallLogging)
- install(MicrometerMetrics)
+// install(MicrometerMetrics)
configureRouting(database)
}
@@ -44,11 +46,11 @@ fun initDb(): Database {
// location = Point(52.04681865145196, 5.079779509938945)
// }
- Trees.insert {
- it[name] = "Laurier 2"
- it[description] = "un laurier accessible à tous"
- it[location] = Point(52.04681865145196, 5.079779509938945)
- }
+// Trees.insert {
+// it[name] = "Laurier 2"
+// it[description] = "un laurier accessible à tous"
+// it[location] = Point(52.04681865145196, 5.079779509938945)
+// }
// println("Trees: ${Tree.all().joinToString {it.location.value}}")
diff --git a/src/main/kotlin/Controller.kt b/src/main/kotlin/nl/lengrand/pluckr/Controller.kt
similarity index 94%
rename from src/main/kotlin/Controller.kt
rename to src/main/kotlin/nl/lengrand/pluckr/Controller.kt
index 48d9383..77ae474 100644
--- a/src/main/kotlin/Controller.kt
+++ b/src/main/kotlin/nl/lengrand/pluckr/Controller.kt
@@ -45,15 +45,15 @@ private fun fromRow(it: ResultRow): Tree {
class Controller(private val database: Database) {
fun getTrees() : ArrayList {
- println("CALLED")
val trees : ArrayList = arrayListOf()
-
transaction(database){
Trees.selectAll().map { trees.add(fromRow(it)) }
}
-
- println(trees)
-
return trees
}
+
+ fun getTrees(bbox: List?) : ArrayList {
+ println(bbox)
+ return getTrees()
+ }
}
\ No newline at end of file
diff --git a/src/main/kotlin/nl/lengrand/pluckr/Database.kt b/src/main/kotlin/nl/lengrand/pluckr/Database.kt
index 39ff823..2ab60b3 100644
--- a/src/main/kotlin/nl/lengrand/pluckr/Database.kt
+++ b/src/main/kotlin/nl/lengrand/pluckr/Database.kt
@@ -2,10 +2,6 @@ package nl.lengrand.pluckr
import net.postgis.jdbc.PGgeometry
import net.postgis.jdbc.geometry.Point
-import org.jetbrains.exposed.dao.IntEntity
-import org.jetbrains.exposed.dao.IntEntityClass
-import org.jetbrains.exposed.dao.id.EntityID
-import org.jetbrains.exposed.dao.id.IntIdTable
import org.jetbrains.exposed.sql.Column
import org.jetbrains.exposed.sql.ColumnType
import org.jetbrains.exposed.sql.Table
diff --git a/src/main/kotlin/nl/lengrand/pluckr/plugins/Routing.kt b/src/main/kotlin/nl/lengrand/pluckr/plugins/Routing.kt
index 1258f6f..c5f9df9 100644
--- a/src/main/kotlin/nl/lengrand/pluckr/plugins/Routing.kt
+++ b/src/main/kotlin/nl/lengrand/pluckr/plugins/Routing.kt
@@ -12,10 +12,20 @@ fun Application.configureRouting(database: Database) {
val controller = Controller(database)
routing {
- get("/trees") {
- call.respond(controller.getTrees())
+ get("/api/trees") {
+ println("IN HERE FIRST")
+ if(call.request.queryParameters["bbox"] != null){
+ println("IN HERE")
+ val bbox = call.request.queryParameters["bbox"]?.split(",")?.map { it.toDouble() }
+ call.respond(controller.getTrees(bbox))
+ }
+ else{
+ call.respond(controller.getTrees())
+ }
}
+
+
get("/hello") {
call.respondText("Hello the World!")
}