Use Meshkee {id}/{fa-slug} detail URLs for products and blogs.

Resolve pages via by-id APIs, slugify Farsi titles for public paths, and redirect legacy slug-only URLs to the canonical form.

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-08-22 23:52:45 +03:30
co-authored by Cursor
parent 24b5649abd
commit 0cb9aa57e2
14 changed files with 426 additions and 307 deletions
+8 -6
View File
@@ -40,11 +40,10 @@ This site is **catalog-only** (no shopping cart). Login / user icon goes to the
| Path | Source |
| --- | --- |
| `/` | Homepage + static image slots + store specials + latest blogs |
| `/products` | Store items (`GET /tenants/{domain}/store-items`) |
| `/products?categoryId=` | Same, filtered |
| `/products/[variantId]` | Store item variant + product description/gallery + comments |
| `/blog` | `GET /tenants/{domain}/blogs` (falls back to `lib/data.ts` `blogPosts`) |
| `/blog/[slug]` | Blog details + comments |
| `/products` | Catalog / store items list |
| `/products/[id]/[slug]` | Product detail via `GET .../products/by-id/{id}` |
| `/blog` | Blog list |
| `/blog/[id]/[slug]` | Blog detail via `GET .../blogs/by-id/{id}` |
| `/about` | About us |
| `/contact` | Contact us |
| `/meshkee/static-image-slots` | Slot catalog for the dashboard Refresh button |
@@ -97,7 +96,10 @@ Products list/search: prefer store-items; if empty, fall back to `GET /products`
- Do **not** ship `public/sitemap.xml` or `public/robots.txt` (nginx proxies to Meshkee API).
- Build generates `lib/sitemap-config.generated.json` (`npm run generate:sitemap-config` / `prebuild`); served at `GET /meshkee/sitemap-config.json`.
- After deploy: business dashboard → Website → Settings → Sync sitemap config.
- Templates omitted (defaults `/products/{slug}`, `/blog/{slug}` match this site).
- Detail URLs (Meshkee defaults — omit `templates` unless customized):
- Product: `/products/{id}/{nameFaSlug}` — slugify `nameFa` (Farsi kept, spaces → `-`); resolve with `products/by-id/{id}`. Never use legacy DB slug in public URLs.
- Blog: `/blog/{id}/{titleSlug}` — `blogs/by-id/{id}`.
- Legacy `/products/{slug}` and `/blog/{slug}` redirect to the canonical `{id}/{slug}` form.
- Every public page has unique title/description; product/blog prefer CMS fields.
## Original business data (do not invent replacements)