diff --git a/lib/domainHelpers.js b/lib/domainHelpers.js index 99d95b8..94cae80 100644 --- a/lib/domainHelpers.js +++ b/lib/domainHelpers.js @@ -46,10 +46,15 @@ export function resolveCityDisplayName(cityInfo) { export function extractEntityCityId(entity) { if (!entity) return null; + // ترتیب مهم است: آدرس قبل از فیلد city سطح‌بالا. + // پاسخ جزئیات پزشک هر دو را دارد و می‌توانند اختلاف داشته باشند — city سطح‌بالا از + // یک رابطهٔ ManyToMany قدیمی می‌آید، ولی هم فیلتر city_id بک‌اند و هم فیلد city در + // پاسخ لیست بر پایهٔ آدرس‌اند. اگر اینجا فیلد قدیمی برنده شود، canonical پزشک به + // شهری می‌رود که sitemap او را آنجا نگذاشته است. const candidates = [ entity.city_id, - ...(Array.isArray(entity.city) ? entity.city.map((c) => c?.id) : [entity.city?.id]), ...(Array.isArray(entity.address) ? entity.address.map((a) => a?.city?.id) : []), + ...(Array.isArray(entity.city) ? entity.city.map((c) => c?.id) : [entity.city?.id]), ].filter((id) => id != null); const withDomain = candidates.find((id) => findDomainByCityId(id)); diff --git a/lib/domainHelpers.test.js b/lib/domainHelpers.test.js index 41ed9b5..dc980c3 100644 --- a/lib/domainHelpers.test.js +++ b/lib/domainHelpers.test.js @@ -54,6 +54,22 @@ describe("extractEntityCityId", () => { expect(findDomainByCityId(extractEntityCityId(doctor))).toBe("yasuj-nobat.ir"); }); + it("آدرس بر city سطح‌بالا مقدم است (اختلاف بین دو منبع)", () => { + // پاسخ واقعی جزئیات پزشک: city سطح‌بالا از رابطهٔ قدیمی، آدرس از مطب واقعی. + // فیلتر city_id و فیلد city در پاسخ لیست هر دو آدرس‌محورند، پس آدرس باید ببرد؛ + // وگرنه canonical پزشک با sitemapی که او را در آن گذاشته‌ایم واگرا می‌شود. + const doctor = { + city: [{ id: "123" }], + address: [{ city: { id: "101" } }], + }; + expect(extractEntityCityId(doctor)).toBe("101"); + expect(findDomainByCityId(extractEntityCityId(doctor))).toBe("tabriz-nobat.ir"); + }); + + it("کلینیک آدرس ندارد → همان city سطح‌بالا", () => { + expect(extractEntityCityId({ city: [{ id: "123" }] })).toBe("123"); + }); + it("بدون شهر → null", () => { expect(extractEntityCityId({ city: [], address: [] })).toBeNull(); expect(extractEntityCityId(null)).toBeNull();