กฎทริกเกอร์อัตโนมัติ
ภาพรวม
Trigger Rule คือกฎแบบ "เมื่อเกิดเหตุการณ์นี้ ให้ทำสิ่งนี้" ที่ทำงานเบื้องหลังโดยไม่ต้องมีผู้ใช้กดสั่ง เหตุการณ์ต้นทาง (trigger source) ที่ระบบรองรับสอดคล้องกับคิว RabbitMQ ที่มีอยู่จริง ได้แก่
| เหตุการณ์ | Queue |
|---|---|
| สมาชิกเข้า/ออก audience | audience_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
- โหลดตัวเลือกเหตุการณ์ —
GET /api/trigger-rules/dropdownคืนรายการ trigger source ที่ใช้ได้ โดยแคชไว้ที่ Redis keyTRIGGER_SOURCE_TYPES - สร้างกฎ —
POST /api/trigger-rulesผู้ใช้เลือกเหตุการณ์ต้นทาง เงื่อนไข และการกระทำที่ต้องการ- service เรียก
validateReferences(raw SQL) เพื่อยืนยันว่า audience / form / campaign ที่อ้างถึงมีอยู่จริง หากไม่พบจะคืน error พร้อม cause payload ที่ระบุว่าอ้างถึงสิ่งใดผิด
- service เรียก
- ดูรายการกฎ —
GET /api/trigger-rulesแสดงรายการแบบแบ่งหน้า แต่ละแถวแนบ execution stats (จำนวนครั้งที่ทำงาน สำเร็จ และล้มเหลว) ซึ่งคำนวณด้วย subquery ต่อแถว - ตรวจการพึ่งพา —
GET /api/trigger-rules/by-audience/:audienceIdแสดงกฎทั้งหมดที่ผูกกับ audience หนึ่ง ๆ ใช้ตอนจะลบ audience เพื่อเตือนผู้ใช้ว่ามีกฎที่พึ่งพาอยู่ - จัดการรายกฎ —
GET /api/trigger-rules/:idดูรายละเอียด,PUT /api/trigger-rules/:idแก้ไข,DELETE /api/trigger-rules/:idลบ - ติดตามผล —
GET /api/trigger-rules/:id/statsคืนสถิติสรุป (raw SQL) และGET /api/trigger-rules/:id/logsคืนประวัติการทำงานรายครั้งจากตารางtrigger_logแบบแบ่งหน้า - ฝั่ง runtime — เมื่อเหตุการณ์เกิดขึ้น worker จะอ่านกฎจาก Redis (
TRIGGER_RULES) ใช้TRIGGER_LOCKป้องกันการทำงานซ้อน รันการกระทำตามที่กำหนด แล้วบันทึกผลลงtrigger_log
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/triggerrule/ ประกอบด้วย controller.go, service.go และ dto.go
| Method | Route | Handler | Policy |
|---|---|---|---|
| GET | /api/trigger-rules | ct.findAll | read trigger-rule |
| GET | /api/trigger-rules/dropdown | ct.getDropdown | read trigger-rule |
| GET | /api/trigger-rules/by-audience/:audienceId | ct.findByAudienceID | read trigger-rule |
| GET | /api/trigger-rules/:id | ct.findOne | read trigger-rule |
| GET | /api/trigger-rules/:id/stats | ct.getStats | read trigger-rule |
| GET | /api/trigger-rules/:id/logs | ct.getLogs | read trigger-rule |
| POST | /api/trigger-rules | ct.create | create trigger-rule |
| PUT | /api/trigger-rules/:id | ct.update | update trigger-rule |
| DELETE | /api/trigger-rules/:id | ct.delete | delete trigger-rule |
ทุก route ครอบด้วย modulegate.ModuleGate(d, "trigger-rule")
จุดเชื่อมต่อกับ Service อื่น
- สิทธิ์การเข้าถึง — ต้องผ่าน
ModuleGate("trigger-rule")โดยใช้PolicyModuleTriggerRuleเป็น metadata ของ policy - ตารางที่เกี่ยวข้อง —
trigger_rule,trigger_log,audience,form_builder,campaign,workflow - Redis —
TRIGGER_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 และ แอปจองคิว/นัดหมาย