Skip to main content

ซิงก์ข้อมูลไป BigQuery

ภาพรวม

หน้านี้คือหน้าตั้งค่าการเชื่อมต่อกับ Google BigQuery เพื่อ ดึงข้อมูลจาก BigQuery เข้ามาเป็นคุณสมบัติเพิ่มเติมของผู้ใช้ (custom attribute) ในระบบ

แม้ชื่อฟีเจอร์จะอ่านว่า "ซิงก์ไป BigQuery" แต่ทิศทางการไหลของข้อมูลจริงคือจาก BigQuery เข้าสู่ระบบ สังเกตได้จากผลลัพธ์ของการซิงก์ที่รายงานเป็นจำนวนผู้ใช้ที่ถูกอัปเดต และจากการแม็ปฟิลด์ที่จับคู่คอลัมน์ใน BigQuery เข้ากับคีย์คุณสมบัติของผู้ใช้

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

ประโยชน์คือทีมที่มีคลังข้อมูลลูกค้าอยู่บน BigQuery อยู่แล้ว สามารถดึงค่าสรุป เช่น ยอดใช้จ่ายสะสม ระดับสมาชิก หรือพฤติกรรมการซื้อ เข้ามาเป็นคุณสมบัติของผู้ใช้ LINE เพื่อนำไปทำกลุ่มเป้าหมายและแคมเปญต่อได้

Business Flow

การโหลดการตั้งค่า

  1. เปิดหน้า ระบบจะดึงการตั้งค่าปัจจุบันมาแสดง โดยกรณีที่ยังไม่เคยตั้งค่าถือเป็นเรื่องปกติ ระบบจึงไม่พยายามเรียกซ้ำและแสดงฟอร์มเปล่าแทน
  2. ระหว่างโหลดหน้าจอจะแสดงสถานะกำลังโหลดแทนที่ฟอร์ม
  3. ค่าเริ่มต้นสำหรับการตั้งค่าใหม่คือคอลัมน์ระบุตัวผู้ใช้ชื่อ user_id, ตารางเวลาทำงานทุกวันเวลา 06:00 น., สถานะปิดใช้งาน และยังไม่มีการแม็ปฟิลด์ใด
  4. เมื่อโหลดการตั้งค่าเดิมได้ ระบบจะเติมค่าลงฟอร์มพร้อม ถอดคำนำหน้า custom. ออกจากคีย์คุณสมบัติ เพราะหน้าจอแสดงคำนำหน้านี้เป็นส่วนประกอบตายตัวของช่องกรอกอยู่แล้ว

การกรอกฟอร์ม

ฟอร์มแบ่งเป็น 4 การ์ด

  1. การเชื่อมต่อ — ระบุรหัสโปรเจกต์ GCP (บังคับ), ชื่อตารางสรุปที่จะอ่าน (บังคับ), คอลัมน์ที่เป็น LINE user ID (ถ้าเว้นว่างระบบจะใช้ค่าเริ่มต้น) และข้อมูลรับรอง service account แบบ JSON โดยมีปุ่ม ทดสอบการเชื่อมต่อ ที่ส่งเฉพาะข้อมูลการเชื่อมต่อไปตรวจ และแยกผลลัพธ์เป็น 3 ทาง คือเชื่อมต่อสำเร็จ, เซิร์ฟเวอร์ตอบกลับแต่เชื่อมต่อไม่ได้ (แสดงเหตุผลจากเซิร์ฟเวอร์) และคำขอล้มเหลว
  2. ตารางเวลา — กำหนดเวลาทำงานอัตโนมัติเป็น cron expression และเปิด/ปิดการทำงานตามตารางด้วยสวิตช์ โดยหน้าเว็บไม่ได้ตรวจรูปแบบ cron ให้
  3. การแม็ปฟิลด์ — เป็นรายการที่เพิ่มลบแถวได้ แต่ละแถวมี 4 ช่องที่บังคับกรอกทั้งหมด ได้แก่ ชื่อคอลัมน์ใน BigQuery, คีย์คุณสมบัติปลายทาง (ช่องกรอกมีคำนำหน้า custom. ติดอยู่ ผู้ใช้กรอกเฉพาะส่วนหลัง), ชนิดข้อมูล (ข้อความ / ตัวเลข / วันที่ / ค่าตรรกะ) และชื่อที่ใช้แสดงผล
  4. สถานะรอบล่าสุด — ปรากฏเฉพาะเมื่อบันทึกการตั้งค่าไว้แล้ว แสดงเวลาที่ซิงก์ล่าสุดและผลลัพธ์เป็นป้ายกำกับ ได้แก่ จำนวนผู้ใช้ที่ถูกอัปเดต, จำนวนข้อผิดพลาด (แสดงเมื่อมากกว่าศูนย์) และระยะเวลาที่ใช้ หากยังไม่เคยซิงก์จะแสดงข้อความแจ้งแทน พร้อมปุ่ม ซิงก์ทันที

