ผูก LINE User ID กับอีเมลพนักงาน (sys-lineoa-line-binding)
ในหน้า /lineoa พนักงานผูก LINE User ID ของตนกับอีเมลที่ใช้เข้าระบบได้ ข้อมูลนี้เก็บในฐานหลักของ workspace ไม่ได้เก็บในฐานบริษัทอย่างเดียว ภาพรวมของระบบอยู่ที่ แชท LINE OA สำหรับลูกค้าและแอดมิน (sys-lineoa)
เส้นทางของคำขอ
flowchart LR
UI["LineOaChatStudio"] -->|"POST /api/lineoa BIND_LINE_EMAIL"| N["Next route"]
N -->|"X-Admin-Api-Key"| B["/api/v1/admin/workspace/line-binding"]
B --> G["bc_google_account"]
B --> U["bc_user_list"]
B --> E["erp_user ในฐานบริษัท"]
- หน้าจอส่ง
actionเป็นBIND_LINE_EMAILหรือUNBIND_LINE_EMAILพร้อมbindPayloadที่มีemail,lineUserIdและlineDisplayName(LineOaChatStudio.tsx:834-860) - Next route ใส่
actor_emailและactor_user_codeจาก session ฝั่ง server ไม่ได้รับจากเบราว์เซอร์ แล้วเรียก backend ด้วย headerX-Admin-Api-Key(route.ts:606-640) - ตอนเปิดหน้าจอ GET ของ route อ่านการผูกด้วย
GET /api/v1/admin/workspace/line-binding(route.ts:252-273)
กุญแจ admin
| ฝั่ง | ที่อ่าน | พฤติกรรม |
|---|---|---|
| Next | getAdminApiKey อ่าน env ADMIN_API_KEY (api-server.ts:70-79) |
ถ้าไม่ได้ตั้งและไม่ใช่ production จะใช้กุญแจสำหรับเครื่องพัฒนาที่กำหนดในโค้ด (ไม่คัดลอกมาที่นี่) ส่วน production คืน null |
| Go | AdminAPIKey จาก env ADMIN_API_KEY (config.go:34) |
AdminAuth เทียบ header แบบ constant-time และปฏิเสธทุกคำขอถ้าไม่ได้ตั้งค่า (adminauth.go:18-30) |
route ทั้งสองอยู่ในกลุ่ม /api/v1/admin ที่ใช้ AdminAuth (router.go:213-214, :246-247) ดู Admin API สำหรับจัดการ Provider/ผู้ใช้/ฐานข้อมูล/สิทธิ์เมนู (Admin API) · API Workspace — ล็อกอิน Google, เลือกฐานบริษัท, สมาชิก, สิทธิ์จอ, ผูก LINE (Admin workspace API)
ผูก / ยกเลิกผูก (WorkspaceBindLineAccount, workspace_google.go:1366-1481)
providerว่างจะใช้bcdemoอีเมลต้องมีเครื่องหมาย@ถ้าไม่ส่งอีเมลเป้าหมายจะใช้อีเมลผู้สั่ง (:1383-1397)- สิทธิ์: ผูกให้อีเมลตัวเอง หรือผู้สั่งเป็น admin ของฐาน ไม่เช่นนั้นตอบ 403
FORBIDDEN_LINE_BIND(:1407-1410) - การผูกต้องมี LINE User ID ไม่เช่นนั้นตอบ
MISSING_LINE_ID(:1415-1421) - ก่อนผูกใหม่ ล้าง LINE ID เดียวกันที่เคยผูกกับอีเมลอื่น เพื่อให้ 1 LINE ID ผูกได้กับ 1 อีเมล (
:1423-1427) - ยกเลิกผูกจะล้างค่าใน
bc_google_accountส่วนการผูกจะ upsert แถวตามemail(:1434-1449) - ตั้ง
bc_user_list.line_user_idตามอีเมล (:1455-1459) และถ้าส่งชื่อฐานมา จะเพิ่มคอลัมน์email,line_user_idในerp_userของฐานบริษัทถ้ายังไม่มี แล้วตั้งค่าตามอีเมล (:1460-1467) - ตอบอีเมล LINE ID และรายชื่อฐานที่อีเมลนี้เข้าได้ (
:1469-1481)
isDatabaseAdmin ถือว่าเป็น admin เมื่อ (:839-870):
- มี
roleเป็นADMINในbc_google_workspace_memberของฐานนั้น หรือเป็นowner_emailในbc_google_workspace_db - หรือ
bc_user_list.user_level≥ 9 หรือรหัสผู้ใช้ตรงกับรหัสผู้ดูแลที่กำหนดตายตัวในโค้ด (:868)
คอลัมน์ line_user_id, line_display_name, line_linked_at และ index ของ bc_google_account สร้างด้วย ensureWorkspaceTables (:36-54) ดู bc_google_account / bc_google_workspace_db / bc_google_workspace_member — ล็อกอิน Google และ Workspace · bc_user_list — ผู้ใช้ล็อกอิน (Main Database ของ Tenant) · erp_user — ผู้ใช้/พนักงานในฐานบริษัท
อ่านการผูก (WorkspaceResolveLineBinding, :1255-1364)
- รับ
provider,database,line_user_idหรือemailถ้ามี LINE ID จะหาอีเมลจากbc_google_accountก่อนแล้วจึงbc_user_listถ้ามีอีเมลจะหา LINE ID ในลำดับเดียวกัน - คืนรายชื่อฐานที่อีเมลเข้าได้ และ
staff_bindingsคือสมาชิกทุกคนของฐานนั้นพร้อม LINE ID โดยเรียง admin ขึ้นก่อน
ข้อสังเกตจากโค้ด
- ถ้า Next ไม่มีกุญแจ admin หรือเรียก backend ไม่ได้ route จะตอบ
ok: trueพร้อมข้อมูลที่ส่งมาเหมือนผูกสำเร็จ แต่ไม่มีอะไรถูกบันทึก (route.ts:657-668) - คำสั่งล้างค่าเดิม และการอัปเดต
bc_user_listกับerp_userไม่ตรวจ error และไม่อยู่ใน transaction เดียวกับการ upsert (workspace_google.go:1423-1467) - กรณี error จากฐานตอนผูก handler ส่งข้อความ error ของฐานกลับให้ผู้เรียก (
:1451)
ที่มาในโค้ด
frontend/lineoa/LineOaChatStudio.tsx:834-860handleBindStaffLineEmailfrontend/src/app/api/lineoa/route.ts:252-273อ่านการผูก,:606-668ผูกหรือยกเลิกผูกและค่าที่ตอบเมื่อเรียก backend ไม่ได้frontend/src/lib/api-server.ts:70-79getAdminApiKeybackend/internal/platform/config/config.go:34env ของกุญแจ,backend/internal/adapter/inbound/http/middleware/adminauth.go:18-30AdminAuthbackend/internal/adapter/inbound/http/router.go:213-214,:246-247routebackend/internal/adapter/inbound/http/admin/workspace_google.go:36-54DDL,:839-870isDatabaseAdmin,:1255-1364อ่าน,:1366-1481ผูก- ดูเพิ่ม: แชท LINE OA สำหรับลูกค้าและแอดมิน (sys-lineoa) · แชท AI เอกสารขายในแชท และปุ่มเปิดบิลจาก LINE OA (sys-lineoa-chat-ai) · API Workspace — ล็อกอิน Google, เลือกฐานบริษัท, สมาชิก, สิทธิ์จอ, ผูก LINE (Admin workspace API) · บทเรียนบั๊กสิทธิ์และการข้ามฐานข้อมูล (Auth Bypass, Cross-Tenant, Demo Read-Only, Screen Rights)