From 921057252d2f0a3ae59455b9885286eedd70855e Mon Sep 17 00:00:00 2001 From: orangecoding Date: Thu, 7 May 2026 19:11:47 +0200 Subject: [PATCH] adding immoscout shape search --- .../immoscout/immoscout-web-translator.js | 21 +++++++++++++------ .../immoscout-web-translator.test.js | 11 ++++++++++ test/services/immoscout/testdata.json | 4 ++++ .../components/provider/ProviderMutator.jsx | 15 ------------- 4 files changed, 30 insertions(+), 21 deletions(-) diff --git a/lib/services/immoscout/immoscout-web-translator.js b/lib/services/immoscout/immoscout-web-translator.js index 0107aa2..c6f6bc4 100644 --- a/lib/services/immoscout/immoscout-web-translator.js +++ b/lib/services/immoscout/immoscout-web-translator.js @@ -168,10 +168,6 @@ export function convertWebToMobile(webUrl) { } } - if (segments.includes('shape')) { - throw new Error('Shape is currently not supported using Immoscout'); - } - const { query: rawParams } = queryString.parseUrl(webUrl, { arrayFormat: 'comma' }); const webParams = Object.fromEntries( Object.entries(rawParams).filter(([key]) => key !== 'enteredFrom' && PARAM_NAME_MAP[key]), @@ -179,18 +175,31 @@ export function convertWebToMobile(webUrl) { const geocodes = `/${segments.slice(2, segments.length - 1).join('/')}`; const isRadius = segments.includes('radius'); + const isShape = segments.includes('shape'); const mobileParams = { - searchType: isRadius ? 'radius' : 'region', + searchType: isRadius ? 'radius' : isShape ? 'shape' : 'region', realestatetype: realType, - ...(isRadius ? {} : { geocodes }), + ...(isRadius || isShape ? {} : { geocodes }), ...additionalParamsFromWebPath, }; + if (isShape && !webParams.shape) { + throw new Error('Shape search URL is missing the required "shape" query parameter'); + } + + if (isShape && webParams.shape) { + const browserShape = webParams.shape; + const normalized = browserShape.replace(/\.\./g, '==').replace(/\./g, '='); + const polyline = Buffer.from(normalized, 'base64').toString('utf-8'); + mobileParams.shape = polyline; + } + if (webParams.geocoordinates) { mobileParams.geocoordinates = webParams.geocoordinates; } for (const [key, val] of Object.entries(webParams)) { + if (key === 'shape') continue; if (key === 'equipment') { const items = [].concat(val).flatMap((v) => `${v}`.split(',')); const currentEquipmentParams = mobileParams[PARAM_NAME_MAP[key]]; diff --git a/test/services/immoscout/immoscout-web-translator.test.js b/test/services/immoscout/immoscout-web-translator.test.js index f9dcbaa..b7643f7 100644 --- a/test/services/immoscout/immoscout-web-translator.test.js +++ b/test/services/immoscout/immoscout-web-translator.test.js @@ -10,6 +10,17 @@ import { readFile } from 'fs/promises'; export const testData = JSON.parse(await readFile(new URL('./testdata.json', import.meta.url))); describe('#immoscout-mobile URL conversion', () => { + // Test shape URL conversion + it('should convert a full web URL with shape to mobile URL', () => { + const webUrl = + 'https://www.immobilienscout24.de/Suche/shape/haus-kaufen?shape=aW9yfkhfa3htQXJgUGlnYEBmekhte3BAcXNAfWBsQGNyQ2lkUHVvbEB3eX5Ab25WYn5Fa2BLaGRQY29FaGtTfEhme3xBdHBEdHFMamlHbmdRfHhMcmxPeHlWYnpS&price=-600000.0&ground=240.0-&enteredFrom=result_list'; + const expectedMobileUrl = + 'https://api.mobile.immobilienscout24.de/search/list?ground=240.0-&price=-600000.0&realestatetype=housebuy&searchType=shape&shape=ior~H_kxmAr%60Pig%60%40fzHm%7Bp%40qs%40%7D%60l%40crCidPuol%40wy~%40onVb~Ek%60KhdPcoEhkS%7CHf%7B%7CAtpDtqLjiGngQ%7CxLrlOxyVbzR'; + + const actualMobileUrl = convertWebToMobile(webUrl); + expect(actualMobileUrl).toBe(expectedMobileUrl); + }); + // Test URL conversion it('should convert a full web URL to mobile URL', () => { const webUrl = diff --git a/test/services/immoscout/testdata.json b/test/services/immoscout/testdata.json index 9b37123..620c913 100644 --- a/test/services/immoscout/testdata.json +++ b/test/services/immoscout/testdata.json @@ -18,5 +18,9 @@ "rentHouse": { "url": "https://www.immobilienscout24.de/Suche/de/nordrhein-westfalen/duesseldorf/haus-mieten?enteredFrom=one_step_search", "type": "houserent" + }, + "buyHouseWithShape": { + "url": "https://www.immobilienscout24.de/Suche/shape/haus-kaufen?shape=aW9yfkhfa3htQXJgUGlnYEBmekhte3BAcXNAfWBsQGNyQ2lkUHVvbEB3eX5Ab25WYn5Fa2BLaGRQY29FaGtTfEhme3xBdHBEdHFMamlHbmdRfHhMcmxPeHlWYnpS&price=-600000.0&ground=240.0-&enteredFrom=result_list", + "type": "housebuy" } } diff --git a/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx b/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx index db9d96b..7c76de1 100644 --- a/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx +++ b/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx @@ -141,21 +141,6 @@ export default function ProviderMutator({

)} - Warning} - style={{ marginBottom: '1rem' }} - description={ -
-

- Currently, our Immoscout implementation does not support drawing shapes on a map. Use a radius instead. -

-
- } - /> -