Circle · Business Logic

Nghiệp vụ — Circle

Trang này mô tả đầy đủ các quy tắc, điều kiện, lỗi và side effects của module circle.

Bối cảnh nghiệp vụ

Module này cho phép người dùng tạo cộng đồng nhỏ gọi là circle, mời thành viên, xử lý yêu cầu tham gia, đăng bài trong nhóm và dùng cơ chế HP/EXP để phản ánh chất lượng đóng góp.

Ví dụ thực tế: client gọi endpoint của circle, server kiểm tra token nếu route yêu cầu, validate dữ liệu, gọi service đúng domain, rồi ghi DB/cache hoặc enqueue job theo đúng nhánh trong code.

Luồng chính — Happy Path

1
src/modules/circle/circle.routes.ts

Request vào route. Bước này chuyển dữ liệu sang lớp tiếp theo theo pattern hiện có.

2
src/modules/circle/controller/circle.controller.ts

Middleware auth/validate chạy. Bước này chuyển dữ liệu sang lớp tiếp theo theo pattern hiện có.

3
src/modules/circle/service/circle.service.ts

Controller gọi service. Bước này chuyển dữ liệu sang lớp tiếp theo theo pattern hiện có.

4
src/modules/circle/service/circle-enery.service.ts

Service áp dụng rule nghiệp vụ. Đây là bước quan trọng nhất vì service quyết định request có được ghi dữ liệu, enqueue job hoặc bị trả lỗi.

5
src/modules/circle/repository/circle-post-quality-log.repository.ts

Repository/worker/provider thực thi. Bước này chuyển dữ liệu sang lớp tiếp theo theo pattern hiện có.

6
src/modules/circle/repository/circle-post-quality-log.repository.ts

Response trả về client. Bước này chuyển dữ liệu sang lớp tiếp theo theo pattern hiện có.

Business Rules — Quy tắc nghiệp vụ

Rule IDTên ruleĐiều kiện kích hoạtHành độngVí dụ minh họaFile kiểm tra
BR-CIRCLE-001Chỉ member mới được đăng bài circleTạo post/replyKhông có CircleMember thì ForbiddenUser ngoài circle bị chặncircle.service.ts
BR-CIRCLE-002Giới hạn 5 bài/giờ/user/circleTạo bài circleRedis counter quá 5 thì throw RATE_LIMIT_EXCEEDEDSpam bài bị từ chốicircle.service.ts
BR-CIRCLE-003Quản trị circle dựa trên role permissionManage members/logs/join requestsKiểm tra CIRCLE_ROLE_PERMISSIONSMember thường không xem managecircle.service.ts
BR-CIRCLE-004Admin chỉ invite role MEMBERAdmin gửi email invitationAdmin invite role khác MEMBER thì ForbiddenOwner có quyền rộng hơn admincircle.service.ts
BR-CIRCLE-005Invitation có resend limitMời lại người cũUser flow limit 5, admin email flow limit 3Không spam email mờicircle.service.ts
BR-CIRCLE-006Bài circle đi qua AI quality pipelineSau create post circleTạo CirclePostQualityLog pending rồi enqueue evaluation_queueHP/EXP cập nhật saucircle.service.ts + evaluate.worker.ts
BR-CIRCLE-007Sacrifice cần karma đủ và không restrictionPOST /sacrificeKiểm tra karma/restriction rồi update energyThiếu karma bị lỗicircle.service.ts
Các rule trên được rút từ route/service/DTO/worker đã đọc. Nếu một rule ghi [CẦN XÁC NHẬN], phần code hiện tại là stub, TODO hoặc trả dữ liệu mock.

Validations — Kiểm tra dữ liệu đầu vào

Input Validation

FieldKiểuRequiredRuleLỗi nếu vi phạmVí dụ hợp lệVí dụ không hợp lệ
AuthorizationheaderCó với route protectedBearer access token nếu cần401Bearer eyJ...missing
paramsstringTùy endpointKhông rỗng theo DTO route400publicId/code
query.takenumberKhôngint dương, thường max 100 nếu DTO có400201000
bodyobjectTùy endpointTheo DTO tương ứng400{"content":"Hello"}{} thiếu field

Business Validation

Điều kiện kiểm traKhi nào chạyLỗi trả vềLý do rule này tồn tại
Chỉ member mới được đăng bài circleTạo post/replyKhông có CircleMember thì ForbiddenNgăn dữ liệu sai đi sâu vào DB hoặc worker.
Giới hạn 5 bài/giờ/user/circleTạo bài circleRedis counter quá 5 thì throw RATE_LIMIT_EXCEEDEDNgăn dữ liệu sai đi sâu vào DB hoặc worker.
Quản trị circle dựa trên role permissionManage members/logs/join requestsKiểm tra CIRCLE_ROLE_PERMISSIONSNgăn dữ liệu sai đi sâu vào DB hoặc worker.
Admin chỉ invite role MEMBERAdmin gửi email invitationAdmin invite role khác MEMBER thì ForbiddenNgăn dữ liệu sai đi sâu vào DB hoặc worker.
Invitation có resend limitMời lại người cũUser flow limit 5, admin email flow limit 3Ngăn dữ liệu sai đi sâu vào DB hoặc worker.

