สร้างแบบฟอร์ม
ภาพรวม
Form Builder ใช้สร้างแบบฟอร์มที่ส่งให้ผู้ใช้ LINE กรอก ไม่ว่าจะเป็นฟอร์มลงทะเบียน
แบบสำรวจ หรือฟอร์มร่วมกิจกรรมลุ้นรางวัล แต่ละฟอร์มมี form hash เป็นตัวอ้างอิงสาธารณะ
คำตอบทั้งหมดถูกเก็บไว้ในตาราง form_submission
จุดเด่นของโมดูลคือ profile mapping ซึ่งผูกคำตอบแต่ละข้อเข้ากับฟิลด์ใน Customer Database หรือ custom attribute ของ LINE user ได้โดยตรง ทำให้ข้อมูลที่ผู้ใช้กรอกไหลกลับเข้าโปรไฟล์ทันที
นอกจากนี้ยังมีระบบ rule ที่เก็บในตาราง form_builder_rule สำหรับกำหนดตรรกะเงื่อนไข
ภายในฟอร์ม เช่น เมื่อตอบข้อนี้ให้ข้ามไปข้อใด พร้อมชุด common rule ที่ใช้ร่วมกันได้หลายฟอร์ม
คำตอบของฟอร์มยังเป็นแหล่งข้อมูลสำคัญของ Audience Filter และเป็นตัวจุด trigger ให้ Trigger Rule
Business Flow
สร้างและแก้ไขฟอร์ม
GET /api/form-builder/common-rulesโหลดชุด rule มาตรฐานให้ตัวสร้างฟอร์มนำไปใช้POST /api/form-builder(multipart/form-data) สร้างฟอร์มใหม่ โดยระบุคำถาม ชนิดคำตอบ rule และ profile mapping ระบบจะ generate form hash ให้อัตโนมัติGET /api/form-builderลิสต์ฟอร์มทั้งหมดแบบแบ่งหน้า และGET /api/form-builder/:idดูรายละเอียดฟอร์มเดียวPUT /api/form-builder/:id(form-data) แก้ไขฟอร์ม และDELETE /api/form-builder/:idลบฟอร์ม
เก็บและอ่านคำตอบ
- ผู้ใช้ LINE เปิดฟอร์มผ่าน client-web หรือ LIFF แล้วส่งคำตอบ ทั้งนี้การรับคำตอบเกิดขึ้นที่ client-api ไม่ใช่ที่โมดูลนี้ และหากฟอร์มเปิดใช้ OTP ผู้กรอกต้องยืนยันเบอร์โทรก่อน
GET /api/form-builder/:id/responsesอ่านคำตอบแบบแบ่งหน้า พร้อมตัวกรองตามFormSubmissionDtoGET /api/form-builder/:id/statsสรุปสถิติรายคำถามสำหรับหน้า dashboard ของฟอร์มGET /api/form-builder/:id/exportส่งออกคำตอบทั้งหมดเป็นไฟล์ CSV- คำตอบที่มี profile mapping จะถูกเขียนกลับเข้า Customer Database หรือ custom attribute ของ LINE user
- ทุกครั้งที่มีคำตอบใหม่ ระบบจะ publish event ลง queue
form_submitted_triggerเพื่อให้ Trigger Rule ทำงานต่อ
ไฟล์และฟังก์ชันหลัก
โค้ดหลักอยู่ที่ internal/modules/formbuilder/ ประกอบด้วย controller.go, service.go
และ dto.go โดย service รวมตรรกะจาก 3 repository ของเวอร์ชัน TypeScript เดิม
(form-builder.repository.ts, form-builder-rule.repository.ts และ
form-submission.repository.ts) ไว้ในไฟล์เดียว
| Method | Route | Handler | Policy (metadata) |
|---|---|---|---|
| GET | /api/form-builder | ct.getAllForms | — |
| GET | /api/form-builder/common-rules | ct.getCommonRule | — |
| GET | /api/form-builder/:id | ct.getFormById | — |
| GET | /api/form-builder/:id/responses | ct.getFormResponses | — |
| GET | /api/form-builder/:id/stats | ct.getFormResponseStats | — |
| GET | /api/form-builder/:id/export | ct.exportResponses | — |
| POST | /api/form-builder | ct.createForm | create form-builder |
| PUT | /api/form-builder/:id | ct.updateForm | update form-builder |
| DELETE | /api/form-builder/:id | ct.deleteForm | — |
ทุก route ครอบด้วย modulegate.ModuleGate(d, "form-builder")
ส่วนฟังก์ชันที่โมดูลอื่นเรียกใช้คือ GetFormById(ctx, id) ซึ่ง Audience Filter
เรียกผ่าน interface
จุดเชื่อมต่อกับ Service อื่น
- สิทธิ์การเข้าถึง —
ModuleGate("form-builder")ถูกบังคับใช้จริงในโมดูลนี้ ส่วนPolicyModuleFormBuilderเป็น metadata เฉพาะ handler ที่เป็น create และ update - ตารางที่เกี่ยวข้อง —
form_builder,form_builder_rule,form_submission,customer_database,customer_database_row,line_user,otp_config - RabbitMQ — publish ลง queue
form_submitted_trigger - Storage Service — เก็บไฟล์แนบในฟอร์มและไฟล์ CSV ที่ export
- Cross-module — ถูกเรียกใช้โดย Audience Filter และเชื่อมกับ Customer Database
ผ่านค่าใน
profile_mappingที่คีย์databaseId - โมดูลที่เกี่ยวข้อง — OTP Config, Trigger Rule, Audience Filter และ Customer Database