Tài liệu

Ví dụ đăng ký người dùng

Ví dụ đăng ký người dùng Xây dựng endpoint công khai POST /register để tạo người dùng một cách an toàn. Ví dụ này dùng một custom route, một pre-hook và một custom handler. Nội dung được giữ gọn để bạn có thể áp dụng mẫu này cho ứng dụng của mình. Nội dung sẽ xây dựng POST /api/r

Ví dụ đăng ký người dùng

Xây dựng endpoint công khai POST /register để tạo người dùng một cách an toàn.

Ví dụ này dùng một custom route, một pre-hook và một custom handler. Nội dung được giữ gọn để bạn có thể áp dụng mẫu này cho ứng dụng của mình.

Nội dung sẽ xây dựng

POST /api/register
  -> pre-hook validates input
  -> handler hashes password
  -> handler creates enfyra_user row
  -> response returns safe user fields only

Dùng cách này khi route POST /enfyra_user mặc định quá khái quát cho việc đăng ký công khai.

1. Tạo route

Trong admin app, tạo một route:

Trường Giá trị
Path /register
Method POST
Handler Custom
Target table enfyra_user

Chỉ giữ route ở chế độ public nếu endpoint này được dành cho đăng ký. Nếu không, hãy gắn các route permission thông thường.

2. Thêm pre-hook

Gắn pre-hook này vào POST /register.

Nó kiểm tra body trước khi handler chạy.

const { email, password } = @BODY

if (!email) @THROW400("Email is required")
if (!password) @THROW400("Password is required")
if (password.length < 8) @THROW400("Password must be at least 8 characters")

const existing = await #enfyra_user.find({
  filter: { email: { _eq: email } },
  fields: "id",
  limit: 1
})

if (existing.data[0]) @THROW409("Email already exists")

Vì sao phần này thuộc pre-hook:

  • Nó từ chối request không hợp lệ trước khi handler xử lý.
  • Nó giúp handler chỉ tập trung vào việc tạo dữ liệu.
  • Mẫu này cũng phù hợp cho kiểm tra tenant, quota hoặc xác thực lời mời.

3. Thêm custom handler

Gắn handler này vào POST /register.

const { email, password, name } = @BODY

const hashedPassword = await @HELPERS.$bcrypt.hash(password)

const result = await #enfyra_user.create({
  data: {
    email,
    password: hashedPassword,
    name: name || null,
    isActive: true
  }
})

const user = result.data[0]

return {
  id: user.id,
  email: user.email,
  name: user.name,
  isActive: user.isActive
}

Handler không trả về password.

4. Kiểm thử endpoint

curl -X POST "http://localhost:3000/api/register" \
  -H "Content-Type: application/json" \
  -d '{
    "email": "[email protected]",
    "password": "password123",
    "name": "Mai Tran"
  }'

Response mong đợi:

{
  "id": 12,
  "email": "[email protected]",
  "name": "Mai Tran",
  "isActive": true
}

5. Tùy chọn: kích hoạt flow chào mừng

Nếu cần gửi email hoặc thực hiện onboarding, hãy kích hoạt flow trong post-hook.

if (!@ERROR && @DATA?.id) {
  await @TRIGGER("welcome-user", {
    userId: @DATA.id,
    email: @DATA.email
  })
}

Dùng flow khi công việc có thể chạy sau response hoặc cần retry/history.

Lỗi thường gặp

Tạo người dùng từ trình duyệt qua /enfyra_user

Dùng route /register chuyên biệt cho đăng ký công khai. Route này cho bạn một nơi để kiểm tra, hash và chỉ trả về các trường an toàn.

Trả về toàn bộ dòng người dùng

Không bao giờ trả về password, reset token, OAuth secret hoặc trường nội bộ từ endpoint đăng ký công khai.

Đặt toàn bộ logic vào một handler

Dùng pre-hook để kiểm tra, handler để tạo dữ liệu và post-hook/flow cho side effect.

Tài liệu liên quan