ทะเบียน 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
apiclient.RegisterRoutesถูกเรียกจากcmd/api/modules.goตามสัญญาเดียวกับโมดูลอื่นทุกตัว แต่ตัว body ว่างเปล่าโดยเจตนา และมีคอมเมนต์กำกับไว้ว่าIntentionally empty — ApiClientModule has controllers: []- โมดูลที่ต้องใช้งานจะสร้าง service ขึ้นเองด้วย
apiclient.NewService(deps) - service เปิดวิธี query แบบยืดหยุ่น โดยผู้เรียกส่ง GORM query-scope callback เข้ามา
เพื่อทดแทน
FindManyOptionsและFindOneOptionsของ TypeORM ทำให้ยังกำหนดเงื่อนไข where และ relations ได้แบบเดิม - soft delete ถูกจัดการอัตโนมัติ เพราะ entity ประกาศ
gorm.DeletedAtGORM จึงเติมเงื่อนไขdeleted_date IS NULLให้เอง ซึ่งตรงกับ@DeleteDateColumnของ TypeORM ที่ไม่ได้ตั้งselect:false - audience service นำผลลัพธ์ที่ได้ไปประกอบการ resolve แหล่งข้อมูลและสิทธิ์ของ audience นั้น
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/apiclient/
| ไฟล์ | บทบาท |
|---|---|
controller.go | RegisterRoutes(_, _, _) เป็น no-op โดยเจตนา (0 routes) |
service.go | Service ซึ่งเป็น port ของ ApiClientRepository พร้อม NewService(d) แบบ stateless |
Endpoint: ไม่มี
จุดเชื่อมต่อกับ Service อื่น
- Permission — ไม่มี route จึงไม่มี guard
- ตาราง —
api_client - ผู้บริโภค — Audience Management (audience.service ฝั่ง TypeScript inject
ApiClientRepositoryเข้าไป) - เกี่ยวข้องกับ — API Key ซึ่งเป็นโมดูลที่มี UI สำหรับจัดการจริง