Skip to main content

ฟอร์ม (Form Builder)

ภาพรวม

Domain นี้มี 4 ตาราง: form_builder เก็บนิยามฟอร์ม (คำถาม/ธีม/หน้าขอบคุณ) แบบ JSONB, form_submission เก็บคำตอบที่ผู้ใช้ส่งเข้ามาโดยอ้างอิงฟอร์มผ่าน form_hash, form_builder_rule เก็บ rule ที่นำไปใช้กับ field ในฟอร์ม และ otp_config เก็บการตั้งค่าช่องทางยืนยัน OTP (SMS ผ่าน ThaiBulkSMS และอีเมล) แยกตาม LINE OA

ตาราง form_builder

ColumnTypeNullableDefaultคำอธิบาย
idSERIALNOnextval(...)Primary key
titleTEXTNO-ชื่อฟอร์ม
descriptionTEXTYES-คำอธิบายฟอร์ม
questionsJSONBNO-นิยามคำถามทั้งหมดของฟอร์ม (array ของ field)
themeJSONBYES-การตั้งค่าธีม/หน้าตาของฟอร์ม
thank_youJSONBYES-การตั้งค่าหน้าขอบคุณหลังส่งฟอร์ม
statusFormBuilderStatus (ENUM)NOdraftสถานะฟอร์ม: active, inactive, draft, delete
start_dateTIMESTAMPTZ(3)YES-วันเวลาที่เริ่มเปิดรับคำตอบ
end_dateTIMESTAMPTZ(3)YES-วันเวลาที่ปิดรับคำตอบ
responses_countINTEGERNO0จำนวนคำตอบที่ได้รับ (counter)
form_hashVARCHAR(50)NO-รหัสอ้างอิงฟอร์มแบบสาธารณะ (unique) ใช้ในลิงก์ฟอร์ม
line_oa_idINTEGERYES-LINE OA ที่ฟอร์มนี้สังกัด (FK ไป line_oa.id)
convert_to_memberBOOLEANYES-ให้เปลี่ยนสถานะผู้ตอบเป็น member หลังส่งฟอร์มหรือไม่
require_line_loginBOOLEANNOtrueบังคับให้ล็อกอิน LINE ก่อนกรอกฟอร์มหรือไม่
one_time_submissionBOOLEANYES-จำกัดให้ผู้ใช้หนึ่งคนส่งได้ครั้งเดียวหรือไม่
field_attribute_mappingsJSONBYES'[]'การ map field ในฟอร์มไปยัง attribute ของผู้ใช้
created_byINTEGERYES-ผู้สร้าง (user id)
created_atTIMESTAMPTZ(3)NOnow()วันเวลาที่สร้าง
updated_byINTEGERYES-ผู้แก้ไขล่าสุด (user id)
updated_atTIMESTAMPTZ(3)NOnow()วันเวลาที่แก้ไขล่าสุด

ตาราง form_submission

ColumnTypeNullableDefaultคำอธิบาย
idSERIALNOnextval(...)Primary key
form_hashVARCHAR(50)NO-รหัสฟอร์มที่ส่งคำตอบเข้ามา (FK ไป form_builder.form_hash)
submitted_dateTIMESTAMPTZ(3)YES-วันเวลาที่กดส่งฟอร์ม
line_user_idTEXTYES-LINE user id ของผู้ตอบ (ถ้าล็อกอิน LINE)
ip_addressTEXTYES-IP address ของผู้ตอบ
user_agentTEXTYES-User agent ของเบราว์เซอร์ผู้ตอบ
answerJSONBNO-คำตอบทั้งหมดของแบบฟอร์ม
metadataJSONBYES-ข้อมูลเพิ่มเติมของการส่งฟอร์ม
is_submittedBOOLEANNOfalseส่งฟอร์มสมบูรณ์แล้วหรือยัง (ใช้แยก draft ออกจากคำตอบจริง)

ตาราง form_builder_rule

ColumnTypeNullableDefaultคำอธิบาย
idSERIALNOnextval(...)Primary key
typeVARCHAR(50)NO-ประเภทของ rule
nameVARCHAR(100)NO-ชื่อ rule
propertiesJSONBNO'{}'พารามิเตอร์ของ rule
statusCommonStatus (ENUM)NOactiveสถานะของ rule
created_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่สร้าง
updated_dateTIMESTAMPTZ(3)YES-วันเวลาที่แก้ไขล่าสุด

ตาราง otp_config

ColumnTypeNullableDefaultคำอธิบาย
idUUIDNOgen_random_uuid()Primary key
line_oa_idBIGINTNO-LINE OA ที่ใช้การตั้งค่านี้ (unique — หนึ่ง OA ต่อหนึ่ง config)
organization_idBIGINTNO-องค์กรเจ้าของการตั้งค่า
thaibulksms_keyTEXTYES-API key ของ ThaiBulkSMS สำหรับส่ง OTP ทาง SMS
thaibulksms_secret_encTEXTYES-API secret ของ ThaiBulkSMS (เก็บแบบเข้ารหัส)
sms_enabledBOOLEANNOfalseเปิดใช้งานการส่ง OTP ทาง SMS หรือไม่
email_enabledBOOLEANNOfalseเปิดใช้งานการส่ง OTP ทางอีเมลหรือไม่
email_subjectTEXTYES-หัวเรื่องอีเมล OTP
email_bodyTEXTYES-เนื้อหาอีเมล OTP (template)
statusTEXTNO'active'สถานะของการตั้งค่า
created_dateTIMESTAMPTZ(3)NOnow()วันเวลาที่สร้าง
updated_dateTIMESTAMPTZ(3)YES-วันเวลาที่แก้ไขล่าสุด

หมายเหตุ

  • form_submission.form_hash เป็น FK ไปยัง form_builder.form_hash (ไม่ใช่ id) พร้อม ON DELETE CASCADE — ลบฟอร์มแล้วคำตอบทั้งหมดจะถูกลบตาม
  • form_builder.form_hash มี unique constraint และมี index แยกอีกหนึ่งตัว เพราะถูกใช้เป็น key ในการเปิดฟอร์มจากลิงก์สาธารณะ
  • form_builder.line_oa_id เป็น FK ไป line_oa.id และเป็น nullable (ฟอร์มที่ยังไม่ผูก OA)
  • การอัปเดต form_submission.is_submitted จาก false เป็น true จะ trigger ฟังก์ชัน notify_form_submitted() ซึ่งยิง pg_notify channel form_submitted และ insert ลง event_outbox (ดู pg_notify และ Event Outbox)
  • otp_config.line_oa_id มี unique constraint — หนึ่ง LINE OA มีการตั้งค่า OTP ได้ชุดเดียว
  • form_builder_rule ไม่มี FK ตรงไปยัง form_builder — rule ถูกอ้างอิงจากภายใน JSONB ของ form_builder.questions