AI · Business Logic

Nghiệp vụ — AI

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

Bối cảnh nghiệp vụ

Module này có API AI assistance và service nội bộ để chấm điểm post circle, đánh giá report bằng OpenRouter JSON schema.

Ví dụ thực tế: client gọi endpoint của ai, 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/ai/ai.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/ai/service/ai.service.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/ai/promt/system.promt.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
workers/evaluate.worker.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
workers/evaluate.worker.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
workers/evaluate.worker.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-AI-001Request đi qua route/controller/serviceClient gọi endpointController đọc request rồi service xử lý nghiệp vụ chínhTrace rõ từ route đến servicesrc/modules/ai/ai.routes.ts
BR-AI-002Auth theo route thậtEndpoint có authorizationJWT được kiểm tra trước controllerThiếu token bị chặnsrc/modules/ai/ai.routes.ts
BR-AI-003Validate bằng Zod nếu route có validate()Request body/params/querySai schema trả 400Client sửa field saisrc/modules/ai/ai.routes.ts
BR-AI-004Repository là nơi chạm DBService cần dữ liệuService gọi repository/Prisma, controller không tự queryDễ trace lỗi DBsrc/modules/ai/promt/system.promt.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
Request đi qua route/controller/serviceClient gọi endpointController đọc request rồi service xử lý nghiệp vụ chínhNgăn dữ liệu sai đi sâu vào DB hoặc worker.
Auth theo route thậtEndpoint có authorizationJWT được kiểm tra trước controllerNgăn dữ liệu sai đi sâu vào DB hoặc worker.
Validate bằng Zod nếu route có validate()Request body/params/querySai schema trả 400Ngăn dữ liệu sai đi sâu vào DB hoặc worker.
Repository là nơi chạm DBService cần dữ liệuService gọi repository/Prisma, controller không tự queryNgă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

Public AI endpoints là stubs.

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

JSON parse fail làm job fail.

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

Model đang dùng openrouter/free.

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.

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 ai từ đâu?Bắt đầu ở src/modules/ai/ai.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.