# Posts title fields for list/card surfaces

Back-end should provide short title fields on `Post` responses so front-end can render concise list/card titles without using the full Telegram/body text.

## Product requirement

Any list/card surface that is meant for quick browsing should display a short `title`, not the full `text` body. Full Telegram-style body copy is too noisy for compact surfaces.

This includes:

- Home **官方推荐** carousel/cards
- Home **最新资料**
- Home **热门资料** ranking list
- `/official-recommendations`
- `/browse` (**全部资料**)
- `/category/:slug`
- Search result previews/lists

The full body text should remain available as `text` for message/detail rendering, expansion, and search indexing.

## Current front-end implementation status

Already consuming `title` through `postToResource` / `Resource.title`:

- Home **官方推荐** carousel/cards
- `/official-recommendations`
- Home **热门资料** ranking list

Pending front-end follow-up after the back-end fields are available:

- Home **最新资料**
- `/browse` (**全部资料**)
- `/category/:slug`
- Search results

Those pending surfaces currently render `text` via `MessageBubble`. Once the back-end consistently provides `title`, front-end can decide the final UI treatment, but the desired display content for compact browsing is the short `title`.

## Affected endpoints

Any endpoint returning `Post` items should include a short title when available:

- `GET /api/posts`
- `GET /api/posts/search`
- `GET /api/posts/recommended`
- `GET /api/posts/:id`

## Recommended response shape

```jsonc
{
  "id": "string",
  "title": "ARK 2026 共识加速计划", // optional global fallback title
  "text": "完整正文 / Telegram-style body text...",
  "localizations": {
    "zh": {
      "title": "ARK 2026 共识加速计划",
      "text": "完整中文正文..."
    },
    "en": {
      "title": "ARK 2026 Consensus Acceleration Plan",
      "text": "Full English body..."
    }
  }
}
```

## Front-end fallback order

For resource card/list `Resource.title`, front-end reads:

1. `localizations[currentLang].title`
2. `post.title`
3. first non-empty line of localized/full `text`
4. first attachment filename
5. `post.id`

So backend can roll this out gradually: old posts without `title` still render, but resource card/list surfaces reduce long body text to its first non-empty line instead of displaying the full paragraph.

## Requirement

Do **not** put an entire body paragraph into `title`. `title` should be concise enough for a two-line card/list title.

Examples:

| Good title | Bad title |
| --- | --- |
| `ARK 2026「共识加速计划」邀请王霸榜` | Full event body with links, schedule, rules, and hashtags |
| `ARK 主网核心合约地址（BSC链）` | Full contract explainer paragraph |
| `ARK灵魂五问完整视频` | Full video caption text |