การบันทึก

  1. ปุ่มบันทึกเปลี่ยนข้อความตามสถานการณ์ระหว่าง "สร้าง" กับ "อัปเดต" เมื่อกดจะตรวจความถูกต้องของฟอร์มก่อน
  2. ก่อนส่ง ระบบจะประกอบข้อมูลใหม่ โดยใส่ค่าเริ่มต้นให้คอลัมน์ระบุตัวผู้ใช้หากเว้นว่าง และ เติมคำนำหน้า custom. กลับเข้าไปในคีย์คุณสมบัติทุกแถว โดยเขียนให้ปลอดภัยต่อกรณีที่ผู้ใช้พิมพ์คำนำหน้ามาเองแล้ว
  3. หากยังไม่มีการตั้งค่าเดิมจะเป็นการสร้างใหม่ ถ้ามีแล้วจะเป็นการแก้ไข ทั้งสองทางเมื่อสำเร็จจะแจ้งผลและโหลดข้อมูลใหม่ ส่วนกรณีผิดพลาดจะแสดงข้อความจากเซิร์ฟเวอร์
  4. เมื่อออกจากหน้า ระบบจะล้างสถานะกำลังโหลดเสมอเพื่อไม่ให้ค้างข้ามหน้า

การสั่งซิงก์ทันที

  1. ระบบตรวจก่อนว่ามีการตั้งค่าที่บันทึกแล้วหรือไม่ ถ้ายังไม่มีจะแจ้งเตือนให้บันทึกก่อน
  2. เมื่อสั่งสำเร็จ หน้าจอจะแจ้งว่าเริ่มงานแล้วและโหลดข้อมูลใหม่เพื่อดูเวลาและผลลัพธ์รอบล่าสุด
  3. การซิงก์จริงทำงานเบื้องหลังแบบไม่พร้อมกัน การโหลดข้อมูลใหม่ทันทีอาจยังเห็นค่าเดิม เพราะหน้าจอไม่ได้ติดตามความคืบหน้าต่อเนื่อง ผู้ใช้จึงต้องรีเฟรชหน้าอีกครั้งเพื่อดูผลลัพธ์

หน้าจอและองค์ประกอบหลัก

หน้าเพจ (src/app/bigquery-sync/page.tsx) — ตั้ง breadcrumb สองชั้นใต้เมนูการตั้งค่า และเรนเดอร์ตัวควบคุมของฟอร์ม

ตัวควบคุม (src/components/bigquery-sync/bigquery-sync-form.container.tsx) — รวมตรรกะทั้งหมด ทั้งการโหลดการตั้งค่า การสร้างและแก้ไข การทดสอบการเชื่อมต่อ การสั่งซิงก์ และการแปลงคำนำหน้าคีย์คุณสมบัติทั้งขาเข้าและขาออก

ตัวฟอร์ม (src/components/bigquery-sync/bigquery-sync-form.tsx) — จัดวางการ์ดทั้ง 4 ใบ รายการแม็ปฟิลด์แบบเพิ่มลบแถวได้ และการแสดงสถานะรอบล่าสุด

