Skip to main content

ตอบกลับอัตโนมัติ

ภาพรวม

Auto Response คือกฎรูปแบบ "เมื่อผู้ใช้พิมพ์คำนี้ ให้ตอบด้วยข้อความนี้" โดยผูกกับ rich message ที่เตรียมไว้ล่วงหน้า ในสถาปัตยกรรมของระบบ cms-api ทำหน้าที่เป็น ฝั่งตั้งค่า เท่านั้น ส่วนการตอบข้อความจริงเกิดขึ้นที่ webhook service เมื่อมีข้อความเข้ามาจาก LINE

ข้อกำหนดสำคัญคือ keyword ต้องไม่ซ้ำกันภายใน OA เดียวกัน โมดูลจึงมี endpoint สำหรับตรวจสอบ ความซ้ำแยกไว้ให้ฟอร์มเรียกก่อนบันทึก และเขียน Redis cache (AUTO_RESPONSE:*) เพื่อให้ webhook อ่านกฎได้โดยไม่ต้อง query ฐานข้อมูลทุกข้อความ

Business Flow

  1. GET /api/auto-response ลิสต์กฎแบบแบ่งหน้าในรูปแบบ {data, total} โดย join กับ rich message ที่ผูกอยู่เพื่อแสดงชื่อข้อความตอบกลับ
  2. ขณะผู้ใช้พิมพ์ keyword ในฟอร์ม หน้าจอเรียก POST /api/auto-response/check-keyword-exists พร้อม body {keyword} เพื่อแจ้งเตือนความซ้ำทันที ป้องกัน error ตอน submit
  3. POST /api/auto-response (multipart/form-data) สร้างกฎใหม่ โดยระบุ keyword หรือรูปแบบการจับคู่ พร้อม rich message ที่จะใช้ตอบ เมื่อบันทึกสำเร็จ service จะเขียน Redis cache และทำ HSET ที่ key LINE_OA_ID เป็น side effect เพื่อให้ webhook resolve OA ได้อย่างรวดเร็ว
  4. ดูรายละเอียดด้วย GET /api/auto-response/:id และแก้ไขด้วย PUT /api/auto-response/:id
  5. PUT /api/auto-response/:id/status เปิดหรือปิดกฎแยกจากการแก้เนื้อหา ทำให้ปิดกฎชั่วคราวได้โดยไม่ต้องลบทิ้ง
  6. DELETE /api/auto-response/:id เป็น soft delete ส่วน DELETE /api/auto-response/:id/hard พร้อมพารามิเตอร์ confirm=true เป็นการลบถาวร ซึ่งสงวนไว้สำหรับ super admin
  7. ในเวลา runtime webhook service รับข้อความเข้ามา อ่าน cache AUTO_RESPONSE:* จับคู่ keyword แล้วส่ง rich message ตอบกลับ ทั้งนี้ขึ้นกับการตั้งค่า message handling ของ OA นั้นด้วย

ไฟล์และฟังก์ชันหลัก

โค้ดหลักอยู่ที่ internal/modules/autoresponse/ ประกอบด้วย controller.go, service.go และ dto.go

MethodRouteHandlerPolicy (metadata)
GET/api/auto-responsect.findAllreadAll auto-response
GET/api/auto-response/:idct.findByIdread auto-response
POST/api/auto-responsect.createcreate auto-response
POST/api/auto-response/check-keyword-existsct.isKeywordExistsreadAll auto-response
PUT/api/auto-response/:idct.updateupdate auto-response
PUT/api/auto-response/:id/statusct.updateStatusupdate auto-response
DELETE/api/auto-response/:idct.deletedelete auto-response
DELETE/api/auto-response/:id/hardct.hardDeleteauth.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 ที่ key LINE_OA_ID
  • ผู้บริโภคข้อมูล — line-management-webhook-go ซึ่งเป็นคนละ service อ่าน cache ชุดนี้ เพื่อตอบข้อความ
  • หมายเหตุ cross-module — โค้ดฝั่ง Go query entities.RichMessage โดยตรงภายในโมดูลนี้ แทนการ inject repository แบบเวอร์ชัน TypeScript เดิม
  • โมดูลที่เกี่ยวข้อง — Rich Message, Quick Reply และ Workflow ซึ่งเป็นทางเลือกอื่น ในการตอบข้อความ