/:publicId/hide. Đây là toggle trực tiếp cờ isGhost trên bài viết (global).reason + type vào /:publicId/report. Hệ thống tạo report, lưu người report, target type, target id.post/circle, worker AI đánh giá độ tin cậy. Nếu confidence >= 0.96 thì bài sẽ bị isHidden=true và bị loại khỏi list/feed.Report POST/CIRCLE sẽ được AI đánh giá bất đồng bộ. USER report chỉ tạo record PENDING, chưa có auto-hide.
| # | API / Tính năng | Mô tả nghiệp vụ | Trạng thái |
|---|---|---|---|
| 01 | POST /:publicId/hide Ẩn bài |
Toggle isGhost trên bản ghi post (global). Không cho phép ẩn bài của chính mình. |
done |
| 02 | POST /:publicId/report Báo cáo vi phạm |
Request body gồm reason và type. Hệ thống lưu report bằng reportRepository với status=PENDING. |
done |
| 03 | Type validation post/user/circle |
Zod validate enum lowercase, sau đó normalize sang ReportTargetType uppercase để lưu DB. |
done |
| 04 | AI Evaluation Worker report evaluation |
Worker gọi AI để lấy assistantNote + confidence, ghi lại vào bảng reports. |
done |
| 05 | Auto-hide threshold moderation automation |
Nếu confidence >= 0.96 cho type POST/CIRCLE, cập nhật post.isHidden=true và bump cache version. |
done |
| 06 | Admin moderation manual review |
Report vẫn giữ PENDING để admin quyết định bước xử lý cuối cùng. |
todo |
evaluation-report + worker xử lý AI.isHidden.type=user dùng :publicId như user id. type=post/circle dùng publicId của bài viết làm target id.isHidden=true không hiện trong list/feed, nhưng vẫn đọc được qua GET /posts/:publicId để phục vụ moderation và audit.