Skip to main content

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

ภาพรวม

Content Subcategory คือหมวดหมู่ย่อยที่อยู่ใต้ Content Category และ ซ้อนกันได้หลายชั้น ในลักษณะ tree โดยมีเพดานความลึกกำหนดไว้ที่ค่าคงที่ MAX_SUBCATEGORY_LEVEL ซึ่งนับ Category เป็นชั้นที่ 1 แล้วซ้อนหมวดย่อยได้อีก 4 ชั้น

เนื่องจากเป็นโครงสร้างต้นไม้ โมดูลนี้จึงมี endpoint มากกว่าหมวดหมู่ธรรมดา ทั้งการดึงข้อมูลเป็น tree เต็มรูปแบบ การดึงเป็น hierarchical dropdown ที่เยื้องตามชั้น การดู path จากรากถึงโหนดสำหรับทำ breadcrumb และการจัดลำดับการแสดงผลใหม่

soft delete ของโมดูลนี้ใช้คอลัมน์ deleted_date แบบธรรมดา ไม่ใช่ gorm.DeletedAt จึงต้องใส่เงื่อนไข deleted_date IS NULL เอง และการลบเป็นคำสั่ง UPDATE แบบ manual

Business Flow

  1. GET /api/content-subcategories ลิสต์หมวดย่อยทั้งหมด ตาม QueryContentSubcategoryDto
  2. GET /api/content-subcategories/dropdown คืน dropdown แบบแบน
  3. ภายใต้หมวดหมู่หลักหนึ่ง ๆ มี endpoint เฉพาะทางหลายตัว
    • GET /api/content-subcategories/by-category/:categoryId ลิสต์หมวดย่อยทั้งหมดของหมวดนั้น
    • GET /api/content-subcategories/by-category/:categoryId/dropdown dropdown เฉพาะหมวดนั้น
    • GET /api/content-subcategories/by-category/:categoryId/tree โครงต้นไม้เต็มสำหรับ UI แบบ tree
    • GET /api/content-subcategories/by-category/:categoryId/hierarchical-dropdown dropdown ที่เยื้องตามระดับชั้น
  4. GET /api/content-subcategories/:id/path คืนเส้นทางจากหมวดรากถึงโหนดปัจจุบัน สำหรับแสดงเป็น breadcrumb
  5. POST /api/content-subcategories สร้างหมวดย่อยใหม่ พร้อมตรวจสอบว่าไม่เกินเพดานความลึก
  6. GET /api/content-subcategories/:id ดูรายละเอียด และ PATCH /api/content-subcategories/:id แก้ไข
  7. PATCH /api/content-subcategories/reorder/sort-order รับ body รูปแบบ {items: [{id, sortOrder}]} เพื่อจัดลำดับการแสดงผลใหม่หลายรายการในคำขอเดียว
  8. DELETE /api/content-subcategories/:id พร้อมพารามิเตอร์ force ใช้ลบหมวดย่อย โดยปกติระบบจะปฏิเสธหากยังมีหมวดย่อยลูกหรือมีคอนเทนต์ผูกอยู่ ส่วน force ใช้บังคับลบ

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

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

MethodRouteHandlerPolicy (metadata)
GET/api/content-subcategoriesct.findAllreadAll line-oa
GET/api/content-subcategories/dropdownct.getDropdownreadAll line-oa
GET/api/content-subcategories/by-category/:categoryIdct.findByCategoryIDreadAll line-oa
GET/api/content-subcategories/by-category/:categoryId/dropdownct.getDropdownByCategoryIDreadAll line-oa
GET/api/content-subcategories/by-category/:categoryId/treect.getTreeByCategoryIDreadAll line-oa
GET/api/content-subcategories/by-category/:categoryId/hierarchical-dropdownct.getHierarchicalDropdownByCategoryIDreadAll line-oa
GET/api/content-subcategories/:id/pathct.getPathread line-oa
GET/api/content-subcategories/:idct.findOneread line-oa
POST/api/content-subcategoriesct.createcreate line-oa
PATCH/api/content-subcategories/reorder/sort-orderct.updateSortOrderupdate line-oa
PATCH/api/content-subcategories/:idct.updateupdate line-oa
DELETE/api/content-subcategories/:idct.removedelete line-oa

ค่าคงที่ควบคุมความลึกคือ maxSubcategoryLevel ซึ่ง port มาจาก MAX_SUBCATEGORY_LEVEL

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

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