feat(blog): enhance blog identifier resolution to support multiple identifiers and improve URL handling

This commit is contained in:
hamed
2026-08-09 07:14:16 +03:30
parent f6ef086589
commit dcf9285467
4 changed files with 164 additions and 3 deletions
+16 -2
View File
@@ -133,14 +133,28 @@ Paginated (`{ data:[...], meta:{...} }`), each item the blog list shape (include
## GET `/api/v1/blog/{slug}`
Get a single blog post by slug.
Get a single blog post by any identifier it has ever been addressed by.
**Permission:** `PUBLIC`
### Path Parameters
| Param | Type | Description |
|-------|------|-------------|
| `slug` | string | URL slug (e.g. `ashnayi-ba-bimari-diabat`) or UUID |
| `slug` | string | Current slug, UUID, `topic_slug`, or an outdated slug ending in the post's 8-char uuid prefix. Resolution order: slug → uuid → topic_slug → uuid-prefix suffix. |
### چرا چند شناسه
`slug` از عنوان ساخته می‌شود، پس ویرایش عنوان URL را عوض می‌کند و هر لینک منتشرشدهٔ قبلی ۴۰۴ می‌گیرد — Search Console همین ۴۰۴ها را روی `behbahan-nobat.ir` گزارش کرد. سه شناسهٔ پایدار می‌مانند: `uuid`، `topic_slug` پایپ‌لاین محتوا، و پسوند ۸ کاراکتریِ uuid که `Blog::generateSlug()` به انتهای هر اسلاگ می‌چسباند.
پاسخ همیشه `slug` قطعیِ فعلی را برمی‌گرداند؛ کلاینت آن را با اسلاگ درخواستی مقایسه می‌کند و در صورت اختلاف ریدایرکت دائمی می‌زند (سایت عمومی همین کار را می‌کند).
قواعدی که با این تغییر عوض **نشدند**:
- پستِ غیر `published` با هیچ شناسه‌ای برنمی‌گردد — نه uuid، نه topic_slug.
- فیلتر `city_id` بعد از resolve اعمال می‌شود؛ پستِ شهر دیگر همچنان ۴۰۴ است.
- پسوندی که hex هشت‌کاراکتری نیست شناسه به حساب نمی‌آید (`some-old-title-zzzzzzzz` → ۴۰۴).
تست: `tests/Blog/BlogIdentifierResolutionTest.php`.
### Query Parameters
| Param | Type | Required | Description |