# 🔧 DOING: CuCu Note — Feature Parity & Beyond

> Cập nhật: 2026-04-19 | Owner: Dev Team  
> Đây là file theo dõi tiến độ **đang làm**. Khi task xong → chuyển sang `/done`.

---

## 🔥 Epic 1 — Reactions & Comments → ✅ CODE XONG (Chờ Test)

### Backend `memo_routes.py` + `services.py`
- [x] `POST /memos/{id}/reactions` — Thêm emoji reaction
- [x] `DELETE /memos/{id}/reactions/{type}` — Xoá reaction
- [x] `GET /memos/{id}/comments` — Lấy danh sách comment
- [x] `POST /memos/{id}/comments` — Tạo comment mới
- [x] `MemoResponse` trả về kèm `reactions[]` list
- [x] Batch fetch reactions (hiệu năng, tránh N+1)
- [x] `list_comments()` method trong `MemoService`

### Frontend `memoService.ts`
- [x] `upsertMemoReaction()` → gọi API thật (bỏ mock)
- [x] `deleteMemoReaction()` → gọi API thật (bỏ mock)
- [x] `createMemoComment()` → POST `/memos/{id}/comments`
- [x] `listMemoComments()` → GET `/memos/{id}/comments`

### Cần Test
- [ ] Thêm reaction ❤️ vào memo → hiển thị ngay lập tức
- [ ] Xoá reaction → biến mất khỏi UI
- [ ] Comment vào memo → hiện trong MemoDetail
- [ ] Nested comment (reply to comment)

---

## 🔔 Epic 2 — Inbox & Notifications → ❌ CHƯA LÀM

### Backend `user_routes.py`
- [ ] `GET /users/{id}/notifications` — Lấy danh sách inbox
- [ ] `PATCH /users/{id}/notifications/{notif_id}` — Đánh dấu đã đọc
- [ ] `DELETE /users/{id}/notifications/{notif_id}` — Xoá thông báo
- [ ] Tự động tạo Notification khi có comment mới vào memo → gửi cho owner

### Frontend `userService.ts`
- [ ] `listUserNotifications()` → gọi API thật (bỏ stub empty)
- [ ] `updateUserNotification()` → gọi API thật
- [ ] `deleteUserNotification()` → gọi API thật
- [ ] Badge số đỏ trên Bell icon hoạt động với data thật

---

## 📊 Epic 3 — Heatmap Activity Calendar → ❌ Cần Verify

### Backend
- [ ] Verify `GET /users/{id}/stats` trả đúng `memoDisplayTimestamps[]`
- [ ] Test backend với user có nhiều memos

### Frontend
- [ ] Kiểm tra `ActivityCalendar` component render đúng từ data thật
- [ ] Test calendar highlight đúng ngày có ghi chú

---

## 🔑 Epic 4 — Personal Access Token (PAT) → ❌ CHƯA LÀM

### Backend
- [ ] `POST /users/{id}/access-tokens` — Tạo token mới
- [ ] `GET /users/{id}/access-tokens` — List tokens
- [ ] `DELETE /users/{id}/access-tokens/{tokenId}` — Thu hồi token
- [ ] Middleware nhận PAT trong `Authorization: Bearer <pat>` header

### Frontend  
- [ ] `createPersonalAccessToken()` → API thật
- [ ] `listPersonalAccessTokens()` → API thật
- [ ] Settings UI hiển thị list tokens với nút revoke

---

## 🔗 Epic 5 — Webhooks → ❌ CHƯA LÀM

### Backend
- [ ] `GET /users/{id}/webhooks`
- [ ] `POST /users/{id}/webhooks`
- [ ] `DELETE /users/{id}/webhooks/{id}`
- [ ] Trigger webhook khi tạo/xoá Memo mới

### Frontend
- [ ] Settings > Webhooks tab hoạt động

---

## 🌐 Epic 6 — SSO / OAuth (Để Sau) → ❌ CHƯA LÀM

- [ ] OAuth callback handler
- [ ] IDP config lưu vào DB
- [ ] Nút "Đăng nhập với Google/GitHub" trên trang Auth

