ค้นหา LINE OA จาก hash
ภาพรวม
endpoint แรกที่ client-web เรียกในทุกหน้า LIFF ทำหน้าที่แปลง hash ที่อยู่ใน URL รูปแบบ /{hash}/... ให้กลายเป็น lineLiffId เพื่อให้เว็บเรียก liff.init() ได้ พร้อมทั้งส่งข้อมูลสาธารณะของ OA ที่หน้าเว็บต้องใช้กลับไปด้วย ได้แก่ ชื่อ OA, @-id และรูปปก
endpoint นี้ถูกออกแบบมาโดยรู้ตัวว่า ไม่ต้องยืนยันตัวตน จึงคืนเฉพาะฟิลด์ที่ปลอดภัยจริง ๆ ซึ่งทุกฟิลด์เป็นข้อมูลที่ปรากฏบนหน้า LINE สาธารณะของ OA อยู่แล้ว และห้ามเพิ่ม credential ใด ๆ ลงใน response นี้
Business Flow
- รับ
:hashจาก path แล้วค้นตารางline_oaด้วยเงื่อนไขstatus NOT IN ('delete') AND deleted_date IS NULLสังเกตว่าเงื่อนไขนี้ หลวมกว่า ของliff.Serviceซึ่งบังคับstatus='active'กล่าวคือ OA ที่ inactive ยัง resolve hash ได้ แต่จะ verify token ไม่ผ่านในขั้นถัดไป - หากไม่พบแถวจะตอบ 400 พร้อม message
APP_007(parity กับErrorResponse.APP_007ของ source) - ประกอบ response ตามกติกาต่อไปนี้
lineLiffIdและformLiffIdอ่านจาก jsonbline_login_infoโดยค่าว่างหรือ key ที่ไม่มีจะกลายเป็น JSONnull(parity กับvalue || null)botBasicIdคือ@-id สาธารณะ ซึ่งหน้า thank-you ของฟอร์มต้องใช้ประกอบลิงก์https://line.me/R/ti/p/<id>สำหรับ actionoa_chatเมื่อเปิดใน external browsernameมาจากline_oa_nameใช้เป็น document title ของหน้าเว็บimageUrlได้จากการ resolveline_oa.coverซึ่งเป็น storage path ให้กลายเป็น public URL สำหรับใช้เป็น og:image โดย path ที่ว่างจะได้nullแทนที่จะเป็น URL ที่ชี้ไป bucket root, path ที่เป็น absolute URL อยู่แล้วจะถูกส่งผ่านไปตรง ๆ และหากไม่มี config ของ storage จะได้nullโดยไม่ panic
ไฟล์และฟังก์ชันหลัก
| รายการ | ค่า |
|---|---|
| Route | GET /api/line-oa/get-by-hash/:hash |
| Register | internal/lineoa/register.go → Register(r, deps) |
| Handler | internal/lineoa/handler.go → (*Handler).GetByHash |
| Service | internal/lineoa/service.go → (*Service).GetByHash, findByHash, resolveCover, emptyToNil |
| Repository | internal/lineoa/repository.go → FindByHash, FindActiveByID |
| Entity | internal/lineoa/entity.go → LineOa, LineLoginInfo |
| Response | GetByHashResponse ประกอบด้วย lineLiffId, formLiffId, botBasicId, name, imageUrl |
จุดเชื่อมต่อกับ Service อื่น
- ตาราง
line_oaโดยใช้คอลัมน์line_oa_hash,line_oa_name,bot_basic_id,coverและ jsonbline_login_info internal/storagexสำหรับเรียกGetPublicURLซึ่งอนุญาตให้เป็น nil ได้ (กรณีนั้นจะไม่ส่งรูปกลับไป)lineoa.Repositoryถูกใช้ต่อโดย การตรวจสิทธิ์ LIFF Token ผ่านFindActiveByIDและโดยโดเมน bulletin กับ loyalty ผ่านฟังก์ชันFindOaByHashของโดเมนตัวเอง- ฝั่ง client-web ที่เกี่ยวข้องคือ feature
line-oa-hash-routingซึ่งดูแลโครง URL/{hash}/...และ OG metadata ระดับ OA