Skip to main content

สร้างแบบฟอร์ม

ภาพรวม

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

สร้างและแก้ไขฟอร์ม

  1. GET /api/form-builder/common-rules โหลดชุด rule มาตรฐานให้ตัวสร้างฟอร์มนำไปใช้
  2. POST /api/form-builder (multipart/form-data) สร้างฟอร์มใหม่ โดยระบุคำถาม ชนิดคำตอบ rule และ profile mapping ระบบจะ generate form hash ให้อัตโนมัติ
  3. GET /api/form-builder ลิสต์ฟอร์มทั้งหมดแบบแบ่งหน้า และ GET /api/form-builder/:id ดูรายละเอียดฟอร์มเดียว
  4. PUT /api/form-builder/:id (form-data) แก้ไขฟอร์ม และ DELETE /api/form-builder/:id ลบฟอร์ม

เก็บและอ่านคำตอบ

  1. ผู้ใช้ LINE เปิดฟอร์มผ่าน client-web หรือ LIFF แล้วส่งคำตอบ ทั้งนี้การรับคำตอบเกิดขึ้นที่ client-api ไม่ใช่ที่โมดูลนี้ และหากฟอร์มเปิดใช้ OTP ผู้กรอกต้องยืนยันเบอร์โทรก่อน
  2. GET /api/form-builder/:id/responses อ่านคำตอบแบบแบ่งหน้า พร้อมตัวกรองตาม FormSubmissionDto
  3. GET /api/form-builder/:id/stats สรุปสถิติรายคำถามสำหรับหน้า dashboard ของฟอร์ม
  4. GET /api/form-builder/:id/export ส่งออกคำตอบทั้งหมดเป็นไฟล์ CSV
  5. คำตอบที่มี profile mapping จะถูกเขียนกลับเข้า Customer Database หรือ custom attribute ของ LINE user
  6. ทุกครั้งที่มีคำตอบใหม่ ระบบจะ 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) ไว้ในไฟล์เดียว

MethodRouteHandlerPolicy (metadata)
GET/api/form-builderct.getAllForms
GET/api/form-builder/common-rulesct.getCommonRule
GET/api/form-builder/:idct.getFormById
GET/api/form-builder/:id/responsesct.getFormResponses
GET/api/form-builder/:id/statsct.getFormResponseStats
GET/api/form-builder/:id/exportct.exportResponses
POST/api/form-builderct.createFormcreate form-builder
PUT/api/form-builder/:idct.updateFormupdate form-builder
DELETE/api/form-builder/:idct.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