คลังข้อความ (Rich Message / Template / Quick Reply)
ภาพรวม
Domain นี้เก็บ เนื้อหาข้อความที่จะส่งออกไปทาง LINE โดยแยกออกจากตัว "การส่ง" ซึ่งอยู่ในฝั่ง campaign การแยกเช่นนี้ทำให้ข้อความหนึ่งชิ้นถูกนำไปใช้ซ้ำได้ทั้งใน campaign และใน auto-response
ประกอบด้วยตารางหลัก 3 ตาราง
rich_message— ข้อความหลัก ครอบคลุมข้อความตัวอักษร รูปภาพ รูปที่คลิกได้ และ flex messagetemplate_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— modelRichMessageprisma/schema.prisma:761— modelTemplateMessageprisma/schema.prisma:784— modelQuickReplyprisma/migrations/20260725100000_add_quick_reply/migration.sql— สร้างตารางquick_replyและเพิ่มคอลัมน์rich_message.quick_reply_idพร้อม comment อธิบายเหตุผลที่ไม่สร้าง FKseed-data/11.rich_message.sqlschema-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