# T546 — opportunities-list-detail-api

> Status: `done`  
> Milestone: `M3`  
> Kind: `feat`  
> Est. change: `~170 lines`

## Goal

完成後系統應：`GET /api/v1/radar/opportunities` 與 `/:id` 可用，支援 band／status／watch／日期篩選，詳情含 `reasons[]`、變體與來源。

## Depends on

- T525

## Inputs

- Spec：`../spec.md` §5.1、§5.2、§8、§9.2（OP-02 可查）

## Outputs

### 程式變更（預期路徑）

| 路徑 | 動作 | 說明 |
|------|------|------|
| `apps/backend/generate/api/radar.api` | edit | list／detail req／resp type |
| `apps/backend/internal/logic/radar/listOpportunitiesLogic.go` | edit | 分頁與篩選 |
| `apps/backend/internal/logic/radar/getOpportunityLogic.go` | edit | 詳情：`reasons[]`、`region_*`、`freshness_hours`、`matched_service`、`override`、已生成 variants、`source`／`source_scout_post_id` |

### 行為變更

- `pageSize ≤ 50`，超過回明確錯誤。
- `status=rejected` 可主動查詢（含 `reject_reason`），預設不含。
- 一律 `owner_uid` 隔離；查別人資源回越權錯誤。

## Out of scope

- accept／dismiss／override（T547）
- 前端（T551／T552）

## Acceptance

- [x] 各 filter 組合結果正確、`pagination` 正確
- [x] 詳情 `reasons[]` 五條完整回傳
- [x] 指令：

```bash
cd apps/backend && make gen-api && go test ./internal/logic/radar/... -count=1
```
