Skip to main content

หมวดหมู่คอนเทนต์

ภาพรวม

Content Category คือหมวดหมู่ระดับบนสุดสำหรับจัดระเบียบหน้าคอนเทนต์ ถือเป็นชั้นที่ 1 ของโครงสร้างหมวดหมู่ ส่วนชั้นถัดไปคือ Content Subcategory ที่ซ้อนกันได้อีกหลายระดับ

นอกจากการทำ CRUD ตามปกติแล้ว โมดูลนี้ยังมี endpoint สำหรับสร้าง dropdown สองรูปแบบ และ endpoint สรุปสถิติจำนวนคอนเทนต์ในแต่ละหมวด

ข้อควรระวัง: entity ContentCategory ใช้คอลัมน์ deleted_date แบบธรรมดา ไม่ใช่ gorm.DeletedAt ดังนั้น GORM จะไม่เติมเงื่อนไข filter ให้อัตโนมัติ โค้ดจึงต้องใส่ deleted_date IS NULL เองในทุกจุดที่เวอร์ชัน TypeScript ใส่ และต้องไม่ใส่ในจุดที่เวอร์ชันเดิม ไม่ได้ใส่ เช่น การ update และ save

Business Flow

  1. GET /api/content-categories ลิสต์หมวดหมู่ พร้อมตัวกรองตาม QueryContentCategoryDto
  2. GET /api/content-categories/dropdown คืนข้อมูลในรูปแบบ dropdown แบบแบน
  3. GET /api/content-categories/dropdown-group คืนข้อมูลแบบจัดกลุ่ม สำหรับ UI ที่ใช้ optgroup
  4. GET /api/content-categories/stats คืนสถิติจำนวนคอนเทนต์ในแต่ละหมวด
  5. POST /api/content-categories สร้างหมวดใหม่ด้วย CreateContentCategoryDto
  6. GET /api/content-categories/:id ดูรายละเอียดของหมวดหนึ่ง ๆ
  7. PATCH /api/content-categories/:id แก้ไขข้อมูลหมวด
  8. DELETE /api/content-categories/:id ลบหมวด โดยตอบกลับสถานะ 204 No Content
  9. หมวดที่สร้างไว้จะปรากฏเป็นตัวเลือกตอนสร้างหน้าคอนเทนต์ และแสดงในเส้นทางสาธารณะ GET /api/public/contents/categories

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

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

MethodRouteHandlerPolicy (metadata)
GET/api/content-categoriesh.findAllreadAll line-oa
GET/api/content-categories/dropdownh.getDropdownreadAll line-oa
GET/api/content-categories/dropdown-grouph.getDropdownGroupreadAll line-oa
GET/api/content-categories/statsh.getStatsreadAll line-oa
GET/api/content-categories/:idh.findOneread line-oa
POST/api/content-categoriesh.createcreate line-oa
PATCH/api/content-categories/:idh.updateupdate line-oa
DELETE/api/content-categories/:idh.removedelete line-oa

route ที่เป็น static path ได้แก่ /dropdown, /dropdown-group และ /stats ถูก register ก่อน /:id เพื่อให้ gin resolve ไปยัง handler ที่ถูกต้อง

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

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