Skip to main content

ชั้นเชื่อมต่อ 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

  1. โมดูล rich menu, campaign และ rich message เรียก service ตัวนี้เมื่อผู้ใช้สั่ง publish
  2. 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
  3. access token ของแต่ละ OA ถูก cache ไว้ใน Redis เพื่อไม่ต้องขอใหม่ทุกครั้ง
  4. ฟังก์ชันหลักที่โมดูลอื่นเรียกใช้
    • callCreateRichMenuOnLineOA, setRichMenuImage, deleteRichMenu
    • linkRichMenuIdToUsers, setDefaultRichMenu
    • callCreateRichMenuAliasOnLineOA, callGetRichMenuAliasOnLineOA, callUpdateRichMenuAliasOnLineOA
    • getRichMenuImage และ 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 ถูกกลืนทั้งหมด เหลือเพียงการ log
  • getRichMenuImage — log แล้วคืนค่า undefined
  • callCreateRichMenuOnLineOA, 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.goLineMessageApiService — ติดต่อ LINE API และ blob API
richmenu.goLineMessageApiRichMenuService — flow เฉพาะของ rich menu
layout.goคำนวณ layout และพื้นที่กดของ rich menu
mergetag.goแทนค่า merge tag เช่น {{name}} ในข้อความ
controller.goRegisterRoutes เป็น no-op (0 routes)

โมดูลข้างเคียง internal/modules/lineapictl/controller.go

MethodRouteHandler
GET/api/line-apigetProfile(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
  • EnvironmentLINE_ENDPOINT (ค่าเริ่มต้น https://api.line.me/v2)
  • โมดูลที่เรียกใช้ — Rich Menu, Rich Message และ Campaign Management นอกจากนี้ยังรับ tracking.TrackingTokenService เข้ามาเพื่อสร้างลิงก์ติดตาม