ตอบกลับอัตโนมัติ
ภาพรวม
Auto Response คือกฎรูปแบบ "เมื่อผู้ใช้พิมพ์คำนี้ ให้ตอบด้วยข้อความนี้" โดยผูกกับ rich message ที่เตรียมไว้ล่วงหน้า ในสถาปัตยกรรมของระบบ cms-api ทำหน้าที่เป็น ฝั่งตั้งค่า เท่านั้น ส่วนการตอบข้อความจริงเกิดขึ้นที่ webhook service เมื่อมีข้อความเข้ามาจาก LINE
ข้อกำหนดสำคัญคือ keyword ต้องไม่ซ้ำกันภายใน OA เดียวกัน โมดูลจึงมี endpoint สำหรับตรวจสอบ
ความซ้ำแยกไว้ให้ฟอร์มเรียกก่อนบันทึก และเขียน Redis cache (AUTO_RESPONSE:*)
เพื่อให้ webhook อ่านกฎได้โดยไม่ต้อง query ฐานข้อมูลทุกข้อความ
Business Flow
GET /api/auto-responseลิสต์กฎแบบแบ่งหน้าในรูปแบบ{data, total}โดย join กับ rich message ที่ผูกอยู่เพื่อแสดงชื่อข้อความตอบกลับ- ขณะผู้ใช้พิมพ์ keyword ในฟอร์ม หน้าจอเรียก
POST /api/auto-response/check-keyword-existsพร้อม body{keyword}เพื่อแจ้งเตือนความซ้ำทันที ป้องกัน error ตอน submit POST /api/auto-response(multipart/form-data) สร้างกฎใหม่ โดยระบุ keyword หรือรูปแบบการจับคู่ พร้อม rich message ที่จะใช้ตอบ เมื่อบันทึกสำเร็จ service จะเขียน Redis cache และทำ HSET ที่ keyLINE_OA_IDเป็น side effect เพื่อให้ webhook resolve OA ได้อย่างรวดเร็ว- ดูรายละเอียดด้วย
GET /api/auto-response/:idและแก้ไขด้วยPUT /api/auto-response/:id PUT /api/auto-response/:id/statusเปิดหรือปิดกฎแยกจากการแก้เนื้อหา ทำให้ปิดกฎชั่วคราวได้โดยไม่ต้องลบทิ้งDELETE /api/auto-response/:idเป็น soft delete ส่วนDELETE /api/auto-response/:id/hardพร้อมพารามิเตอร์confirm=trueเป็นการลบถาวร ซึ่งสงวนไว้สำหรับ super admin- ในเวลา runtime webhook service รับข้อความเข้ามา อ่าน cache
AUTO_RESPONSE:*จับคู่ keyword แล้วส่ง rich message ตอบกลับ ทั้งนี้ขึ้นกับการตั้งค่า message handling ของ OA นั้นด้วย
ไฟล์และฟังก์ชันหลัก
โค้ดหลักอยู่ที่ internal/modules/autoresponse/ ประกอบด้วย controller.go, service.go
และ dto.go
| Method | Route | Handler | Policy (metadata) |
|---|---|---|---|
| GET | /api/auto-response | ct.findAll | readAll auto-response |
| GET | /api/auto-response/:id | ct.findById | read auto-response |
| POST | /api/auto-response | ct.create | create auto-response |
| POST | /api/auto-response/check-keyword-exists | ct.isKeywordExists | readAll auto-response |
| PUT | /api/auto-response/:id | ct.update | update auto-response |
| PUT | /api/auto-response/:id/status | ct.updateStatus | update auto-response |
| DELETE | /api/auto-response/:id | ct.delete | delete auto-response |
| DELETE | /api/auto-response/:id/hard | ct.hardDelete | auth.SuperAdmin() |
ทุก route ครอบด้วย modulegate.ModuleGate(d, "auto-response")
จุดเชื่อมต่อกับ Service อื่น
- สิทธิ์การเข้าถึง — ต้องผ่าน
ModuleGate("auto-response")โดยPolicyModuleAutoResponseเป็น metadata ส่วนการลบถาวรบังคับสิทธิ์SuperAdmin() - ตารางที่เกี่ยวข้อง —
auto_response,rich_message,line_oa - Redis — key ในกลุ่ม
AUTO_RESPONSE:*พร้อม TTL และ HSET ที่ keyLINE_OA_ID - ผู้บริโภคข้อมูล — line-management-webhook-go ซึ่งเป็นคนละ service อ่าน cache ชุดนี้ เพื่อตอบข้อความ
- หมายเหตุ cross-module — โค้ดฝั่ง Go query
entities.RichMessageโดยตรงภายในโมดูลนี้ แทนการ inject repository แบบเวอร์ชัน TypeScript เดิม - โมดูลที่เกี่ยวข้อง — Rich Message, Quick Reply และ Workflow ซึ่งเป็นทางเลือกอื่น ในการตอบข้อความ