ข้อความริช (Rich Message)
ภาพรวม
Rich Message คือกล่องข้อความที่จะถูกส่งออกไป ประกอบด้วยข้อความ รูปภาพ วิดีโอ Flex Message รวมถึงปุ่มและลิงก์ ได้หลายบล็อกในชุดเดียวกัน โมดูลนี้ทำหน้าที่เป็นคลังเก็บ rich message ที่นำกลับมาใช้ซ้ำได้ โดยผู้บริโภคหลักคือโมดูลแคมเปญและ auto-response
โมดูลรองรับการอัปโหลดรูปภาพและวิดีโอผ่าน multipart/form-data พร้อมมี endpoint สำหรับสร้าง thumbnail จากวิดีโอให้ด้วย
Business Flow
GET /api/rich-messageแสดงรายการแบบแบ่งหน้าในรูป{data, total}โดย scope ตามlineOaIdGET /api/rich-message/find-all-objectคืนข้อมูลรูปแบบ object/dropdown ซึ่งไม่มี policy annotation ตามระบบ TypeScript เดิมPOST /api/rich-messageรับ multipart/form-data เพื่อสร้างรายการใหม่- อัปโหลดไฟล์แนบขึ้น object storage ผ่าน storage service
- หากเป็น Flex Message จะส่งไปให้ LINE ตรวจสอบความถูกต้องผ่าน
validateJsonFlexMessageหากไม่ผ่านจะตอบ errorRMS_002(Failed to validate with LINE API) - หากชื่อซ้ำจะตอบ error
RMS_001(Duplicate title)
POST /api/rich-message/gen-thumbnail-videoรับ form-data เพื่ออัปโหลดวิดีโอและขอ thumbnail ใช้ตอนตั้งค่าบล็อกวิดีโอ เนื่องจาก LINE ต้องการ preview imageGET /api/rich-message/:idดูรายละเอียด และPUT /api/rich-message/:idแก้ไข ซึ่งรับเป็น form-data เช่นเดียวกันDELETE /api/rich-message/:idลบแบบ soft delete ส่วนDELETE /api/rich-message/:id/hard?confirm=trueลบข้อมูลจริง เฉพาะ super admin- เมื่อแคมเปญถึงเวลาส่ง ระบบจะอ่าน rich message ตัวนี้ไปประกอบ payload แล้ว publish ลง RabbitMQ
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/richmessage/ ประกอบด้วย controller.go, service.go,
responses.go, js.go และ dto.go
| Method | Route | Handler | Policy (metadata) |
|---|---|---|---|
| GET | /api/rich-message | ct.findAll | readAll rich-message |
| GET | /api/rich-message/find-all-object | ct.findAllObject | — |
| GET | /api/rich-message/:id | ct.findByID | read rich-message |
| POST | /api/rich-message | ct.create | create rich-message |
| POST | /api/rich-message/gen-thumbnail-video | ct.genThumbnailVideo | read rich-message |
| PUT | /api/rich-message/:id | ct.update | update rich-message |
| DELETE | /api/rich-message/:id | ct.delete | delete rich-message |
| DELETE | /api/rich-message/:id/hard | ct.hardDelete | auth.SuperAdmin() |
ทุก route ครอบด้วย modulegate.ModuleGate(d, "rich-message")
จุดเชื่อมต่อกับ Service อื่น
- Permission —
ModuleGate("rich-message")เป็นตัวบังคับจริง ส่วนPolicyModuleRichMessageเป็นเพียง metadata และ hard delete ต้องผ่านauth.SuperAdmin() - ตารางที่เกี่ยวข้อง —
rich_message,line_oa - Redis — cache ทั้งรายการและรายละเอียด โดย key และ TTL ตรงกับระบบ TypeScript เดิม
- Storage — เก็บรูปภาพ วิดีโอ และ thumbnail
- External — LINE API สำหรับ validate Flex Message
- ผู้บริโภค — การจัดการแคมเปญ, auto-response ซึ่งอ่านตาราง
rich_messageโดยตรง และ template message - Error code —
RMS_001ชื่อซ้ำ และRMS_002LINE validate ล้มเหลว