Hướng dẫn API Tạo khách mời

API FMCustomers/Create — dùng để thêm khách mời vào một sự kiện (Event) có sẵn trong hệ thống.

Method
POST
URL
{domain-api}/FMCustomers/Create
Content-Type
multipart/form-data
Bắt buộc
key, FullName

1. Tóm tắt nhanh

  1. Lấy ID sự kiện của sự kiện muốn thêm khách — đây chính là key.
  2. Gửi request POST dạng form-data tới /FMCustomers/Create, tối thiểu có key và FullName.
  3. Muốn khách check-in bằng khuôn mặt thì gửi thêm image (ảnh chân dung) và CheckInFace=1.
  4. Xem field isSuccess trong kết quả: true là tạo thành công, false thì đọc message để biết lỗi.
⚠️ Quan trọng nhất API luôn trả HTTP 200, kể cả khi lỗi. Đừng dựa vào HTTP status code — phải kiểm tra isSuccess.

2. Key là gì?

key chính là ID sự kiện mà bạn muốn thêm khách vào (xem ở màn hình Event). Nó vừa dùng để xác thực, vừa để biết khách thuộc sự kiện nào.

Hệ thống sẽ kiểm tra:

  • key có đúng định dạng GUID không (vd: 3fa85f64-5717-4562-b3fc-2c963f66baa6).
  • Sự kiện đó có tồn tại và đang được bật (chưa bị vô hiệu hoá) không.

Nếu một trong hai điều trên không đạt → API báo lỗi và không tạo khách.

💡 Lưu ý API luôn dùng giá trị của key.

3. Các trường dữ liệu gửi lên

Trường bắt buộc

Tên field Kiểu Ý nghĩa
key Bắt buộc GUID ID sự kiện
FullName Bắt buộc Chuỗi Họ tên khách mời

Trường tuỳ chọn (có thể bỏ trống)

Tên field Kiểu Ý nghĩa / Ví dụ
DearName Chuỗi Danh xưng: Anh, Chị, Ông, Bà…
NickName Chuỗi Tên gọi tắt / tên hiển thị
Email Chuỗi Email khách
Phone Chuỗi Số điện thoại — dùng để chống trùng (xem mục 5)
JobPosition Chuỗi Chức vụ
Department Chuỗi Phòng ban
Company Chuỗi Công ty / đơn vị
Location Chuỗi Khu vực / địa điểm
MemberGroup Chuỗi Nhóm khách: VIP, Customer, Staff…
ExtraParameter Chuỗi Thông tin mở rộng, tuỳ nghiệp vụ
Birthday Ngày Định dạng yyyy-MM-dd, vd: 1990-05-20
LuckyDraw Chuỗi Số may rủi. Bỏ trống để hệ thống tự sinh (xem mục 4)
image File Ảnh chân dung (jpg, png…)
CheckInFace "1" / "0" 1 = dùng ảnh để check-in bằng khuôn mặt. Chỉ có tác dụng khi có gửi image

Trường KHÔNG cần gửi

Tên field Ghi chú
Code Tự sinh Hệ thống luôn tự tạo. Có gửi lên cũng bị bỏ qua.
Id, ImageUrl, CreateDate, UpdateDate, IsEnabled, TaskId Hệ thống tự xử lý.

4. Mã khách & Số may rủi được sinh thế nào

Mã khách (Code)

Luôn do hệ thống tự sinh: một chuỗi ngẫu nhiên 20 ký tự (lấy từ GUID bỏ dấu gạch ngang), ví dụ 25ada1d56ef04200976c. Client không điền được.

Số may rủi (LuckyDraw)

Trường hợp Hệ thống xử lý
Bỏ trống (khuyên dùng) Tự sinh số ngẫu nhiên, không trùng trong cùng sự kiện. Độ dài số tuỳ theo số khách hiện có:
  • Sự kiện dưới 900 khách → số 3 chữ số (100–999)
  • Sự kiện từ 900 khách trở lên → số 4 chữ số (1000–9999)
Tự điền Nếu số đó chưa ai dùng trong cùng sự kiện → hợp lệ. Nếu đã có người dùng → báo lỗi, không tạo khách.

5. Quy tắc chống trùng

Hệ thống chỉ kiểm tra trùng theo Số điện thoại, và chỉ trong cùng một sự kiện.

Tình huống Kết quả
Phone trùng với 1 khách đã có trong cùng sự kiện ❌ Báo lỗi, không tạo mới, không cập nhật khách cũ
Phone trùng nhưng ở sự kiện khác ✅ Tạo bình thường
Không gửi Phone ✅ Tạo bình thường (không dò trùng được)
Email trùng ✅ Tạo bình thường (không kiểm tra Email)
💡 Cách so khớp So khớp chính xác từng ký tự sau khi bỏ khoảng trắng đầu/cuối. Ví dụ 0909123456 và 0909 123 456 sẽ được coi là hai số khác nhau — nên chuẩn hoá số điện thoại trước khi gửi.

6. Ảnh và Check-in bằng khuôn mặt

