แอปกระดานประกาศ
ภาพรวม
แอป bulletin คือกระดานประกาศและชุมชนย่อยในหน้า LINE ของแบรนด์ รองรับการโพสต์ประกาศ ให้ผู้ใช้คอมเมนต์และแสดงรีแอ็กชัน พร้อมระบบรายงานเนื้อหาไม่เหมาะสม การบล็อกผู้ใช้ที่ก่อกวน และ audit log ที่บันทึกทุกการกระทำของทีมงาน
โมดูลนี้เป็นโมดูลใหม่ที่เขียนขึ้นตาม design spec ไม่ได้ port มาจาก NestJS และมี กติกาความปลอดภัยของข้อมูล 6 ข้อ ที่โค้ดยึดอย่างเคร่งครัด ซึ่งเป็นสิ่งที่ต้องเข้าใจก่อนแก้ไขโค้ดส่วนนี้
Business Flow
กติกา 6 ข้อที่บังคับทั่วทั้งโมดูล
กติกาเหล่านี้ระบุไว้ใน doc comment ของไฟล์ service ทุกไฟล์
- ทุก query ต้องผ่าน
repo.scopedหรือscopedTxซึ่งบังคับทั้งorganization_idและline_oa_id - id ที่ผู้เรียกส่งมาต้องถูกตรวจ ความเป็นเจ้าของ ไม่ใช่เพียงตรวจว่ามีอยู่จริง และหากไม่พบต้องตอบ 404 ไม่ใช่ 403 เพราะ 403 เท่ากับยืนยันว่าแถวนั้นมีอยู่ในองค์กรอื่น
- ทุก mutation ต้องอยู่ใน transaction เดียวกับการเขียนแถว audit log
- ห้ามเขียนคอลัมน์ counter ได้แก่
comment_count,reaction_countและreport_countเพราะ database trigger เป็นเจ้าของค่าเหล่านี้ - ห้าม mutate post และ comment ใน transaction เดียวกัน เพราะ trigger จับ advisory lock แยกตาม target (4201 สำหรับ post และ 4202 สำหรับ comment) การสลับลำดับจะทำให้เกิด deadlock
- การลบต้องเป็นการตั้ง
status = 'deleted'พร้อม stampdeleted_dateเสมอ ไม่มีการ hard delete
ตั้งค่าและหมวดหมู่
GET /api/apps/bulletin/settingsและPUT /api/apps/bulletin/settingsตั้งค่ากระดาน เช่น เปิดคอมเมนต์หรือไม่ และต้องอนุมัติก่อนเผยแพร่หรือไม่GET /api/apps/bulletin/pending-countคืนจำนวนรายการที่รออนุมัติ ใช้แสดง badge บนเมนู- หมวดหมู่จัดการผ่าน
GET /api/apps/bulletin/categories,POST /api/apps/bulletin/categories,PUT /api/apps/bulletin/categories/:idและDELETE /api/apps/bulletin/categories/:id
โพสต์และคอมเมนต์
GET /api/apps/bulletin/postsและPOST /api/apps/bulletin/postsดูรายการและสร้างโพสต์ ส่วนGET /api/apps/bulletin/posts/:idและPUT /api/apps/bulletin/posts/:idดูรายละเอียดและแก้ไขPUT /api/apps/bulletin/posts/:id/statusเปลี่ยนสถานะโพสต์ เช่น เผยแพร่ ซ่อน หรือลบPUT /api/apps/bulletin/posts/:id/pinปักหมุดโพสต์PUT /api/apps/bulletin/posts/:id/comments-settingเปิดหรือปิดคอมเมนต์เฉพาะโพสต์นั้นGET /api/apps/bulletin/posts/:id/commentsดูคอมเมนต์ของโพสต์GET /api/apps/bulletin/commentsดูคิวคอมเมนต์ทั้งกระดาน และPUT /api/apps/bulletin/comments/:id/statusอนุมัติ ซ่อน หรือลบคอมเมนต์
ความปลอดภัยและการกำกับดูแล
GET /api/apps/bulletin/reportsดูคิวรายงานเนื้อหา และPUT /api/apps/bulletin/reports/:id/statusจัดการหรือปัดตกรายงาน- แถว report จะไม่ถูกลบ เพราะ index
idx_bul_report_onceใช้ป้องกันไม่ให้ผู้ใช้คนเดิมรายงานซ้ำ
- แถว report จะไม่ถูกลบ เพราะ index
GET /api/apps/bulletin/blocksและPOST /api/apps/bulletin/blocksดูและเพิ่มการบล็อกผู้ใช้ ส่วนDELETE /api/apps/bulletin/blocks/:idเป็นการ revoke ไม่ใช่การลบแถวจริงGET /api/apps/bulletin/audit-logดูประวัติการกระทำของทีมงาน เป็นแบบอ่านอย่างเดียว
ไฟล์และฟังก์ชันหลัก
โค้ดอยู่ที่ internal/modules/bulletin/
| ไฟล์ | บทบาท |
|---|---|
controller.go | ลงทะเบียน route โดยทุก route มี apps.AppEnabledGuard(d) |
scope.go | repo.scoped และ scopedTx ซึ่งบังคับ tenant scope |
service_board.go | settings, categories และ pending-count |
service_moderation.go | posts, comments, การเปลี่ยนสถานะ และการปักหมุด |
service_safety.go | reports, blocks และการอ่าน audit log |
audit.go | เขียน audit log |
dto.go | DTO |
endpoint ทั้งหมดอยู่ใต้ /api/apps/bulletin/ บน group authed โดยลำดับ middleware คือ appEnabled แล้วตามด้วย policy และ handler
| กลุ่ม | Routes | Handler |
|---|---|---|
| settings | GET /settings, PUT /settings, GET /pending-count | ct.getSettings, ct.updateSettings, ct.pendingCount |
| categories | GET /categories, POST /categories, PUT /categories/:id, DELETE /categories/:id | ct.listCategories, ct.createCategory, ct.updateCategory, ct.deleteCategory |
| posts | GET /posts, POST /posts, GET /posts/:id, PUT /posts/:id, PUT /posts/:id/status, PUT /posts/:id/pin, PUT /posts/:id/comments-setting, GET /posts/:id/comments | ct.listPosts, ct.createPost, ct.getPost, ct.updatePost, ct.setPostStatus, ct.setPostPinned, ct.setPostCommentsSetting, ct.listPostComments |
| comments | GET /comments, PUT /comments/:id/status | ct.listComments, ct.setCommentStatus |
| reports | GET /reports, PUT /reports/:id/status | ct.listReports, ct.setReportStatus |
| blocks | GET /blocks, POST /blocks, DELETE /blocks/:id | ct.listBlocks, ct.createBlock, ct.revokeBlock |
| audit | GET /audit-log | ct.listAuditLog |
จุดเชื่อมต่อกับ Service อื่น
- สิทธิ์การเข้าถึง — ทุก route ผ่าน
apps.AppEnabledGuard(d)แอปต้องถูกเปิดให้องค์กรก่อน (ดู ระบบ Apps เสริม) ส่วน policy metadata ใช้PolicyModuleLineOaในระดับ read, readAll, create, update และ delete - ตารางที่เกี่ยวข้อง (schema
bulletin) —bulletin_board,bulletin_post,bulletin_engagement,bulletin_auditหรือaudit_logรวมถึงตาราง comment, report และ block - Database trigger — เป็นเจ้าของคอลัมน์ counter และใช้ advisory lock หมายเลข 4201 กับ 4202
- CLS —
organizationIdและlineOaIdส่งผ่านrepo.scoped - โมดูลที่เกี่ยวข้อง — ระบบ Apps เสริม, แอปสะสมแต้ม และ แอปจองคิว/นัดหมาย