ซิงก์ข้อมูลไป BigQuery
ภาพรวม
ลูกค้าองค์กรที่มี data warehouse ของตัวเองมักต้องการดึงข้อมูลจากระบบนี้ไปวิเคราะห์ต่อ โมดูลนี้จึงเปิดให้ตั้งค่าการซิงก์ข้อมูลไปยัง Google BigQuery แยกตาม LINE OA ครอบคลุมทั้งการตั้ง credential, ทดสอบการเชื่อมต่อ, ตรวจสอบสถานะรอบซิงก์ล่าสุด และสั่งซิงก์ทันที
ทุก route ของโมดูลนี้อยู่บน group public คู่กับ JwtLoginAuth และ ไม่มี policy annotation เลย ซึ่งเป็นพฤติกรรมที่ยกมาตรงจากระบบ NestJS เดิมที่ไม่ได้ใส่ @CheckPolicies
Business Flow
- อ่าน config ปัจจุบัน —
GET /api/bigquery-sync-configคืนการตั้งค่าที่ผูกกับ LINE OA ปัจจุบัน - ทดสอบก่อนบันทึก —
POST /api/bigquery-sync-config/test-connectionพร้อมTestConnectionDtoจะลองเชื่อมต่อ BigQuery ด้วย credential ที่กรอกมา แล้วคืนผลในรูปsuccessและmessageเพื่อให้ผู้ใช้ทราบก่อนบันทึกว่าตั้งค่าถูกต้องหรือไม่ - บันทึก config —
POST /api/bigquery-sync-configพร้อมCreateBigquerySyncConfigDtoซึ่งระบุ project id, dataset, credential, ตารางที่ต้องการซิงก์ และตารางเวลา - แก้ไข config —
PUT /api/bigquery-sync-config/:id - สั่งซิงก์ทันที —
POST /api/bigquery-sync-config/:id/sync-nowคืนผลในรูปsuccessและmessage - ตรวจสอบผลรอบล่าสุด —
GET /api/bigquery-sync-config/:id/sync-statusคืนlastSyncAtซึ่งเป็น timestamp ที่เป็น null ได้ และlastSyncResultซึ่งเป็น JSON ดิบที่บันทึกไว้จากรอบล่าสุด - แสดงผลบนหน้าเว็บ — cms-web จะ poll endpoint สถานะนี้เพื่อแสดงความคืบหน้าและข้อผิดพลาดของการซิงก์
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/bigquerysync/ ประกอบด้วย controller.go, service.go และ dto.go ส่วน client ของ BigQuery อยู่ที่ internal/bigqueryx/bigqueryx.go และเข้าถึงผ่าน Deps.BigQuery
| Method | Route | Handler | Guard |
|---|---|---|---|
| GET | /api/bigquery-sync-config | ct.getConfig | JwtLoginAuth (group public) |
| POST | /api/bigquery-sync-config | ct.create | JwtLoginAuth |
| POST | /api/bigquery-sync-config/test-connection | ct.testConnection | JwtLoginAuth |
| PUT | /api/bigquery-sync-config/:id | ct.update | JwtLoginAuth |
| POST | /api/bigquery-sync-config/:id/sync-now | ct.syncNow | JwtLoginAuth |
| GET | /api/bigquery-sync-config/:id/sync-status | ct.getSyncStatus | JwtLoginAuth |
โครงสร้าง 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 ซึ่งเป็นข้อมูลต้นทางที่ถูกซิงก์ และ รายการเพื่อนทั้งหมด