Fix loading external velopark data

This commit is contained in:
Pieter Vander Vennet 2024-01-14 22:24:35 +01:00
parent 250eede658
commit 505844b64a
6 changed files with 26 additions and 12 deletions

View file

@ -109,6 +109,7 @@
"special": { "special": {
"type": "compare_data", "type": "compare_data",
"url": "ref:velopark", "url": "ref:velopark",
"host":"https://data.velopark.be",
"postprocessing": "velopark" "postprocessing": "velopark"
} }
} }

View file

@ -16,6 +16,8 @@ import * as crypto from "crypto"
import * as eli from "../src/assets/editor-layer-index.json" import * as eli from "../src/assets/editor-layer-index.json"
import * as eli_global from "../src/assets/global-raster-layers.json" import * as eli_global from "../src/assets/global-raster-layers.json"
import ValidationUtils from "../src/Models/ThemeConfig/Conversion/ValidationUtils" import ValidationUtils from "../src/Models/ThemeConfig/Conversion/ValidationUtils"
import { LayerConfigJson } from "../src/Models/ThemeConfig/Json/LayerConfigJson"
import { QuestionableTagRenderingConfigJson } from "../src/Models/ThemeConfig/Json/QuestionableTagRenderingConfigJson"
const sharp = require("sharp") const sharp = require("sharp")
const template = readFileSync("theme.html", "utf8") const template = readFileSync("theme.html", "utf8")
@ -282,19 +284,24 @@ async function generateCsp(
SpecialVisualizations.specialVisualizations.forEach((sv) => { SpecialVisualizations.specialVisualizations.forEach((sv) => {
if (typeof sv.needsUrls === "function") { if (typeof sv.needsUrls === "function") {
// Handled below
return return
} }
apiUrls.push(...(sv.needsUrls ?? [])) apiUrls.push(...(sv.needsUrls ?? []))
}) })
const usedSpecialVisualisations = ValidationUtils.getSpecialVisualisationsWithArgs(layoutJson) const usedSpecialVisualisations = [].concat(...layoutJson.layers.map(l => ValidationUtils.getAllSpecialVisualisations(<QuestionableTagRenderingConfigJson[]> (<LayerConfigJson>l).tagRenderings ?? [])))
for (const usedSpecialVisualisation of usedSpecialVisualisations) { for (const usedSpecialVisualisation of usedSpecialVisualisations) {
if (typeof usedSpecialVisualisation === "string") { if (typeof usedSpecialVisualisation === "string") {
continue continue
} }
const neededUrls = usedSpecialVisualisation.func.needsUrls ?? [] const neededUrls = usedSpecialVisualisation.func.needsUrls ?? []
if (typeof neededUrls === "function") { if (typeof neededUrls === "function") {
apiUrls.push(...neededUrls(usedSpecialVisualisation.args)) let needed: string | string[] = neededUrls(usedSpecialVisualisation.args)
if(typeof needed === "string"){
needed = [needed]
}
apiUrls.push(...needed)
} }
} }
@ -306,11 +313,14 @@ async function generateCsp(
const vectorLayers = eliLayers.filter((l) => l.properties.type === "vector") const vectorLayers = eliLayers.filter((l) => l.properties.type === "vector")
const vectorSources = vectorLayers.map((l) => l.properties.url) const vectorSources = vectorLayers.map((l) => l.properties.url)
apiUrls.push(...vectorSources) apiUrls.push(...vectorSources)
for (const connectSource of apiUrls.concat(geojsonSources)) { for (let connectSource of apiUrls.concat(geojsonSources)) {
if (!connectSource) { if (!connectSource) {
continue continue
} }
try { try {
if(!connectSource.startsWith("http")){
connectSource = "https://"+connectSource
}
const url = new URL(connectSource) const url = new URL(connectSource)
hosts.add("https://" + url.host) hosts.add("https://" + url.host)
} catch (e) { } catch (e) {

View file

@ -4,7 +4,6 @@
import { UIEventSource } from "../../Logic/UIEventSource" import { UIEventSource } from "../../Logic/UIEventSource"
import type { OsmTags } from "../../Models/OsmFeature" import type { OsmTags } from "../../Models/OsmFeature"
import type { SpecialVisualizationState } from "../SpecialVisualization" import type { SpecialVisualizationState } from "../SpecialVisualization"
import type { P4CPicture } from "../../Logic/Web/NearbyImagesSearch"
import type { Feature } from "geojson" import type { Feature } from "geojson"
import LayerConfig from "../../Models/ThemeConfig/LayerConfig" import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
import ComparisonAction from "./ComparisonAction.svelte" import ComparisonAction from "./ComparisonAction.svelte"
@ -19,7 +18,6 @@
export let tags: UIEventSource<OsmTags> export let tags: UIEventSource<OsmTags>
export let state: SpecialVisualizationState export let state: SpecialVisualizationState
export let image: P4CPicture
export let feature: Feature export let feature: Feature
export let layer: LayerConfig export let layer: LayerConfig
@ -115,6 +113,5 @@
{layer} /> {layer} />
{/each} {/each}
{/if} {/if}

View file

@ -11,11 +11,12 @@ import { UIEventSource } from "../../Logic/UIEventSource"
import ComparisonTable from "./ComparisonTable.svelte" import ComparisonTable from "./ComparisonTable.svelte"
import LayerConfig from "../../Models/ThemeConfig/LayerConfig" import LayerConfig from "../../Models/ThemeConfig/LayerConfig"
import type { Feature } from "geojson" import type { Feature } from "geojson"
import type { OsmTags } from "../../Models/OsmFeature"
export let url: string export let url: string
export let postprocessVelopark: boolean export let postprocessVelopark: boolean
export let state: SpecialVisualizationState export let state: SpecialVisualizationState
export let tags: UIEventSource<Record<string, string>> export let tags: UIEventSource<OsmTags>
export let layer: LayerConfig export let layer: LayerConfig
export let feature: Feature export let feature: Feature
let data: any = undefined let data: any = undefined
@ -56,6 +57,6 @@ onMount(async () => {
<Loading> <Loading>
Loading {$tags[url]} Loading {$tags[url]}
</Loading> </Loading>
{:else} {:else if data.properties !== undefined}
<ComparisonTable externalProperties={data.properties} osmProperties={$tags} {state} {feature} {layer} {tags}/> <ComparisonTable externalProperties={data.properties} osmProperties={$tags} {state} {feature} {layer} {tags} />
{/if} {/if}

View file

@ -98,7 +98,7 @@ export interface SpecialVisualization {
readonly funcName: string readonly funcName: string
readonly docs: string | BaseUIElement readonly docs: string | BaseUIElement
readonly example?: string readonly example?: string
readonly needsUrls?: string[] | ((args: string[]) => string) readonly needsUrls?: string[] | ((args: string[]) => string | string[])
/** /**
* Indicates that this special visualisation will make requests to the 'alLNodesDatabase' and that it thus should be included * Indicates that this special visualisation will make requests to the 'alLNodesDatabase' and that it thus should be included

View file

@ -1641,13 +1641,18 @@ export default class SpecialVisualizations {
}, },
{ {
funcName: "compare_data", funcName: "compare_data",
needsUrls: (args) => args[0], needsUrls: (args) => args[1].split(";"),
args:[ args:[
{ {
name: "url", name: "url",
required: true, required: true,
doc: "The attribute containing the url where to fetch more data" doc: "The attribute containing the url where to fetch more data"
}, },
{
name:"host",
required:true,
doc: "The domain name(s) where data might be fetched from - this is needed to set the CSP. A domain must include 'https', e.g. 'https://example.com'. For multiple domains, separate them with ';'. If you don't know the possible domains, use '*'. "
},
{ {
name: "postprocessing", name: "postprocessing",
required: false, required: false,
@ -1657,7 +1662,7 @@ export default class SpecialVisualizations {
docs: "Gives an interactive element which shows a tag comparison between the OSM-object and the upstream object. This allows to copy some or all tags into OSM", docs: "Gives an interactive element which shows a tag comparison between the OSM-object and the upstream object. This allows to copy some or all tags into OSM",
constr(state: SpecialVisualizationState, tagSource: UIEventSource<Record<string, string>>, args: string[], feature: Feature, layer: LayerConfig): BaseUIElement { constr(state: SpecialVisualizationState, tagSource: UIEventSource<Record<string, string>>, args: string[], feature: Feature, layer: LayerConfig): BaseUIElement {
const url = args[0] const url = args[0]
const postprocessVelopark = args[1] === "velopark" const postprocessVelopark = args[2] === "velopark"
return new SvelteUIElement(ComparisonTool, {url, postprocessVelopark, state, tags: tagSource, layer, feature}) return new SvelteUIElement(ComparisonTool, {url, postprocessVelopark, state, tags: tagSource, layer, feature})
} }
} }