Skip to main content

สร้างเมนูหน้าเว็บ

ภาพรวม

Menu Builder ใช้สร้าง "หน้าเมนู" ในลักษณะ mini-site ที่เปิดจาก LINE ได้ผ่าน LIFF หรือ in-app browser เมนูแต่ละตัวมี public token ประจำตัว ทำให้ผู้ใช้ปลายทางเปิดดูได้ โดยไม่ต้องล็อกอิน

โมดูลรองรับการอัปโหลดรูปประกอบ การคัดลอกเมนูเดิมทั้งชุด และการออก token ใหม่ เมื่อลิงก์เดิมหลุดออกไปสู่บุคคลที่ไม่ควรเข้าถึง

มีจุดที่ควรทราบคือ policy metadata ของโมดูลนี้ใช้ PolicyModuleSystemModule แทนที่จะเป็นโมดูลของตัวเอง ซึ่งเป็นการรักษาพฤติกรรมให้ตรงกับ NestJS เวอร์ชันเดิม

Business Flow

ฝั่งผู้ดูแลระบบ

  1. GET /api/menu-builder ลิสต์เมนูแบบแบ่งหน้า พร้อมตัวกรองตาม QueryParamsMenuBuilderDto
  2. POST /api/menu-builder สร้างเมนูใหม่ โดยระบบจะ generate public token ให้อัตโนมัติ
  3. POST /api/menu-builder/upload-image อัปโหลดรูปประกอบเมนู พร้อมตรวจสอบว่าไฟล์เป็นรูปภาพจริง
  4. GET /api/menu-builder/:id และ PUT /api/menu-builder/:id สำหรับดูและแก้ไขโครงเมนู
  5. POST /api/menu-builder/:id/clone คัดลอกเมนูทั้งชุดพร้อมออก token ใหม่ เหมาะกับการทำ A/B testing หรือเวอร์ชันตามเทศกาล
  6. POST /api/menu-builder/:id/regenerate-token ออก token ใหม่ ทำให้ลิงก์เดิมใช้ไม่ได้ทันที
  7. DELETE /api/menu-builder/:id เป็น soft delete โดยประทับค่าลงคอลัมน์ deleted_at

ฝั่งผู้ใช้ปลายทาง

  1. ผู้ใช้เปิดลิงก์จาก LINE ระบบเรียก GET /api/menu-builder/public/:token ซึ่งไม่มี JWT guard และคืนโครงเมนูให้ client-web นำไป render
  2. ยังมีเส้นทางสาธารณะอีกชุดที่ทำงานคล้ายกันในโมดูล publicmod คือ GET /api/public/menu/:token

หมายเหตุเรื่อง soft delete: entity มีคอลัมน์ deleted_at แต่ไม่ได้ประกาศเป็น gorm.DeletedAt จึงต้องเติมเงื่อนไข deleted_at IS NULL เองในทุก read เพื่อให้ตรงกับพฤติกรรมของ TypeORM เดิม ส่วนการ soft delete จะประทับ deleted_at = now() โดยไม่ใส่ filter จึงต้องใช้ Unscoped()

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

โค้ดหลักอยู่ที่ internal/modules/menubuilder/ ประกอบด้วย controller.go, service.go และ dto.go

MethodRouteHandlerGuard / Policy
GET/api/menu-builder/public/:tokenh.findByPublicTokenpublic (ไม่มี guard)
GET/api/menu-builderh.findAllread system_module
GET/api/menu-builder/:idh.findOneread system_module
POST/api/menu-builderh.createcreate system_module
POST/api/menu-builder/:id/cloneh.clonecreate system_module
POST/api/menu-builder/:id/regenerate-tokenh.regenerateTokenupdate system_module
POST/api/menu-builder/upload-imageh.uploadImagecreate system_module
PUT/api/menu-builder/:idh.updateupdate system_module
DELETE/api/menu-builder/:idh.deletedelete system_module

route ทั้งหมดยกเว้นเส้นทางสาธารณะถูก register บน group authed.Group("/menu-builder")

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

  • สิทธิ์การเข้าถึง — route ฝั่งผู้ดูแลต้องผ่าน global JwtAuth โดยมี policy metadata เป็น PolicyModuleSystemModule ซึ่งยังไม่บังคับใช้ ส่วน route สาธารณะไม่มี guard
  • ตารางที่เกี่ยวข้องmenu_builder, line_oa
  • Storage Service — เก็บรูปประกอบเมนูที่อัปโหลด
  • โมดูลที่เกี่ยวข้อง — Public API (เส้นทางสาธารณะอีกชุด), Content Page (mini-site อีกรูปแบบ) และ Content Link