Skip to main content

ทะเบียน API Client (Provider-only)

ภาพรวม

ตาราง api_client ทำหน้าที่บันทึกว่าระบบภายนอกรายใดเชื่อมต่อเข้ามาในระบบ ใช้งานคู่กับ API Key ซึ่งเป็นส่วนที่มีหน้าจอจัดการจริง

โมดูลนี้ในฝั่ง cms-api ไม่เปิด HTTP route ใด ๆ เลย เนื่องจาก NestJS ต้นทางประกาศ controllers: [] สิ่งที่โมดูลนี้ให้คือ ApiClientRepository ที่ export ออกไปให้โมดูลอื่นเรียกใช้

ผู้ใช้งานจริงคือโมดูล Audience Management ซึ่งต้อง resolve ว่า client รายใดเป็นเจ้าของข้อมูล เมื่อสร้าง audience จากแหล่งข้อมูลภายนอก

เอกสารนี้แยกออกมาเป็น feature ของตัวเอง เพื่อไม่ให้ผู้อ่านสับสนเมื่อเห็นชื่อโมดูลใน cmd/api/modules.go แล้วหา route ไม่พบ

Business Flow

  1. apiclient.RegisterRoutes ถูกเรียกจาก cmd/api/modules.go ตามสัญญาเดียวกับโมดูลอื่นทุกตัว แต่ตัว body ว่างเปล่าโดยเจตนา และมีคอมเมนต์กำกับไว้ว่า Intentionally empty — ApiClientModule has controllers: []
  2. โมดูลที่ต้องใช้งานจะสร้าง service ขึ้นเองด้วย apiclient.NewService(deps)
  3. service เปิดวิธี query แบบยืดหยุ่น โดยผู้เรียกส่ง GORM query-scope callback เข้ามา เพื่อทดแทน FindManyOptions และ FindOneOptions ของ TypeORM ทำให้ยังกำหนดเงื่อนไข where และ relations ได้แบบเดิม
  4. soft delete ถูกจัดการอัตโนมัติ เพราะ entity ประกาศ gorm.DeletedAt GORM จึงเติมเงื่อนไข deleted_date IS NULL ให้เอง ซึ่งตรงกับ @DeleteDateColumn ของ TypeORM ที่ไม่ได้ตั้ง select:false
  5. audience service นำผลลัพธ์ที่ได้ไปประกอบการ resolve แหล่งข้อมูลและสิทธิ์ของ audience นั้น

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

โค้ดอยู่ที่ internal/modules/apiclient/

ไฟล์บทบาท
controller.goRegisterRoutes(_, _, _) เป็น no-op โดยเจตนา (0 routes)
service.goService ซึ่งเป็น port ของ ApiClientRepository พร้อม NewService(d) แบบ stateless

Endpoint: ไม่มี

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

  • Permission — ไม่มี route จึงไม่มี guard
  • ตารางapi_client
  • ผู้บริโภค — Audience Management (audience.service ฝั่ง TypeScript inject ApiClientRepository เข้าไป)
  • เกี่ยวข้องกับ — API Key ซึ่งเป็นโมดูลที่มี UI สำหรับจัดการจริง