diff --git a/lib/services/immoscout/immoscout-web-translator.js b/lib/services/immoscout/immoscout-web-translator.js index 0107aa2b..1a8cb14a 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,27 @@ 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) { + const browserShape = webParams.shape; + const normalized = browserShape.replace(/\.\./g, '==').replace(/\./g, '='); + const polyline = Buffer.from(normalized, 'base64').toString('utf-8'); + mobileParams.shape = polyline; // Raw polyline for Mobile API + } + 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 9f963e20..0c80b8ff 100644 --- a/test/services/immoscout/immoscout-web-translator.test.js +++ b/test/services/immoscout/immoscout-web-translator.test.js @@ -21,6 +21,17 @@ describe('#immoscout-mobile URL conversion', () => { expect(actualMobileUrl).to.equal(expectedMobileUrl); }); + // 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?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).to.equal(expectedMobileUrl); + }); + // Test URL conversion of web-only SEO path it('should convert a SEO web path to the correct query params', () => { const webUrl = 'https://www.immobilienscout24.de/Suche/de/berlin/berlin/wohnung-mit-balkon-mieten?equipment=garden'; diff --git a/test/services/immoscout/testdata.json b/test/services/immoscout/testdata.json index 9b371239..620c9135 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 db9d96b5..007f696f 100644 --- a/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx +++ b/ui/src/views/jobs/mutation/components/provider/ProviderMutator.jsx @@ -141,21 +141,7 @@ 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. -

-
- } - /> - +