ชั้นเชื่อมต่อ LINE Messaging API
ภาพรวม
โมดูลนี้เป็น ชั้นห่อ (wrapper) ของ LINE Messaging API ที่โมดูลอื่นเรียกใช้เมื่อต้องสื่อสารกับ LINE จริง ครอบคลุมงานสร้างและอัปโหลดรูป rich menu, ผูก rich menu เข้ากับผู้ใช้, ตั้ง default rich menu, ตรวจสอบความถูกต้องของ Flex Message, จัดการ rich menu alias รวมถึงการขอและตรวจสอบ access token
โมดูลนี้ ไม่มี HTTP route ของตัวเอง เนื่องจาก controller ในโค้ด NestJS ต้นทางถูก comment ทิ้งไว้ทั้งหมด
RegisterRoutes จึงเป็น no-op โดยเจตนา และมีคอมเมนต์กำกับไว้ใน cmd/api/modules.go ว่ามี 0 routes
มีโมดูลขนาดเล็กที่เกี่ยวข้องคือ lineapictl ซึ่งเปิด GET /api/line-api สำหรับคืน mock profile
โดยเป็น endpoint สำหรับทดสอบเท่านั้น ไม่ใช่ flow ทางธุรกิจ
Business Flow
- โมดูล rich menu, campaign และ rich message เรียก service ตัวนี้เมื่อผู้ใช้สั่ง publish
- service ติดต่อ LINE ผ่าน สองช่องทางที่ใช้ base URL ต่างกัน (คงไว้ตามโค้ด TypeScript เดิม)
- เรียก axios ตรงไปยัง
LINE_ENDPOINT(ค่าเริ่มต้นhttps://api.line.me/v2) สำหรับ/oauth/accessTokenและ/oauth/verify - เรียกผ่าน LINE bot SDK v9 ซึ่งใช้ base URL คงที่คือ
https://api.line.meสำหรับ API และhttps://api-data.line.meสำหรับ blob
- เรียก axios ตรงไปยัง
- access token ของแต่ละ OA ถูก cache ไว้ใน Redis เพื่อไม่ต้องขอใหม่ทุกครั้ง
- ฟังก์ชันหลักที่โมดูลอื่นเรียกใช้
callCreateRichMenuOnLineOA,setRichMenuImage,deleteRichMenulinkRichMenuIdToUsers,setDefaultRichMenucallCreateRichMenuAliasOnLineOA,callGetRichMenuAliasOnLineOA,callUpdateRichMenuAliasOnLineOAgetRichMenuImageและvalidateJsonFlexMessage- helper สำหรับแปลง layout และ merge tag ใน
layout.go,mergetag.goและrichmenu.go
พฤติกรรมการจัดการ error ที่คงไว้ตามโค้ดเดิม
จุดเหล่านี้สำคัญมากเวลา debug เพราะบาง error ถูกกลืนหายไปโดยตั้งใจ
linkRichMenuIdToUsers— catch แล้วเรียกJSON.parse(error.body)ถ้า body เป็น JSON error จะหายไปเงียบ ๆ แต่ถ้า body ไม่ใช่ JSON จะเกิด error ตัวใหม่ขึ้นมาแทนsetDefaultRichMenu— error ถูกกลืนทั้งหมด เหลือเพียงการ loggetRichMenuImage— log แล้วคืนค่า undefinedcallCreateRichMenuOnLineOA,setRichMenuImage,deleteRichMenuและ alias get/update — error ทะลุขึ้นไปตามปกติcallCreateRichMenuAliasOnLineOA— log แล้ว rethrow
ไฟล์และฟังก์ชันหลัก
โค้ดหลักอยู่ที่ internal/modules/linemessageapi/ ประกอบด้วย service.go, controller.go,
richmenu.go, layout.go, mergetag.go, types.go, enums.go, util.go และ jsutil.go
| ไฟล์ | บทบาท |
|---|---|
service.go | LineMessageApiService — ติดต่อ LINE API และ blob API |
richmenu.go | LineMessageApiRichMenuService — flow เฉพาะของ rich menu |
layout.go | คำนวณ layout และพื้นที่กดของ rich menu |
mergetag.go | แทนค่า merge tag เช่น {{name}} ในข้อความ |
controller.go | RegisterRoutes เป็น no-op (0 routes) |
โมดูลข้างเคียง internal/modules/lineapictl/controller.go
| Method | Route | Handler |
|---|---|---|
| GET | /api/line-api | getProfile(c, d) — คืน mock profile, เป็น public |
โครงสร้าง external client อยู่ที่ internal/externals/lineapi/lineapi.go
โดย lineapi.Service ถูก inject เข้ามาผ่าน Deps.LineAPI
จุดเชื่อมต่อกับ Service อื่น
- Permission — ไม่มี route จึงไม่มี guard ยกเว้น
/api/line-apiที่เป็น public mock - ตาราง — อ่าน
line_oaเพื่อดึงchannel_access_token - Redis — cache access token แยกตาม OA
- Environment —
LINE_ENDPOINT(ค่าเริ่มต้นhttps://api.line.me/v2) - โมดูลที่เรียกใช้ — Rich Menu, Rich Message และ Campaign Management
นอกจากนี้ยังรับ
tracking.TrackingTokenServiceเข้ามาเพื่อสร้างลิงก์ติดตาม