เซอร์วิสกลาง (src/services/bigquery-sync.service.ts) — ครอบคลุมการอ่านการตั้งค่า, สร้าง, แก้ไข, ทดสอบการเชื่อมต่อ, สั่งซิงก์ และอ่านสถานะการซิงก์ โดยฟังก์ชันอ่านสถานะยังไม่ถูกใช้ในหน้าจอ เพราะหน้าจออ่านสถานะรอบล่าสุดจากข้อมูลการตั้งค่าโดยตรง

โครงสร้างข้อมูล — การตั้งค่าหนึ่งชุดประกอบด้วย 4 ส่วน คือข้อมูลการเชื่อมต่อ, ตารางเวลา, รายการแม็ปฟิลด์ และผลลัพธ์รอบล่าสุด โดยการแม็ปฟิลด์หนึ่งแถวเก็บชื่อคอลัมน์ต้นทาง, คีย์ปลายทาง, ชนิดข้อมูล และชื่อที่ใช้แสดง

จุดเชื่อมต่อกับฟีเจอร์อื่น

  • สิทธิ์การเข้าถึง — มี subject bigquery-sync ประกาศไว้และปลดล็อกด้วยโมดูลระบบฝั่งหลังบ้าน แต่ในทางปฏิบัติหน้านี้ไม่ได้ตรวจสิทธิ์ ทั้งที่ตัวหน้าเพจและที่การแสดงเมนูย่อย
  • ระบบภายนอก Google BigQuery — ต้องมีโปรเจกต์ GCP, ตารางสรุป, คอลัมน์ที่เป็น LINE user ID และข้อมูลรับรอง service account การเชื่อมต่อจริงและการทำงานตามตารางเวลาทำที่ฝั่งเซิร์ฟเวอร์และ worker ทั้งหมด หน้าเว็บเพียงเก็บค่าและสั่งงาน
  • ตั้งค่าคุณสมบัติผู้ใช้ (Attribute Setup) — คีย์ที่แม็ปมาอยู่ใน namespace custom. เดียวกับคุณสมบัติเพิ่มเติมของผู้ใช้ในระบบ ทำให้ข้อมูลจาก BigQuery ถูกนำไปใช้ทำกลุ่มเป้าหมายและ segment ต่อได้ทันที
  • การจัดการสถานะและ UI — หน้านี้ต่างจากหน้าอื่นของ CMS ตรงที่ใช้ข้อความแจ้งเตือนแบบสั้นทั้งหมด ไม่ใช้หน้าต่างยืนยันหรือหน้าต่างผลลัพธ์ ไม่มีส่วนหัวหน้ามาตรฐาน และไม่มีการตรวจรูปแบบ cron หรือ JSON ที่ฝั่งหน้าเว็บ

รายละเอียดฝั่ง Backend (CMS API)

โมดูลนี้อยู่ที่ internal/modules/bigquerysync/ ลงทะเบียนใต้กลุ่ม /api/bigquery-sync-config โดยตัวเชื่อมต่อ BigQuery จริงอยู่ที่แพ็กเกจ internal/bigqueryx

