Bỏ qua, đến nội dung

Cài đặt và sử dụng — Public Forms

Tổng quan

@digiforce-nc/plugin-public-forms cho phép tạo form thu thập dữ liệu mà người điền không cần đăng nhập. Plugin sinh JWT token tạm thời (hết hạn 1 giờ) để xác thực submission, chuyển đổi action publicSubmit thành create để tương thích với workflow trigger.

Bước 1: Kích hoạt Plugin

Vào Settings → Plugin Manager, tìm plugin-public-forms và bật.

Sau khi kích hoạt:

  • Route /public-forms/:name được đăng ký (skipAuthCheck)
  • Mục Public forms xuất hiện trong Plugin Settings
  • Bảng publicForms được tạo trong Database

Bước 2: Tạo Public Form

  1. Vào Settings → Public forms
  2. Nhấn Create để tạo form mới
TrườngKiểuMô tả
keyuid (tự sinh)Khóa duy nhất, dùng trong URL
titlestringTiêu đề form hiển thị
typestringLoại form (mặc định: form)
collectionstringCollection đích (định dạng: dataSource:collectionName)
descriptionstringMô tả form
enabledbooleanBật/tắt form
passwordstringMật khẩu bảo vệ (tùy chọn, để trống = không cần)
  1. Cấu hình UI Schema cho form — chọn các field cần hiển thị

Sau khi tạo, link form có dạng:

https://your-domain.com/public-forms/<key>

Gửi link này cho người cần điền form. Họ có thể truy cập trực tiếp mà không cần tài khoản.

Luồng hoạt động chi tiết

1. Truy cập form (getMeta)

Khi người dùng mở link, client gọi publicForms:getMeta:

2. JWT Token

Token chứa:

  • collectionName: Collection đích
  • formKey: Khóa form
  • targetCollections: Danh sách Collection liên quan (association appends)

Token hết hạn sau 1 giờ. Sau đó, người dùng cần tải lại trang để lấy token mới.

3. Submit dữ liệu

Client gửi request với header X-Form-Token:

http
POST /api/<collection>:publicSubmit
X-Form-Token: <jwt-token>
Content-Type: application/json

{
  "name": "Nguyễn Văn A",
  "email": "user@example.com",
  "message": "Nội dung liên hệ"
}

Plugin middleware:

  1. Verify JWT token từ header X-Form-Token
  2. Kiểm tra form còn enabled
  3. Chuyển publicSubmitcreate (kích hoạt workflow)
  4. Bỏ qua auth check (ctx.skipAuthCheck = true)
  5. Bỏ qua ACL check cho Collection đích và target Collections

4. ACL và quyền truy cập

Plugin tự động skip ACL check cho các trường hợp:

  • create trên Collection đích của form
  • list, get trên target Collections (association)
  • create trên Collection file (upload)
  • getBasicInfo, createPresignedUrl trên storages
  • check trên vditor
  • get trên map-configuration

Bảo vệ form bằng mật khẩu

Nếu đặt password cho form:

  1. Lần đầu truy cập, API trả về { passwordRequired: true }
  2. Client hiển thị form nhập mật khẩu
  3. Người dùng nhập mật khẩu → gọi lại getMeta với password
  4. Nếu đúng → trả về schema + token
  5. Nếu sai → 401 "Please enter your password"

Lưu ý: Password được lưu dưới dạng template string — hỗ trợ biến môi trường qua renderJsonTemplate().

Form type mở rộng

Plugin hỗ trợ đăng ký nhiều loại form qua API client:

typescript
const publicForms = app.pm.get('public-forms') as PluginPublicFormsClient;

publicForms.registerFormType('survey', {
  label: 'Khảo sát',
  uiSchema: (options) => {
    return {
      // Custom UI Schema cho form khảo sát
    };
  },
});

Lưu ý quan trọng

  • Dữ liệu gửi từ public form lưu trực tiếp vào Collection — cẩn thận với field nào hiển thị ra ngoài
  • publicSubmit được chuyển thành createkích hoạt workflow như bản ghi tạo thông thường
  • Token hết hạn sau 1 giờ — form mở lâu cần tải lại trang
  • Nên giới hạn các field hiển thị, không expose field nội bộ
  • Nên kết hợp với CAPTCHA hoặc rate limiting nếu form public trên internet