Jobs · Business Logic

Nghiệp vụ — Jobs

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

Bối cảnh nghiệp vụ

Module jobs gom toàn bộ pipeline bất đồng bộ: email, Bloom filter, vector search, full-text search, like sync, notification debounce, AI evaluation, giảm HP circle và tự gỡ ban.

Ví dụ thực tế: client gọi endpoint của jobs, 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
workers/index.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
workers/evaluate.worker.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
workers/like.worker.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/notification.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/message.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
src/server.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-JOBS-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 serviceworkers/index.ts
BR-JOBS-002Auth theo route thậtEndpoint có authorizationJWT được kiểm tra trước controllerThiếu token bị chặnworkers/index.ts
BR-JOBS-003Validate bằng Zod nếu route có validate()Request body/params/querySai schema trả 400Client sửa field saiworkers/index.ts
BR-JOBS-004Repository là nơi chạm DBService cần dữ liệuService gọi repository/Prisma, controller không tự queryDễ trace lỗi DBworkers/like.worker.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ệ
AuthorizationheaderTùy routeBearer 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

Email worker dùng template invitation-email.ejs nhưng repo có invitation-memeber.ejs; cần xác nhận.

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

Queue retry policy chưa cấu hình rõ ở nhiều producer.

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

Redis là cache, queue transport, Bloom và debounce store.

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, PROCESSING, SUCCESS, FAILED.

PENDINGPROCESSINGSUCCESSFAILEDstarteventeventeventinvalid/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
PENDINGcreate/enqueuePROCESSINGSystem hoặc user theo routeTheo rule service
PROCESSINGprocess/updateSUCCESSSystem hoặc user theo routeTheo rule service
SUCCESSprocess/updateFAILEDSystem hoặc user theo routeTheo rule service
FAILEDprocess/updateterminalSystem 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 jobs từ đâu?Bắt đầu ở workers/index.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.