Edge Cases — Trường hợp ngoại lệ

!
Edge case 1

Tên file đang là circle-enery.service.ts, không phải energy.

Nếu không hiểu điểm này, QA có thể viết thiếu case hoặc frontend có thể hiển thị trạng thái sai.

!
Edge case 2

getCircleEnergy(), CPR và getUserQuantityPostInCircle còn mock/blank.

Nếu không hiểu điểm này, QA có thể viết thiếu case hoặc frontend có thể hiển thị trạng thái sai.

!
Edge case 3

Một số nhánh throw Error thường nên có thể thành 500.

Nếu không hiểu điểm này, QA có thể viết thiếu case hoặc frontend có thể hiển thị trạng thái sai.

!
Edge case 4

Invitation resend limit khác nhau giữa flow user và admin email.

Nếu không hiểu điểm này, QA có thể viết thiếu case hoặc frontend có thể hiển thị trạng thái sai.

!
Edge case 5

Private circle trả list rỗng nếu user không là member.

Nếu không hiểu điểm này, QA có thể viết thiếu case hoặc frontend có thể hiển thị trạng thái sai.

Error Handling — Xử lý lỗi

Tình huống lỗiNguyên nhânHTTP StatusError CodeMessage trả vềCách recover
UnauthorizedThiếu/sai token ở route protected401UNAUTHORIZEDToken invalidLogin lại hoặc refresh token.
Validation failedZod schema không pass400VALIDATION_FAILEDValidation failedClient sửa field sai.
Resource not foundRepository không tìm thấy record404NOT_FOUNDResource not foundRefresh dữ liệu.
ForbiddenUser không có quyền hoặc role không đúng403FORBIDDENForbiddenẨn action trong UI.
External dependency failRedis/DB/provider lỗi500INTERNAL_SERVER_ERRORInternal server errorOn-call kiểm tra provider/log.
Lỗi cần alert ngay: DB/Redis/worker/provider ngoài fail liên tục, vì các flow chính có thể trả 500 hoặc mất side effect như search, email, notification.

State Machine / Vòng đời

Một entity/job trong module này có thể đi qua các trạng thái sau: PENDING invitation, ACCEPTED membership, REJECTED/CANCELLED, PENDING quality, MASTERPIECE..TOXIC.

PENDING invitatiACCEPTED membersREJECTED/CANCELLPENDING qualityMASTERPIECE..TOXstarteventeventeventeventinvalid/reject
Node là trạng thái domain hoặc trạng thái job; mũi tên xanh là transition hợp lệ.
Từ trạng tháiHành động/EventĐến trạng tháiAi được phépĐiều kiện thêm
PENDING invitationcreate/enqueueACCEPTED membershipSystem hoặc user theo routeTheo rule service
ACCEPTED membershipprocess/updateREJECTED/CANCELLEDSystem hoặc user theo routeTheo rule service
REJECTED/CANCELLEDprocess/updatePENDING qualitySystem hoặc user theo routeTheo rule service
PENDING qualityprocess/updateMASTERPIECE..TOXICSystem hoặc user theo routeTheo rule service

Side Effects — Tác dụng phụ

Hành độngKhi nào xảy raĐồng bộ hay bất đồng bộNếu thất bại thì sao?
DB read/writeKhi service cần dữ liệu bền vữngĐồng bộRequest fail nếu DB fail.
Cache/queue/realtimeNếu module gọi Redis/Pusher/jobsTùy flowCó thể delay hoặc fail riêng.
External APINếu module gọi service ngoàiBất đồng bộ hoặc đồng bộPhụ thuộc cấu hình provider.

FAQ — Câu hỏi thường gặp

Câu hỏiTrả lời
Tôi bắt đầu đọc module circle từ đâu?Bắt đầu ở src/modules/circle/circle.routes.ts, sau đó đi sang controller và service.
Lỗi validation nằm ở đâu?Ở DTO Zod và middleware validate(). Route nào không gọi validate() thì không có lớp check này.
Side effect có chạy trong cùng request không?Tùy flow. Nếu có producer/worker thì side effect chạy bất đồng bộ sau response.
Có chỗ nào chưa hoàn chỉnh không?Xem phần Gotchas và các dòng [CẦN XÁC NHẬN].
QA nên test gì trước?Happy path, thiếu token, sai DTO, resource không tồn tại, và side effect fail/defer.