Skip to main content

ลิงก์รวมคอนเทนต์

ภาพรวม

Content Link คือลิงก์เดียวที่รวมคอนเทนต์หลายชิ้นไว้ด้วยกัน แทนที่ผู้ดูแลจะต้องส่งลิงก์ทีละหน้า ก็สร้าง content link ที่ผูกเงื่อนไขไว้ เช่น หมวดหมู่ แท็ก หรือรายการที่เลือกเอง แล้วส่งลิงก์เดียวให้ผู้ใช้ เมื่อผู้ใช้เปิดลิงก์จะเห็นรายการคอนเทนต์ทั้งหมดที่ตรงเงื่อนไขนั้น

ลิงก์แต่ละตัวมี token ประจำตัวและออกใหม่ได้เมื่อไม่ต้องการให้ลิงก์เดิมใช้งานได้อีก นอกจากนี้ยังมี endpoint สำหรับ preview เพื่อตรวจสอบล่วงหน้าว่าลิงก์นั้นจะแสดงคอนเทนต์อะไรบ้าง

Business Flow

  1. GET /api/content-links ลิสต์ลิงก์ทั้งหมด พร้อมตัวกรองตาม QueryContentLinkDto
  2. POST /api/content-links สร้างลิงก์ใหม่ โดยระบุเงื่อนไขว่าจะรวมคอนเทนต์ชุดใด ระบบจะ generate token แบบสุ่มด้วย crypto/rand แล้วเข้ารหัสเป็น hex
  3. GET /api/content-links/:id/preview-contents พร้อมพารามิเตอร์ page และ limit แสดง preview แบบแบ่งหน้าว่าลิงก์นี้จะเปิดออกมาเห็นคอนเทนต์อะไร ก่อนส่งให้ผู้ใช้จริง
  4. GET /api/content-links/:id ดูรายละเอียด และ PATCH /api/content-links/:id แก้ไขเงื่อนไข
  5. POST /api/content-links/:id/regenerate-token ออก token ใหม่ ซึ่งทำให้ลิงก์เดิมใช้งานไม่ได้ทันที
  6. DELETE /api/content-links/:id ลบลิงก์ โดยตอบกลับสถานะ 204
  7. ผู้ใช้ปลายทางที่เปิดลิงก์จะถูกส่งไปยัง endpoint สาธารณะของโมดูล publicmod คือ GET /api/public/contents ซึ่งมี rate limit อยู่ที่ 10 ครั้งต่อ 60 วินาที

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

โค้ดหลักอยู่ที่ internal/modules/contentlink/ ประกอบด้วย controller.go, service.go และ dto.go โดย register บน group authed.Group("/content-links")

MethodRouteHandlerPolicy (metadata)
GET/api/content-linkssvc.findAllHandlerreadAll line-oa
GET/api/content-links/:idsvc.findOneHandlerread line-oa
GET/api/content-links/:id/preview-contentssvc.getPreviewContentsHandlerread line-oa
POST/api/content-linkssvc.createHandlercreate line-oa
POST/api/content-links/:id/regenerate-tokensvc.regenerateTokenHandlercreate line-oa
PATCH/api/content-links/:idsvc.updateHandlerupdate line-oa
DELETE/api/content-links/:idsvc.removeHandlerdelete line-oa

ภายในโมดูลมี struct userContext ซึ่ง port มาจาก ContentLinkService.getUserContext() ทำหน้าที่เก็บ userID, lineOaID และ organizationID ที่อ่านจาก CLS

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

  • สิทธิ์การเข้าถึง — ต้องผ่าน global JwtAuth โดย policy metadata เป็น PolicyModuleLineOa ซึ่งยังไม่บังคับใช้ และไม่มี ModuleGate ครอบ
  • ตารางที่เกี่ยวข้องcontent_link, content_page, content_category, content_subcategory, line_oa
  • Context — อ่าน userId, lineOaId และ organizationId จาก CLS
  • โมดูลที่เกี่ยวข้อง — Content Page, Content Category, Content Subcategory, Public API และ Menu Builder ซึ่งเป็น mini-site อีกรูปแบบที่ใช้ public token เช่นกัน