ข้อสังเกตด้านความปลอดภัยที่สำคัญที่สุดของหน้านี้

  • ทุก endpoint ของโมดูลนี้อยู่บนกลุ่มสาธารณะและตรวจด้วย token ระดับ "ล็อกอินแล้ว" เท่านั้น ไม่มีการตรวจ policy ใด ๆ และไม่มี ModuleGate ยกโครงมาจากระบบเดิมที่ไม่ได้ใส่การตรวจสิทธิ์ไว้
  • ผลในทางปฏิบัติคือ ใครก็ตามที่ล็อกอินเข้าระบบได้ ก็เรียก endpoint เหล่านี้ได้ ไม่ว่าจะมีสิทธิ์อะไรอยู่ ซึ่งสอดคล้องกับที่หน้าเว็บเองก็ไม่ได้ตรวจสิทธิ์ทั้งที่ตัวหน้าและที่เมนูย่อย
  • เรื่องนี้มีน้ำหนักเป็นพิเศษเพราะโมดูลนี้เก็บ ข้อมูลรับรอง service account ของ Google Cloud และมีปุ่มสั่งซิงก์ข้อมูลผู้ใช้ออกไปยังปลายทางที่ผู้เรียกกำหนดเองได้ จึงควรถือเป็นรายการที่ต้องจัดการก่อนเมื่อจะเปิดบังคับใช้สิทธิ์จริง
  • ขอบเขตข้อมูลยังคงอ่านจาก context ของ request (lineOaId, organizationId) ดังนั้นผู้ใช้ยังเห็นเฉพาะการตั้งค่าของ OA ที่ตนกำลังทำงานอยู่

สิ่งที่แต่ละ endpoint ทำจริง

  • GET /api/bigquery-sync-config — อ่านการตั้งค่าปัจจุบันของ OA
  • POST /api/bigquery-sync-config/test-connection — ลองเชื่อมต่อ BigQuery ด้วยข้อมูลรับรองที่กรอกมา โดยยังไม่บันทึกลงฐานข้อมูล แล้วคืนผลว่าสำเร็จหรือไม่พร้อมข้อความอธิบาย จุดประสงค์คือให้รู้ก่อนกดบันทึกว่าตั้งค่าถูกหรือเปล่า
  • POST /api/bigquery-sync-config — บันทึกการตั้งค่า ประกอบด้วยรหัสโปรเจกต์, dataset, ข้อมูลรับรอง, ตารางที่จะซิงก์ และตารางเวลา
  • PUT /api/bigquery-sync-config/:id — แก้ไขการตั้งค่าเดิม
  • POST /api/bigquery-sync-config/:id/sync-now — สั่งซิงก์ทันที คืนผลว่าสำเร็จหรือไม่พร้อมข้อความ
  • GET /api/bigquery-sync-config/:id/sync-status — อ่านผลรอบล่าสุด คืนเวลาที่ซิงก์ครั้งสุดท้าย (อาจเป็นค่าว่างถ้ายังไม่เคยซิงก์) และผลลัพธ์รอบล่าสุดในรูป JSON ดิบตามที่บันทึกไว้ ไม่ได้แปลงเป็นโครงสร้างมาตรฐาน ฝั่งหน้าจอจึงต้องเผื่อรูปข้อมูลที่หลากหลาย

ข้อควรรู้เกี่ยวกับการเชื่อมต่อ

  • ระบบไม่ได้เชื่อมต่อ BigQuery ตอนเริ่มบริการ แต่สร้างตัวเชื่อมต่อเปล่าไว้แล้วจึงเชื่อมจริงเมื่อมีการเรียกใช้ ผลคือการตั้งค่าที่ผิดจะไม่ทำให้บริการเริ่มไม่ขึ้น แต่จะไปแสดงตัวตอนกดทดสอบการเชื่อมต่อหรือตอนถึงรอบซิงก์แทน
  • การซิงก์ตามตารางเวลาไม่ได้ทำงานในบริการนี้ แต่ทำที่ฝั่ง worker CMS API มีหน้าที่เก็บการตั้งค่าและสั่งงานเท่านั้น สถานะที่หน้าจออ่านจึงเป็นสิ่งที่ worker เขียนกลับมา
  • ไม่มีการตรวจรูปแบบ cron หรือรูปแบบ JSON ของข้อมูลรับรองที่ฝั่งหน้าเว็บ และฝั่งนี้ก็ไม่ได้ประกาศ policy ตรวจอะไรเพิ่ม ค่าที่ผิดรูปจึงจะไปพังตอนรันจริง ไม่ใช่ตอนบันทึก

ตารางที่เกี่ยวข้อง

bigquery_sync_config และ line_oa