ลิงก์รวมคอนเทนต์
ภาพรวม
Content Link คือลิงก์เดียวที่รวมคอนเทนต์หลายชิ้นไว้ด้วยกัน แทนที่ผู้ดูแลจะต้องส่งลิงก์ทีละหน้า ก็สร้าง content link ที่ผูกเงื่อนไขไว้ เช่น หมวดหมู่ แท็ก หรือรายการที่เลือกเอง แล้วส่งลิงก์เดียวให้ผู้ใช้ เมื่อผู้ใช้เปิดลิงก์จะเห็นรายการคอนเทนต์ทั้งหมดที่ตรงเงื่อนไขนั้น
ลิงก์แต่ละตัวมี token ประจำตัวและออกใหม่ได้เมื่อไม่ต้องการให้ลิงก์เดิมใช้งานได้อีก นอกจากนี้ยังมี endpoint สำหรับ preview เพื่อตรวจสอบล่วงหน้าว่าลิงก์นั้นจะแสดงคอนเทนต์อะไรบ้าง
Business Flow
GET /api/content-linksลิสต์ลิงก์ทั้งหมด พร้อมตัวกรองตามQueryContentLinkDtoPOST /api/content-linksสร้างลิงก์ใหม่ โดยระบุเงื่อนไขว่าจะรวมคอนเทนต์ชุดใด ระบบจะ generate token แบบสุ่มด้วยcrypto/randแล้วเข้ารหัสเป็น hexGET /api/content-links/:id/preview-contentsพร้อมพารามิเตอร์pageและlimitแสดง preview แบบแบ่งหน้าว่าลิงก์นี้จะเปิดออกมาเห็นคอนเทนต์อะไร ก่อนส่งให้ผู้ใช้จริงGET /api/content-links/:idดูรายละเอียด และPATCH /api/content-links/:idแก้ไขเงื่อนไขPOST /api/content-links/:id/regenerate-tokenออก token ใหม่ ซึ่งทำให้ลิงก์เดิมใช้งานไม่ได้ทันทีDELETE /api/content-links/:idลบลิงก์ โดยตอบกลับสถานะ 204- ผู้ใช้ปลายทางที่เปิดลิงก์จะถูกส่งไปยัง 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")
| Method | Route | Handler | Policy (metadata) |
|---|---|---|---|
| GET | /api/content-links | svc.findAllHandler | readAll line-oa |
| GET | /api/content-links/:id | svc.findOneHandler | read line-oa |
| GET | /api/content-links/:id/preview-contents | svc.getPreviewContentsHandler | read line-oa |
| POST | /api/content-links | svc.createHandler | create line-oa |
| POST | /api/content-links/:id/regenerate-token | svc.regenerateTokenHandler | create line-oa |
| PATCH | /api/content-links/:id | svc.updateHandler | update line-oa |
| DELETE | /api/content-links/:id | svc.removeHandler | delete 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 เช่นกัน