# Post — Thumbnail (`thumbnail_id`)

Tổng quan
-------

Thêm cột `thumbnail_id` (UUID) vào bảng `posts` để tham chiếu tới bản ghi trong bảng `files` dùng làm thumbnail / ảnh đại diện cho bài viết.
API (FE hướng dẫn)
------------------

1) Create post (POST /api/v1/posts)

- Request body: thêm trường `thumbnailId` (UUID | null)

Ví dụ:

```json
{
  "title": "posttest",
  "content": "posttest",
  "thumbnailId": "af62cea2-e329-45f3-bf55-b07eb2ee5618",
  "targetType": "all",
  "targetIds": [],
  "isFeatured": false,
  "status": "published"
}
```

2) Update post (PUT /api/v1/posts/{id})

- Gửi `thumbnailId` để thay đổi, hoặc `null` để xóa thumbnail.

Ví dụ (clear thumbnail):

```json
{ "thumbnailId": null }
```

3) Responses

- List (`GET /api/v1/posts`): mỗi item có `thumbnail_id` (UUID|null).
- Detail (`GET /api/v1/posts/{id}`): trả `thumbnail_id` và một object `thumbnail` (nếu file tồn tại, chưa bị xóa) với metadata theo `File` schema.

Ví dụ snippet (detail):

```json
{
  "id": "...",
  "title": "...",
  "thumbnail_id": "af62cea2-e329-45f3-bf55-b07eb2ee5618",
  "thumbnail": {
    "id": "af62cea2-e329-45f3-bf55-b07eb2ee5618",
    "path": "uploads/2026/05/abc.webp",
    "name": "abc.jpg",
    "mime": "image/jpeg",
    "type": "image",
    "size": 12345,
    "compress_info": null,
    "title": "...",
    "description": null,
    "note": null,
    "is_library": false,
    "created_at": "2026-05-29T...Z",
    "updated_at": null,
    "created_by": "...",
    "updated_by": null
  }
}
```

Lấy URL hiển thị (Presigned URL)
---------------------------------

Ghi chú quan trọng: trường `thumbnail` chỉ chứa metadata của file — *không* trả presigned URL trực tiếp trong object `thumbnail`.

Để hiển thị ảnh, FE cần lấy link truy cập:

- Single link: `GET /api/v1/files/{id}/link?mode=view&expires=3600` → trả link tạm thời.
- Batch link (khuyến nghị cho list): `POST /api/v1/files/batch-link` với body `{ "file_ids": ["<id1>","<id2>"] , "mode": "view" }` để lấy nhiều link trong 1 request.

Gợi ý triển khai FE
-------------------

- Khi render trang danh sách bài (có nhiều post), thu thập tất cả `thumbnail_id` không-null, gọi `POST /api/v1/files/batch-link` một lần để lấy URL cho các thumbnail, sau đó map `file_id` → `url` và gán `thumbnail_url` cho từng post.
- Khi render chi tiết bài, nếu `thumbnail` tồn tại có thể gọi `GET /api/v1/files/{id}/link` để lấy URL.
- Nếu `thumbnail_id` là `null` hoặc backend trả `thumbnail: null`, hiển thị placeholder (ví dụ: ảnh mặc định hoặc biểu tượng). 
- Lưu cache URL ngắn hạn theo `expires_in` trả về; refresh khi hết hạn.

Edge cases / Behaviour
----------------------

- Nếu file bị xóa (soft-delete) hoặc không tồn tại, `thumbnail` sẽ không được trả (backend dùng `where: { deleted_at: null }`).
- Migration đặt `ON DELETE SET NULL` nên nếu file bị xóa cứng thumbnail_id sẽ tự động trở thành NULL.