[CL-PASSPORT-SSG-404] prerender: /objects/<slug>/passport SSG entry (фиксит prod 404) #199
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "fix/cl-passport-ssg-404"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Что сделано
Добавил SSG-генерацию для
/objects/<slug>/passportвapp/scripts/prerender.js. Цикл поobjectsData:ROUTE_META[/objects/${obj.slug}/passport]— title{name} — Asset Passport, descriptionVerified asset passport for {name}: financials, ESG grade, occupancy, sources, JSON-LD унаследован из hotelSchema с уникальным@id(/passport#hotel) иmainEntityOfPageуказывающим на/passportWebPage.SSG_ROUTES.push(/objects/${obj.slug}/passport)— теперь prerender генерирует/objects/<slug>/passport/index.htmlна диске.console.logобновлён: считает passport routes наряду с object detail + dashboard.Также добавил инвариант в
app/scripts/__tests__/prerender.test.js: source must push passport URL + assign ROUTE_META + jsonLd с@idна/passport.Зачем
Live evidence prod 404 (CEO репорт скриншот):
Root cause:
prerender.jsloop поobjectsDataпушитSSG_ROUTESдля/objects/<slug>и/objects/<slug>/dashboard, но не для/objects/<slug>/passport. nginxtry_files $uri $uri/ =404ищет/objects/<slug>/passport/index.htmlна диске — нет файла → 404. SPA-route в React Router определён (AssetPassportPageна/objects/:id/passport) и API работает — ломается только prerender pipeline.Линки на passport идут из:
PassportEditor.tsx(admin UI) —href={/objects/${objectId}/passport}QuickInvestBar.tsx(cabinet object view) —window.open(/objects/${objectId}/passport)AssetPassportButton.tsx— public buttonВсе эти линки ведут на 404 для любого investor/admin, не только этого hotel-baistrocchi.
План тестирования
npx vitest run scripts/__tests__/prerender.test.js— 1/1 PASS (top-level asserts ran at module-load; passport push + ROUTE_META + @id pattern checked)npx vitest run scripts/__tests__— 3/3 файла, 5/5 тестов PASS (sitemap, prerender, indexable-urls)npx eslint scripts/prerender.js scripts/__tests__/prerender.test.js --max-warnings 0— clean (exit=0)bash scripts/deploy.sh:curl https://europa-tech.org/objects/<slug>/passportдолжен вернуть 200 (prerendered HTML с<title>{name} — Asset Passport</title>).Где могу ошибаться
smartTrim(title, 60)— title{name} — Asset Passportдля длинных name может урезаться. Hotel Baistrocchi даёт ~58 chars — fits. Для очень длинных name fallback: уже короткий suffix.@idиспользует#hotelfragment (parallel dashboard pattern из PR#85). Google интерпретирует как URI ref, unique within document. Прецедент уже принят CEO.objectsData(fetched раньше в скрипте). Если новый object добавляется после ребилда — passport-route появится при следующем deploy. Это уже существующее ограничение для/objects/<slug>и/objects/<slug>/dashboard— не вношу регрессии.