---

## 📝 Epic 7 — Advanced Note-Taking UX (Mới Thêm) → ❌ CHƯA LÀM

### 1. Trải nghiệm Editor (Slash Commands & Clipboard)
- [ ] Tính năng Kéo thả / Paste ảnh trực tiếp vào khung text (upload qua clipboard).
- [ ] Slash Commands (`/`) mở menu chọn (Heading, Checklist, Code Block, Quote).
- [ ] Auto-Suggest Tags (`#`): Hiện popup gợi ý các tag đã tồn tại.

### 2. Ghi chú liên kết (Bi-directional Linking)
- [ ] Gõ `[[` để gợi ý tên memo khác.
- [ ] Render link `[[memo_id]]` thành link bấm được (Zettelkasten style).

### 3. Rich Media & Cải tiến View
- [ ] Link Bookmark Preview: Tự động fetch metadata (Title, Image, Desc) cho URL.
- [ ] Voice Memos: Nút ghi âm trực tiếp, lưu file audio.
- [ ] Inline Editing: Bấm đúp vào memo để sửa ngay trên luồng, không nhảy modal.
- [ ] Focus/Zen Mode: Nút ẩn nhanh sidebar để tập trung gõ.

---

## 🎯 Epic 8 — Inbound Webhooks & CRM Inbox (Trung Tâm Hứng Feedback) → ✅ CODE XONG + TEST PASS

### 1. Kênh Thu Thập (Inbound Webhook API) 📥
- [x] Backend: Viết Endpoint `POST /api/v1/inbound_webhooks/{workspace_id}` để hứng payload.
- [x] Backend: Logic bóc tách JSON và tự động đẻ ra Memo mới trong Workspace.
- [x] Backend: Optional webhook secret verification qua `X-Webhook-Secret` header.
- [x] Backend: Memo từ webhook mặc định `is_read=False`.
- [ ] Frontend: Thêm màn hình `Settings > Webhooks (Inbound)` để phát sinh và quản lý link URL. **→ Defersau**
- [ ] Frontend: Hiển thị Log history của các webhook. **→ Defer sau**

### 2. Quản lý Hộp Thư UI (Inbox Unread / Read) 📬
- [x] Backend: Thêm trường `is_read BOOLEAN DEFAULT 0` vào DB Model của Memo (với auto-migration).
- [x] Backend: Thêm endpoint `GET /users/{user_id}/inbox/unread_count` trả về số lượng unread.
- [x] Backend: Thêm endpoint `GET /users/{user_id}/inbox/memos` list các unread memos.
- [x] Backend: Hỗ trợ filter theo `workspace_id` cho inbox endpoints.
- [x] Frontend: Cải tiến UI thanh Sidebar, thêm mục `Inbox` kèm Badge số lượng (kết hợp notifications + unread memos).
- [x] Frontend: Trang `Inboxes.tsx` với 2 tabs: Notifications và Unread Memos.
- [x] Frontend: Nút check ✅ (Mark as Read) cho unread memos, dùng PATCH `/memos/{id}` với `{ "is_read": true }`.
- [x] i18n: Thêm keys: `inbox.notifications`, `inbox.unread-memos`, `inbox.no-unread-memos`, `inbox.mark-as-read`.

### 3. Database & Performance
- [x] Thêm index `idx_memos_is_read` cho truy vấn unread nhanh.
- [x] Thêm index `idx_memos_workspace` cho workspace isolation.
- [x] Migration tự động: ALTER TABLE thêm `is_read` nếu column chưa tồn tại.

---

## 📋 Ghi Chú Kỹ Thuật

- **Auth:** JWT nội bộ, `user_id` lấy từ `request.state` (set bởi middleware)
- **DB:** MongoDB, collections: `memos`, `reactions`, `activities`, `inbox`
- **Backend:** FastAPI + Python 3.11+
- **Frontend:** React + Vite + TailwindCSS + shadcn/ui
- **API Prefix:** `/api/v1/`
