จัดการกลุ่มเป้าหมาย
ภาพรวม
Audience คือกลุ่มเป้าหมายที่ใช้เล็งการส่งข้อความในแคมเปญ ผูกกับ rich menu หรือใช้เป็นเงื่อนไขจุด trigger จุดออกแบบที่สำคัญคือสมาชิกของ audience ถูกเก็บเป็นไฟล์ CSV บน object storage ไม่ใช่แถวในฐานข้อมูล เพื่อรองรับสมาชิกจำนวนมหาศาล การอ่านรายชื่อสมาชิกกลับมาจึงต้องผ่าน CSV Engine
โมดูลนี้ยังมี cron ที่ทำงานทุกนาทีเพื่อ auto-refresh audience ที่ตั้งค่าไว้
และเก็บ audit log การเข้าออกของสมาชิกไว้ในตาราง audience_member_log
Business Flow
สร้างและเรียกดู
GET /api/audiencesลิสต์ audience แบบแบ่งหน้าPOST /api/audiences(multipart/form-data) สร้าง audience ใหม่ โดยระบบตรวจโควตาmaxSegmentsตามแพ็กเกจก่อน หากชื่อซ้ำจะตอบ errorAUD_001ผู้ใช้อัปโหลดไฟล์ CSV หรือระบุเงื่อนไข filter จากนั้นระบบ publish งานลง queuecreate_audienceให้ worker สร้างไฟล์สมาชิกต่อไปGET /api/audiences/:idดูรายละเอียด ได้แก่ จำนวนสมาชิก เงื่อนไข และสถานะปัจจุบันGET /api/audiences/:id/memberดูรายชื่อสมาชิกแบบแบ่งหน้า โดยอ่านไฟล์ CSV ผ่าน CSV Engine พร้อม cache 30 วินาทีPUT /api/audiences/:idแก้ไข ซึ่งจะ publish งานลง queueupdate_audienceDELETE /api/audiences/:idลบ ซึ่งจะ publish งานลง queuedelete_audience
ส่งออกข้อมูล
GET /api/audiences/:id/exportส่งออกรายชื่อสมาชิกเป็น CSV โดย stream ตรงลง responseGET /api/audiences/:id/export-detailส่งออกพร้อมรายละเอียดของสมาชิก หากส่งออกไม่ได้จะตอบ errorAUD_004และหากไม่พบสมาชิกจะตอบAUD_005
Auto-refresh
PATCH /api/audiences/:id/auto-refreshเปิดหรือปิด auto-refresh เป็นราย audience ทั้งนี้แพ็กเกจขององค์กรต้องมีสิทธิ์autoRefreshด้วย- cron ชื่อ
AudienceRefreshSchedulerทำงานทุกนาทีตาม schedule* * * * *โดยใช้ Redis lock ป้องกันไม่ให้หลาย replica ทำงานซ้อนกัน เมื่อพบ audience ที่ครบกำหนดจะ publish ลง queueaudience_refresh POST /api/audiences/:id/refreshสั่ง refresh ทันทีแบบ manual โดยไม่ต้องรอรอบ cron
ติดตามการเปลี่ยนแปลงสมาชิก
GET /api/audiences/:id/member-logsดูประวัติการเข้าออกของสมาชิกจากตารางaudience_member_log- การเข้าออกของสมาชิกยัง publish เป็น event ลง queue
audience_membership_triggerเพื่อให้ Trigger Rule นำไปสั่งงานต่อได้
ไฟล์และฟังก์ชันหลัก
โค้ดหลักอยู่ที่ internal/modules/audience/ ประกอบด้วย controller.go, service.go,
scheduler.go, helpers.go, types.go และ dto.go
โดย register บน group authed.Group("/audiences") พร้อม modulegate.ModuleGate(d, "audiences")
| Method | Route | Handler | Policy (metadata) |
|---|---|---|---|
| GET | /api/audiences | svc.getListHandler | readAll audiences |
| GET | /api/audiences/:id | svc.getByIDHandler | read audiences |
| GET | /api/audiences/:id/member | svc.getMemberByAudienceIDHandler | read audiences |
| GET | /api/audiences/:id/member-logs | svc.getMemberLogsHandler | read audiences |
| GET | /api/audiences/:id/export | svc.getExportReportAllFriendHandler | export audiences |
| GET | /api/audiences/:id/export-detail | svc.exportMembersDetailHandler | export audiences |
| POST | /api/audiences | svc.createHandler | create audiences |
| PUT | /api/audiences/:id | svc.updateHandler | update audiences |
| PATCH | /api/audiences/:id/auto-refresh | svc.updateAutoRefreshHandler | update audiences |
| POST | /api/audiences/:id/refresh | svc.triggerManualRefreshHandler | update audiences |
| DELETE | /api/audiences/:id | svc.deleteByIDHandler | delete audiences |
Scheduler ลงทะเบียนผ่าน audience.RegisterScheduler(d) ซึ่งเรียก
d.Scheduler.Register("* * * * *", "AudienceRefreshScheduler", s.handleAudienceRefresh)
โดยถูกเรียกทั้งใน RegisterRoutes และใน cmd/api/modules.go ที่ฟังก์ชัน registerSchedulers
จุดเชื่อมต่อกับ Service อื่น
- สิทธิ์การเข้าถึง — ต้องผ่าน
ModuleGate("audiences")โดยPolicyModuleAudiencesเป็น metadata - ตารางที่เกี่ยวข้อง —
audience,audience_member_log,line_user,line_oa,api_client,organization - RabbitMQ — queue
create_audience,update_audience,delete_audience,audience_refreshและaudience_membership_trigger - Redis — ใช้เป็น lock ของ cron refresh เพื่อกันการทำงานซ้อนกันระหว่าง replica
- Storage และ CSV Engine — ไฟล์รายชื่อสมาชิกถูกเก็บบน MinIO หรือ S3 และอ่านกลับผ่าน CSV Engine
- Cross-module —
planlimitsสำหรับโควตาmaxSegmentsและสิทธิ์autoRefreshรวมถึงโมดูลapiclient - รหัสข้อผิดพลาด —
AUD_001ชื่อซ้ำ,AUD_002ไม่ใช่ audience,AUD_003CSV ไม่ถูกต้อง,AUD_004ส่งออกไม่ได้ และAUD_005ไม่พบ LINE user - โมดูลที่เกี่ยวข้อง — Audience Filter (ตัวสร้าง audience จากเงื่อนไข), Campaign Management, Rich Menu และ Trigger Rule