Skip to main content

กฎทริกเกอร์อัตโนมัติ

ภาพรวม

Trigger Rule คือกฎแบบ "เมื่อเกิดเหตุการณ์นี้ ให้ทำสิ่งนี้" ที่ทำงานเบื้องหลังโดยไม่ต้องมีผู้ใช้กดสั่ง เหตุการณ์ต้นทาง (trigger source) ที่ระบบรองรับสอดคล้องกับคิว RabbitMQ ที่มีอยู่จริง ได้แก่

เหตุการณ์Queue
สมาชิกเข้า/ออก audienceaudience_membership_trigger
มีผู้ส่งฟอร์มform_submitted_trigger
มีผู้คลิกลิงก์ในแคมเปญcampaign_click_trigger
มีข้อความเข้ามาmessage_received_trigger
มีการจองหรือเปลี่ยนสถานะการจองbooking_event_trigger

โมดูลนี้รับผิดชอบเฉพาะฝั่งตั้งกฎและดูสถิติ/ประวัติการทำงาน ส่วนการประมวลผลจริงเมื่อเหตุการณ์เกิดขึ้นอยู่ที่ service line-management-worker-go นอกจากนี้ Trigger Rule ยังเป็นฐานที่ เวิร์กโฟลว์และแชตบอต ต่อยอดขึ้นไป เพราะ workflow ต้องผูกกับ trigger rule เพื่อให้มีจุดเริ่มทำงาน

Business Flow

  1. โหลดตัวเลือกเหตุการณ์GET /api/trigger-rules/dropdown คืนรายการ trigger source ที่ใช้ได้ โดยแคชไว้ที่ Redis key TRIGGER_SOURCE_TYPES
  2. สร้างกฎPOST /api/trigger-rules ผู้ใช้เลือกเหตุการณ์ต้นทาง เงื่อนไข และการกระทำที่ต้องการ
    • service เรียก validateReferences (raw SQL) เพื่อยืนยันว่า audience / form / campaign ที่อ้างถึงมีอยู่จริง หากไม่พบจะคืน error พร้อม cause payload ที่ระบุว่าอ้างถึงสิ่งใดผิด
  3. ดูรายการกฎGET /api/trigger-rules แสดงรายการแบบแบ่งหน้า แต่ละแถวแนบ execution stats (จำนวนครั้งที่ทำงาน สำเร็จ และล้มเหลว) ซึ่งคำนวณด้วย subquery ต่อแถว
  4. ตรวจการพึ่งพาGET /api/trigger-rules/by-audience/:audienceId แสดงกฎทั้งหมดที่ผูกกับ audience หนึ่ง ๆ ใช้ตอนจะลบ audience เพื่อเตือนผู้ใช้ว่ามีกฎที่พึ่งพาอยู่
  5. จัดการรายกฎGET /api/trigger-rules/:id ดูรายละเอียด, PUT /api/trigger-rules/:id แก้ไข, DELETE /api/trigger-rules/:id ลบ
  6. ติดตามผลGET /api/trigger-rules/:id/stats คืนสถิติสรุป (raw SQL) และ GET /api/trigger-rules/:id/logs คืนประวัติการทำงานรายครั้งจากตาราง trigger_log แบบแบ่งหน้า
  7. ฝั่ง runtime — เมื่อเหตุการณ์เกิดขึ้น worker จะอ่านกฎจาก Redis (TRIGGER_RULES) ใช้ TRIGGER_LOCK ป้องกันการทำงานซ้อน รันการกระทำตามที่กำหนด แล้วบันทึกผลลง trigger_log

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

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

MethodRouteHandlerPolicy
GET/api/trigger-rulesct.findAllread trigger-rule
GET/api/trigger-rules/dropdownct.getDropdownread trigger-rule
GET/api/trigger-rules/by-audience/:audienceIdct.findByAudienceIDread trigger-rule
GET/api/trigger-rules/:idct.findOneread trigger-rule
GET/api/trigger-rules/:id/statsct.getStatsread trigger-rule
GET/api/trigger-rules/:id/logsct.getLogsread trigger-rule
POST/api/trigger-rulesct.createcreate trigger-rule
PUT/api/trigger-rules/:idct.updateupdate trigger-rule
DELETE/api/trigger-rules/:idct.deletedelete trigger-rule

ทุก route ครอบด้วย modulegate.ModuleGate(d, "trigger-rule")

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

  • สิทธิ์การเข้าถึง — ต้องผ่าน ModuleGate("trigger-rule") โดยใช้ PolicyModuleTriggerRule เป็น metadata ของ policy
  • ตารางที่เกี่ยวข้องtrigger_rule, trigger_log, audience, form_builder, campaign, workflow
  • RedisTRIGGER_RULES (กฎที่ worker ใช้), TRIGGER_SOURCE_TYPES (แคชตัวเลือก), TRIGGER_LOCK (กันทำงานซ้อน)
  • RabbitMQ — รับเหตุการณ์จากคิว audience_membership_trigger, form_submitted_trigger, campaign_click_trigger, message_received_trigger, booking_event_trigger และส่งงานออกทาง web_request_execute
  • ผู้ประมวลผลline-management-worker-go เป็นผู้รันกฎจริง
  • โมดูลที่เกี่ยวข้องเวิร์กโฟลว์, Audience Management, Form Builder, Campaign Management และ แอปจองคิว/นัดหมาย