sync/request/2026-09-25-be-request-draft-link-rules-field-types.md · Xem trên GitHub

Đề xuất: lưu nháp, quy tắc liên kết theo mẫu, kiểm tra kiểu trường

Đang mở normal feature
Module
request
Từ
BE
Người raise
ThaiThanhLuan
Ngày tạo
2026-09-25
Refs
REQUEST-016, REQUEST-017, REQUEST-018, REQUEST-019, REQUEST-020
Bên nhận
FE pendingMobile n/a

Tóm tắt

Đề xuất có lưu nháp (tạo nháp → sửa → gửi đi), quy tắc liên kết cấu hình theo mẫu (mẫu nào được link tới, số link tối thiểu/tối đa), và server kiểm tra kiểu trường int/date. Mẫu cũ không cấu hình quy tắc thì hành vi link không đổi. Gửi lại sau khi bị trả lại vẫn duyệt lại từ đầu (REQUEST-016, không đổi).

Chi tiết

  • Nháp (REQUEST-017):
    • POST /requests { ..., saveAsDraft: true } → status: "draft". Chưa tạo bước duyệt, chưa kiểm tra trường bắt buộc, không thông báo/webhook.
    • linkedRequestIds và flexibleApproverPicks chọn lúc gửi đi; gửi kèm khi lưu nháp → 400 request.draft.submit_only_fields.
    • PATCH /requests/:id/fields sửa được nháp (thêm được trường của mẫu mà lúc lưu chưa điền).
    • POST /requests/:id/submit { flexibleApproverPicks?, linkedRequestIds? } → 200 Request (pending). Kiểm tra đầy đủ như tạo thường.
    • Nháp chỉ người tạo thấy: không hiện ở GET /requests của người khác; GET /requests/:id nháp của người khác → 404. Xem nháp của mình: GET /requests?view=sent-by-me&status=draft.
  • Quy tắc link (REQUEST-018/019):
    • POST /request-templates nhận thêm allowedLinkTemplateIds?: string[] (rỗng = mẫu nào cũng được), minLinks?: number (mặc định 0), maxLinks?: number | null (null = không giới hạn). Template trả về có 3 trường này.
    • Tạo đề xuất sai số link → 400 request.create.link_count_out_of_range + details { min, max, count }; link tới đề xuất khác mẫu cho phép → 400 request.create.link_template_not_allowed + details { linkedRequestId, allowedTemplateIds }.
    • POST /requests/:id/clone nhận thêm linkedRequestIds? cho bản sao.
  • Kiểu trường (REQUEST-020): int = số nguyên hoặc chuỗi số nguyên; date = YYYY-MM-DD hợp lệ. Sai → 400 request.field.invalid_type + details { fieldKey, type }. Áp dụng khi tạo, sửa trường, nhập Excel.

Contract (trước → sau)

Trước Sau
POST /requests body — + saveAsDraft?: boolean
POST /requests/:id/submit — mới, 200 Request
PATCH /requests/:id/fields chỉ returned returned hoặc draft
POST /request-templates body / RequestTemplate — + allowedLinkTemplateIds, minLinks, maxLinks
POST /requests/:id/clone body { flexibleApproverPicks? } + linkedRequestIds?
Lỗi mới — request.draft.*, request.create.link_count_out_of_range, request.create.link_template_not_allowed, request.template.link_range_invalid, request.field.invalid_type

Việc bên nhận cần làm

  • FE: nút "Lưu nháp" + tab "Đã lưu nháp" (hiện FILTERABLE_STATUSES đang bỏ draft) + nút "Gửi đi" gọi /submit.
  • FE: form mẫu đề xuất thêm cấu hình mẫu được link tới và số link tối thiểu/tối đa; form tạo đề xuất hiển thị lỗi link theo details.
  • FE: hiển thị lỗi request.field.invalid_type ngay ở trường details.fieldKey.

Cách kiểm tra

  1. Tạo nháp thiếu trường bắt buộc → 201 draft; /submit → 400 request.create.missing_required_field; điền đủ qua PATCH /fields → /submit 200 pending.
  2. Tạo mẫu { allowedLinkTemplateIds: [<mẫu CẤP>], minLinks: 1, maxLinks: 1 } → tạo đề xuất không link → 400 link_count_out_of_range.

Thảo luận