Skip to main content

สร้างกลุ่มเป้าหมายจากเงื่อนไข (Audience Filter)

ภาพรวม

Audience Filter คือเครื่องมือสร้างกลุ่มเป้าหมาย (audience) จาก เงื่อนไขพฤติกรรมของผู้ใช้ โดยไม่ต้องอัปโหลดรายชื่อเป็น CSV เอง ระบบจะไปดึงรายชื่อจากข้อมูลที่บันทึกไว้แล้วให้อัตโนมัติ

แหล่งข้อมูลที่ใช้เป็นเงื่อนไขได้:

แหล่งข้อมูลตัวอย่างเงื่อนไข
Campaignเปิดหรือคลิกแคมเปญใด
Rich Menuกดปุ่มใดบนเมนู
Auto Responseพิมพ์ตรงกับ keyword ใด
Form Builderตอบคำถามข้อใดด้วยค่าอะไร
Multi-sourceผสมหลายแหล่งข้อมูลเข้าด้วยกัน

จุดเด่นของโมดูลนี้คือมี preview ให้ตรวจสอบจำนวนและตัวอย่างสมาชิกก่อนกดสร้างจริง ช่วยลดความเสี่ยงที่จะสร้าง audience ผิดเงื่อนไขแล้วส่งข้อความออกไปแล้ว

Business Flow

ขั้นเตรียมตัวเลือก

  1. cms-web โหลดรายการตัวเลือกของแต่ละแหล่งข้อมูลมาแสดงเป็น dropdown ผ่าน endpoint list-dropdown-campaign, list-dropdown-richmenu, list-dropdown-auto-response และ list-dropdown-form-builder
  2. หากผู้ใช้เลือกกรองด้วยฟอร์ม ระบบเรียก GET /api/audiences-filter/form-questions/:formId เพื่อดึงคำถามในฟอร์มนั้นมาให้เลือกข้อและระบุค่าที่ต้องการ
  3. GET /api/audiences-filter/form-response ใช้ดูตัวอย่างคำตอบดิบเพื่อยืนยันรูปแบบข้อมูล

ขั้น Preview แล้วสร้าง

  1. กรองจากฟอร์ม — เรียก POST /api/audiences-filter/preview-form-filter เพื่อดูผลลัพธ์ก่อน เมื่อพอใจจึงเรียก POST /api/audiences-filter/create-form-filter เพื่อสร้างจริง
  2. กรองแบบผสมหลายแหล่ง — ใช้คู่ preview-multi-source-filter และ create-multi-source-filter ในลักษณะเดียวกัน
  3. กรองทั่วไป — เรียก POST /api/audiences-filter/create-filter พร้อม CreateAudiencesFilterDto
  4. ก่อนสร้างทุกครั้ง ระบบตรวจโควตา maxSegments ตามแพ็กเกจของลูกค้า
  5. เมื่อสร้างสำเร็จ ผลลัพธ์จะกลายเป็น audience ปกติที่โมดูล Audience Management ดูแลต่อ ทั้งการเขียนไฟล์ CSV รายชื่อสมาชิกและการตั้ง auto-refresh

เส้นทางภายในระบบ (Internal)

  1. POST /api/audiences-filter/internal/refresh เป็น endpoint สำหรับ service ภายในเรียกเท่านั้น ไม่ใช่ผู้ใช้ ป้องกันด้วย InternalApiKeyGuard ผ่าน header X-Internal-Key รับ body ที่ประกอบด้วย audienceId, lineOaId, organizationId, lineOaHash และ triggerType ใช้ในกรณีที่ worker หรือ webhook ต้องการสั่งให้คำนวณสมาชิกของ audience ที่มาจาก filter ใหม่

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

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

MethodRouteHandlerPolicy
POST/api/audiences-filter/create-filterct.createFiltercreate audiences
GET/api/audiences-filter/list-dropdown-campaignct.getListDropdownCampaignread audiences
GET/api/audiences-filter/list-dropdown-richmenuct.getListDropdownRichmenuread audiences
GET/api/audiences-filter/list-dropdown-auto-responsect.getListDropdownAutoResponseread audiences
GET/api/audiences-filter/list-dropdown-form-builderct.getListDropdownFormBuilderread audiences
GET/api/audiences-filter/form-questions/:formIdct.getFormQuestionsread audiences
GET/api/audiences-filter/form-responsect.formResponsePreviewread audiences
POST/api/audiences-filter/preview-form-filterct.previewFormSegmentread audiences
POST/api/audiences-filter/create-form-filterct.createFormFilterAudienceread audiences
POST/api/audiences-filter/preview-multi-source-filterct.previewMultiSourceFilterread audiences
POST/api/audiences-filter/create-multi-source-filterct.createMultiSourceFiltercreate audiences
POST/api/audiences-filter/internal/refreshct.internalRefreshinternalApiKeyGuard()

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

  • Permission — route ฝั่งผู้ใช้อยู่บน group authed ซึ่งบังคับ JWT ทั้งหมด และมี PolicyModuleAudiences เป็น metadata ส่วน route ภายในใช้ InternalApiKey (อ่านจาก env INTERNAL_API_KEY) แทน JWT
  • ตารางที่เกี่ยวข้องaudience, campaign, rich_menu, auto_response, form_builder, form_submission, line_user และ tracking_line_users
  • Cross-module — เรียก formbuilder.Service.GetFormById ผ่าน local interface formByIDProvider เพื่อหลีกเลี่ยง import cycle นอกจากนี้ยังพึ่งโมดูล Plan Limits และ Storage
  • Storage — เขียนไฟล์ CSV รายชื่อสมาชิกที่ได้จากการกรองลง object storage
  • โมดูลที่เกี่ยวข้อง — Audience Management, Form Builder, Campaign Management และ Rich Menu