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.
-
-
- }
- />
-