Skip to main content

ฐานข้อมูลลูกค้าจาก CSV (Customer Database)

ภาพรวม

Customer Database เปิดให้ลูกค้าอัปโหลดข้อมูลลูกค้าของตัวเองในรูปแบบ CSV เข้ามาเก็บเป็น ตารางอ้างอิงแยกต่างหาก ในระบบ ข้อมูลชุดนี้ถูกนำไปใช้สองทางหลัก คือใช้เป็นแหล่งข้อมูล สำหรับ profile mapping ตอนผู้ใช้กรอกฟอร์ม และใช้เทียบข้อมูลลูกค้าเดิมกับเพื่อน LINE ที่มีอยู่

มีสองประเด็นทางเทคนิคที่ควรทราบ:

  • การ parse CSV เลียนแบบ papaparse ของ JavaScript อย่างเคร่งครัด รวมถึงพฤติกรรมเฉพาะตัว เช่น CSV ที่มีคอลัมน์เดียวจะได้ error UndetectableDelimiter และเมื่อเกิด error ผลลัพธ์ rows จะกลายเป็น array ว่าง
  • Soft delete ของโมดูลนี้เป็นแบบ status-based คือตั้งค่า status = 'delete' ไม่ได้ใช้คอลัมน์ deleted_date เหมือนโมดูลอื่น

Business Flow

  1. ดูตัวอย่างก่อนPOST /api/customer-database/preview รับไฟล์แบบ multipart/form-data ระบบ parse หัวคอลัมน์และแถวตัวอย่างกลับไปให้ผู้ใช้ตรวจความถูกต้อง หาก CSV มีคอลัมน์เดียวจะได้ error UndetectableDelimiter ตามพฤติกรรมเดิมของ papaparse
  2. สร้างฐานข้อมูลจริงPOST /api/customer-database บันทึก metadata ลงตาราง customer_database แล้วแทรกแถวข้อมูลลง customer_database_row แบบ bulk ครั้งละ 1,000 แถวภายใน transaction เดียว
  3. ดูรายการGET /api/customer-database คืนรายการแบบแบ่งหน้า scope ตาม lineOaId และตัดแถวที่ status = 'delete' ออก พร้อมแสดงว่าฐานข้อมูลนี้ถูกฟอร์มใดใช้อยู่ ซึ่งหาได้จาก raw query บนคอลัมน์ JSON profile_mapping ->> 'databaseId' ของตาราง form_builder
  4. ดูรายละเอียดGET /api/customer-database/:id คืนทั้ง metadata และข้อมูลในตาราง
  5. แก้ไขPUT /api/customer-database/:id รับ form-data และ แทนที่แถวข้อมูลทั้งหมด ภายใน transaction เดียว
  6. ลบDELETE /api/customer-database/:id เปลี่ยนค่า status เป็น delete
  7. เมื่อผู้ใช้ปลายทางกรอกฟอร์มที่ผูกกับฐานข้อมูลนี้ ฝั่ง client-api จะค้นแถวที่ตรงกัน มาเติมข้อมูลอัตโนมัติหรือใช้ตรวจสอบสิทธิ์

ไฟล์และฟังก์ชันหลัก

โค้ดอยู่ที่ internal/modules/customerdatabase/

ไฟล์บทบาท
controller.goลงทะเบียน route
service.gologic หลัก ได้แก่ _getOwnedDatabase, _getMappedFormsMap และการ create/update ใน transaction
papaparse.go, papaparse_config.goตัว parse CSV ที่เลียนแบบ papaparse
orderedmap.go, orderedrow.goรักษาลำดับคอลัมน์ให้ JSON output ตรงกับระบบเดิม
dto.goนิยาม DTO
MethodRouteHandlerPolicy
GET/api/customer-databasect.findAllreadAll customer-database
GET/api/customer-database/:idct.findOneread customer-database
POST/api/customer-databasect.createcreate customer-database
POST/api/customer-database/previewct.previewCsvcreate customer-database
PUT/api/customer-database/:idct.updateupdate customer-database
DELETE/api/customer-database/:idct.removedelete customer-database

ทุก route ครอบด้วย modulegate.ModuleGate(d, "customer-database")

จุดเชื่อมต่อกับ Service อื่น

  • Permission — ต้องผ่าน ModuleGate("customer-database") ซึ่งหมายความว่าองค์กรต้องเปิดใช้ โมดูลนี้ก่อน และมี PolicyModuleCustomerDatabase เป็น metadata
  • ตารางที่เกี่ยวข้องcustomer_database, customer_database_row, form_builder (สำหรับ mapping) และ line_oa
  • Storage — เก็บไฟล์ CSV ต้นฉบับไว้บน object storage
  • CLS — ใช้ lineOaId จาก context ในการ scope ทุก query
  • โมดูลที่เกี่ยวข้อง — Form Builder ในฐานะผู้ใช้ข้อมูล และ Import Mapping ซึ่งเป็นการนำเข้าอีกรูปแบบที่ map ข้อมูลเข้าตาราง line_user โดยตรง