Khi có gửi ảnh (image)

  • Ảnh được lưu chung với hệ thống Portal.FaceMatching, đặt tên theo mã khách: /Content/{TaskId}/FaceID/{Code}.png
  • Kết quả trả về sẽ có imageUrl là link đầy đủ, mở được ngay, ví dụ:
    https://facematching.aievent.vn/Content/{TaskId}/FaceID/{Code}.png

Không gửi ảnh → imageUrl là chuỗi rỗng "".

Khi bật CheckInFace=1

  • Hệ thống đăng ký khuôn mặt trong ảnh lên AWS Rekognition để dùng khi check-in.
  • Nếu ảnh có nhiều người, chỉ giữ khuôn mặt lớn nhất.
✅ Yên tâm Nếu bước đăng ký khuôn mặt bị lỗi (ảnh mờ, không thấy mặt, lỗi AWS…), khách vẫn được tạo bình thường, ảnh vẫn được lưu. Lỗi chỉ được ghi log. Tuy nhiên khi đó khách có thể không check-in bằng khuôn mặt được — nên dùng ảnh chân dung rõ mặt, chính diện.

7. Ví dụ gọi API

Ví dụ tối thiểu

curl -X POST "https://<host-api-portal>/FMCustomers/Create" \
  -F "key=3fa85f64-5717-4562-b3fc-2c963f66baa6" \
  -F "FullName=Nguyễn Văn A"

Ví dụ đầy đủ (có ảnh + check-in khuôn mặt)

curl -X POST "https://<host-api-portal>/FMCustomers/Create" \
  -F "key=3fa85f64-5717-4562-b3fc-2c963f66baa6" \
  -F "FullName=Nguyễn Văn A" \
  -F "DearName=Anh" \
  -F "Email=nguyenvana@example.com" \
  -F "Phone=0909123456" \
  -F "Company=Công ty ABC" \
  -F "JobPosition=Trưởng phòng" \
  -F "MemberGroup=VIP" \
  -F "CheckInFace=1" \
  -F "image=@/duong/dan/anh.jpg"

Ví dụ JavaScript (fetch)

const form = new FormData();
form.append("key", "3fa85f64-5717-4562-b3fc-2c963f66baa6");
form.append("FullName", "Nguyễn Văn A");
form.append("Phone", "0909123456");
form.append("CheckInFace", "1");
form.append("image", fileInput.files[0]); // file ảnh từ <input type="file">

// Không tự set header Content-Type, trình duyệt sẽ tự thêm boundary
const res = await fetch("https://<host-api-portal>/FMCustomers/Create", {
  method: "POST",
  body: form
});
const data = await res.json();

if (data.isSuccess) {
  console.log("Tạo thành công. Mã khách:", data.result.code,
              "- Số may rủi:", data.result.luckyDraw);
} else {
  console.error("Lỗi:", data.message);
}

8. Đọc kết quả trả về

Mọi kết quả đều có 4 field: statusCode, message, isSuccess, result.

✅ Thành công

{
  "statusCode": 200,
  "message": "",
  "isSuccess": true,
  "result": {
    "id": 123,
    "taskId": "3fa85f64-5717-4562-b3fc-2c963f66baa6",
    "code": "25ada1d56ef04200976c",    // mã khách, hệ thống tự sinh
    "luckyDraw": "482",               // số may rủi (3 hoặc 4 chữ số)
    "fullName": "Nguyễn Văn A",
    "email": "nguyenvana@example.com",
    "phone": "0909123456",
    "imageUrl": "https://facematching.aievent.vn/Content/3fa85f64-.../FaceID/25ada1d56ef04200976c.png",
    ...
    "checkInFace": "1"
  }
}

❌ Thất bại

{
  "statusCode": 500,
  "message": "Key không hợp lệ hoặc sự kiện không tồn tại",
  "isSuccess": false,
  "result": null
}
⚠️ Nhắc lại Cả hai trường hợp trên đều trả về HTTP 200. Luôn kiểm tra isSuccess để biết thành công hay thất bại.

9. Các lỗi thường gặp & cách xử lý

Thông báo lỗi (message) Nguyên nhân Cách xử lý
Key không hợp lệ key bị bỏ trống hoặc không đúng định dạng GUID Kiểm tra lại giá trị key, copy đúng ID sự kiện
Key không hợp lệ hoặc sự kiện không tồn tại Không có sự kiện nào ứng với key này, hoặc sự kiện đã bị tắt Kiểm tra sự kiện trên màn hình Event, đảm bảo sự kiện đang bật
Khách mời đã tồn tại (trùng Số điện thoại) trong sự kiện này Số điện thoại đã có khách khác dùng trong cùng sự kiện Kiểm tra xem khách đã được tạo trước đó chưa, hoặc dùng số khác
Số may rủi (LuckyDraw) đã tồn tại trong sự kiện này Số LuckyDraw tự điền đã có người dùng Đổi số khác, hoặc bỏ trống để hệ thống tự sinh
Lỗi thiếu thông tin Thiếu FullName hoặc trường bắt buộc khác theo nghiệp vụ Kiểm tra lại dữ liệu gửi lên