feat(blog): enhance blog identifier resolution to support multiple identifiers and improve URL handling
This commit is contained in:
+16
-2
@@ -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 |
|
||||
|
||||
Reference in New Issue
Block a user