Skip to main content

หน้าคอนเทนต์

ภาพรวม

Content Page ใช้สร้างหน้าเนื้อหา เช่น บทความ โปรโมชัน หรือหน้า landing ที่แชร์ให้ผู้ใช้ LINE เปิดดูได้ผ่านลิงก์สาธารณะ โมดูลนี้มีวงจรชีวิตแบบระบบ CMS เต็มรูปแบบ คือ draft, publish และ archive พร้อมระบบ analytics สำหรับนับยอดเข้าชม และรองรับการล็อกหน้าด้วยรหัสผ่าน

หน้าคอนเทนต์ถูกจัดระเบียบด้วย Content Category และ Content Subcategory และเผยแพร่เป็นชุดผ่าน Content Link

Business Flow

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

  1. GET /api/content-pages พร้อมพารามิเตอร์ page, limit, search และ status ลิสต์หน้าทั้งหมด โดยคืนผลลัพธ์เป็น {data, total, page, limit, totalPages}
  2. POST /api/content-pages สร้างหน้าใหม่ด้วยสถานะเริ่มต้นเป็น draft ระบบจะ generate public token ด้วย crypto.randomBytes(32) และหากมีการตั้งรหัสผ่าน จะเข้ารหัสด้วย bcrypt ที่ cost 10
  3. POST /api/content-pages/upload-image อัปโหลดรูปประกอบพร้อมตรวจสอบ Content-Type
  4. GET /api/content-pages/:id ดูรายละเอียด และ PATCH /api/content-pages/:id แก้ไข
  5. POST /api/content-pages/:id/publish เผยแพร่หน้า และ POST /api/content-pages/:id/archive ย้ายเข้าคลัง
  6. POST /api/content-pages/:id/duplicate คัดลอกหน้าทั้งชุดรวมถึงรูปประกอบ
  7. GET /api/content-pages/:id/analytics ดูสถิติการเข้าชม ซึ่งรวบรวมจากตาราง content_page_view, content_page_analytics และข้อมูล UTM ใน content_page_utm
  8. DELETE /api/content-pages/:id เป็น soft delete ผ่านคอลัมน์ deleted_date แบบธรรมดา จึงต้องเติมเงื่อนไข filter เองในทุก query

ฝั่งผู้อ่าน

  1. GET /api/public/content-pages/:token เปิดหน้าด้วย token โดยรับพารามิเตอร์ password หน้าที่ล็อกรหัสไว้ต้องส่งรหัสให้ตรงกับค่าที่เก็บไว้ ระบบจะเทียบด้วย bcrypt หากหน้ายังไม่เผยแพร่หรือ token ไม่ถูกต้อง จะได้ error APP_007 (Content not found)
  2. POST /api/public/content-pages/:token/track บันทึกการเข้าชมด้วย TrackViewDto โดยเพิ่มยอด view และเก็บ event ไว้ประมวลผลเป็น analytics แล้วตอบกลับ 200

นอกจากนี้ยังมีเส้นทางสาธารณะอีกชุดในโมดูล publicmod คือ /api/public/content/:token ซึ่งรองรับ LIFF เพิ่มเติม

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

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

MethodRouteHandlerPolicy (metadata)
GET/api/content-pagesct.findAllreadAll line-oa
GET/api/content-pages/:idct.findOneread line-oa
GET/api/content-pages/:id/analyticsct.getAnalyticsread line-oa
POST/api/content-pagesct.createcreate line-oa
POST/api/content-pages/upload-imagect.uploadImagecreate line-oa
POST/api/content-pages/:id/publishct.publishcreate line-oa
POST/api/content-pages/:id/archivect.archivecreate line-oa
POST/api/content-pages/:id/duplicatect.duplicatecreate line-oa
PATCH/api/content-pages/:idct.updateupdate line-oa
DELETE/api/content-pages/:idct.removedelete line-oa
GET/api/public/content-pages/:tokenct.getPublicContentpublic
POST/api/public/content-pages/:token/trackct.trackViewpublic

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

  • สิทธิ์การเข้าถึง — route ฝั่งผู้ดูแลอยู่บน group authed ซึ่งใช้ global JWT policy metadata เป็น PolicyModuleLineOa ซึ่งยังไม่บังคับใช้ และไม่มี ModuleGate ครอบ ส่วน route สาธารณะไม่มี guard
  • ตารางที่เกี่ยวข้องcontent_page, content_page_translation, content_page_view, content_page_analytics, content_page_utm, content_category, content_subcategory และ line_oa
  • Soft delete — ใช้คอลัมน์ deleted_date แบบธรรมดา ไม่ใช่ gorm.DeletedAt จึงต้องใส่ deleted_date IS NULL เองในทุก read
  • Storage Service — เก็บรูปประกอบของหน้าคอนเทนต์
  • การเข้ารหัส — ใช้ bcrypt cost 10 สำหรับรหัสผ่านของหน้า
  • โมดูลที่เกี่ยวข้อง — Content Category, Content Subcategory, Content Link และ Public API