Skip to main content

คลังข้อความ (Rich Message / Template / Quick Reply)

ภาพรวม

Domain นี้เก็บ เนื้อหาข้อความที่จะส่งออกไปทาง LINE โดยแยกออกจากตัว "การส่ง" ซึ่งอยู่ในฝั่ง campaign การแยกเช่นนี้ทำให้ข้อความหนึ่งชิ้นถูกนำไปใช้ซ้ำได้ทั้งใน campaign และใน auto-response

ประกอบด้วยตารางหลัก 3 ตาราง

  • rich_message — ข้อความหลัก ครอบคลุมข้อความตัวอักษร รูปภาพ รูปที่คลิกได้ และ flex message
  • template_message — แม่แบบ flex สำเร็จรูปที่ผู้ใช้กรอกเนื้อหาลงไป
  • quick_reply — ชุดปุ่มตอบด่วนที่แนบท้ายข้อความได้

โครงสร้างข้อมูลหลัก

rich_message (model RichMessage)

เก็บ title และ content JSONB ซึ่งเป็น payload ที่ส่งเข้า LINE Messaging API โดยตรง ชนิดข้อความระบุด้วย type (enum RichMessageType: text, image, tappable_image, flex_message) และผูกกับ channel ผ่าน FK line_oa_id

คอลัมน์ quick_reply_id เป็น UUID ที่อ้างถึง quick_reply.id แต่ จงใจไม่สร้าง foreign key จริง เพราะเลือกให้แอปพลิเคชันเป็นผู้ห้ามลบ quick reply ที่ยังถูกใช้งานอยู่ แทนที่จะใช้ constraint ระดับฐานข้อมูล

มีความสัมพันธ์ 1 : N กับ campaign และ auto_response

template_message (model TemplateMessage)

ใช้ UUID เป็น primary key เก็บ title และ template_message_showcase_id (หมายเลขแม่แบบใน showcase)

เนื้อหาเก็บเป็น 2 ชุดคู่กัน คือ line_template_message JSONB ซึ่งเป็น payload สำหรับส่งเข้า LINE และ form_template_message JSONB ซึ่งเก็บค่าที่ผู้ใช้กรอกในฟอร์มฝั่ง CMS เพื่อ render กลับมาแก้ไขได้ภายหลัง มี index บน (line_oa_id, template_message_showcase_id, status)

ข้อสังเกตที่สำคัญคือ template message ไม่มีเส้นทางส่งตรงไป LINE — flex ของ template จะถูกส่งออกโดยฝังอยู่ใน rich message เท่านั้น ซึ่งเป็นเหตุผลว่าทำไม quick reply จึงผูกไว้ที่ระดับ rich_message

quick_reply (model QuickReply)

ใช้ UUID เป็น primary key เก็บ name, items JSONB (รายการปุ่ม ค่า default เป็น []) และ status

จุดต่างที่ควรระวังคือคอลัมน์ line_oa_id และ organization_id ของตารางนี้เป็นชนิด BIGINT ซึ่งต่างจากตารางรุ่นเก่าที่ใช้ INT มี index บน (line_oa_id, status) และ (created_date)

ไฟล์ที่เกี่ยวข้อง

  • prisma/schema.prisma:356 — model RichMessage
  • prisma/schema.prisma:761 — model TemplateMessage
  • prisma/schema.prisma:784 — model QuickReply
  • prisma/migrations/20260725100000_add_quick_reply/migration.sql — สร้างตาราง quick_reply และเพิ่มคอลัมน์ rich_message.quick_reply_id พร้อม comment อธิบายเหตุผลที่ไม่สร้าง FK
  • seed-data/11.rich_message.sql
  • schema-dumps/2026-07-24/schema.sql:2667 และ :2942

จุดเชื่อมต่อกับ Service อื่น

  • cms-api-go — CRUD ทั้งสามตาราง และ validate โครงสร้าง flex กับ LINE API โดยจำนวน template ที่สร้างได้ถูกจำกัดด้วย plan_limits.maxTemplates
  • worker-go — อ่าน rich_message.content ตอนส่ง campaign แต่ตัว campaign เองจะ snapshot เนื้อหาไว้ใน campaign.rich_message_content ณ เวลาส่งด้วย
  • webhook-go — ใช้ rich_message ที่ผูกไว้เป็นคำตอบของ auto-response
  • เชื่อมกับ Campaign, Auto Response และ Tracking ซึ่งปุ่มใน flex จะถูกแทนที่ด้วยลิงก์ tracking