Skip to main content

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

ภาพรวม

ลูกค้าองค์กรที่มี data warehouse ของตัวเองมักต้องการดึงข้อมูลจากระบบนี้ไปวิเคราะห์ต่อ โมดูลนี้จึงเปิดให้ตั้งค่าการซิงก์ข้อมูลไปยัง Google BigQuery แยกตาม LINE OA ครอบคลุมทั้งการตั้ง credential, ทดสอบการเชื่อมต่อ, ตรวจสอบสถานะรอบซิงก์ล่าสุด และสั่งซิงก์ทันที

ทุก route ของโมดูลนี้อยู่บน group public คู่กับ JwtLoginAuth และ ไม่มี policy annotation เลย ซึ่งเป็นพฤติกรรมที่ยกมาตรงจากระบบ NestJS เดิมที่ไม่ได้ใส่ @CheckPolicies

Business Flow

  1. อ่าน config ปัจจุบันGET /api/bigquery-sync-config คืนการตั้งค่าที่ผูกกับ LINE OA ปัจจุบัน
  2. ทดสอบก่อนบันทึกPOST /api/bigquery-sync-config/test-connection พร้อม TestConnectionDto จะลองเชื่อมต่อ BigQuery ด้วย credential ที่กรอกมา แล้วคืนผลในรูป success และ message เพื่อให้ผู้ใช้ทราบก่อนบันทึกว่าตั้งค่าถูกต้องหรือไม่
  3. บันทึก configPOST /api/bigquery-sync-config พร้อม CreateBigquerySyncConfigDto ซึ่งระบุ project id, dataset, credential, ตารางที่ต้องการซิงก์ และตารางเวลา
  4. แก้ไข configPUT /api/bigquery-sync-config/:id
  5. สั่งซิงก์ทันทีPOST /api/bigquery-sync-config/:id/sync-now คืนผลในรูป success และ message
  6. ตรวจสอบผลรอบล่าสุดGET /api/bigquery-sync-config/:id/sync-status คืน lastSyncAt ซึ่งเป็น timestamp ที่เป็น null ได้ และ lastSyncResult ซึ่งเป็น JSON ดิบที่บันทึกไว้จากรอบล่าสุด
  7. แสดงผลบนหน้าเว็บ — cms-web จะ poll endpoint สถานะนี้เพื่อแสดงความคืบหน้าและข้อผิดพลาดของการซิงก์

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

โค้ดอยู่ที่ internal/modules/bigquerysync/ ประกอบด้วย controller.go, service.go และ dto.go ส่วน client ของ BigQuery อยู่ที่ internal/bigqueryx/bigqueryx.go และเข้าถึงผ่าน Deps.BigQuery

MethodRouteHandlerGuard
GET/api/bigquery-sync-configct.getConfigJwtLoginAuth (group public)
POST/api/bigquery-sync-configct.createJwtLoginAuth
POST/api/bigquery-sync-config/test-connectionct.testConnectionJwtLoginAuth
PUT/api/bigquery-sync-config/:idct.updateJwtLoginAuth
POST/api/bigquery-sync-config/:id/sync-nowct.syncNowJwtLoginAuth
GET/api/bigquery-sync-config/:id/sync-statusct.getSyncStatusJwtLoginAuth

โครงสร้าง response ที่เกี่ยวข้องคือ TestConnectionResponse (field success, message) และ SyncStatusResponse (field lastSyncAt, lastSyncResult) โดยลำดับ field ถูกจัดให้ตรงกับ object literal ของ TypeScript เดิม

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

  • สิทธิ์การเข้าถึง — ใช้ JwtLoginAuth เพียงอย่างเดียว ไม่มี policy check และไม่มี ModuleGate จุดนี้ควรระวังในการออกแบบสิทธิ์ เพราะผู้ใช้ที่ล็อกอินได้ทุกคนสามารถเรียก endpoint กลุ่มนี้ได้
  • ตารางที่เกี่ยวข้องbigquery_sync_config และ line_oa
  • บริการภายนอก — Google BigQuery ผ่าน package internal/bigqueryx ซึ่งไม่ได้เชื่อมต่อตอน boot แต่สร้าง client เปล่าไว้ก่อน
  • CLS — ใช้ lineOaId และ organizationId ในการจำกัดขอบเขตข้อมูล
  • โมดูลที่เกี่ยวข้องจัดการผู้ใช้ LINE ซึ่งเป็นข้อมูลต้นทางที่ถูกซิงก์ และ รายการเพื่อนทั้งหมด