# Fix Permission Bug: User สามารถเห็น "หมายเหตุการตรวจสอบ" ในหน้ารายละเอียดประกาศ ## ปัญหา ปัจจุบันเมื่อผู้ใช้งาน (Employee/User) เปิดดูรายละเอียดประกาศจากหน้า "ประกาศล่าสุด" หรือหน้ารายละเอียดประกาศ ระบบยังแสดง - หมายเหตุการตรวจสอบ (Review Note) - ความคิดเห็นของผู้ตรวจสอบ ซึ่งเป็นข้อมูลภายในของ Workflow การอนุมัติ ข้อมูลดังกล่าวควรเห็นได้เฉพาะ - HRD - HRD Manager - Admin - ผู้มีสิทธิ์ตรวจสอบประกาศ ไม่ควรแสดงแก่ผู้ใช้งานทั่วไป ถือเป็นปัญหา Information Disclosure และ Permission Logic --- # เป้าหมาย แก้ไขให้ข้อมูล Workflow ภายในไม่สามารถถูกเข้าถึงหรือแสดงผลโดยผู้ใช้งานทั่วไปได้ ทั้งในระดับ - Backend API - Frontend - Permission - Component - DTO / Response ให้เป็นมาตรฐาน Production Ready --- # สิ่งที่ต้องตรวจสอบ ## 1. ตรวจสอบ API รายละเอียดประกาศ ค้นหา API ที่ใช้ ตัวอย่างเช่น - GET /announcements/:id - getAnnouncementById() - announcement.service.ts - announcement.repository.ts ตรวจสอบ Response ว่าส่งข้อมูลดังนี้หรือไม่ - review_note - review_comment - reviewer - reviewer_name - reviewer_id - approved_by - approved_at - rejected_reason - workflow - audit - review_status หากส่งให้ User ต้องแก้ไข --- ## 2. แยก Public Response กับ Admin Response หากใช้ DTO เดียวกัน เช่น AnnouncementDetailDto ให้แยกเป็น AnnouncementPublicDto ประกอบด้วย - id - title - content - attachment - published_at - expired_at - created_by (ถ้าจำเป็น) - published_by (ถ้าจำเป็น) เท่านั้น ส่วน AnnouncementAdminDto จึงค่อยมี - review_note - reviewer - workflow - audit - rejected_reason - review history --- ## 3. ตรวจสอบ Permission ของ API ถ้า API เดียวใช้ทั้ง Admin และ User ให้ตรวจสอบสิทธิ์ ตัวอย่าง ``` if (isAdmin) { return fullAnnouncement } return publicAnnouncement ``` ห้ามส่งข้อมูล Review กลับไปยัง User แล้วค่อยซ่อนด้วย Frontend ต้องตัดออกจาก Response ตั้งแต่ Backend --- ## 4. ตรวจสอบ Frontend ค้นหา Component AnnouncementDetail AnnouncementView AnnouncementContent หรือ Component ที่ใช้แสดงรายละเอียดประกาศ ตรวจสอบว่ามีโค้ดลักษณะนี้หรือไม่ ``` {announcement.review_note && ( ... )} ``` หรือ ``` Review Note ``` หรือ ``` หมายเหตุการตรวจสอบ ``` หากไม่มีการตรวจสอบ Permission ให้เพิ่ม ``` isAdmin ``` หรือ ``` hasPermission(...) ``` ก่อน Render ตัวอย่าง ``` {isAdmin && announcement.review_note && ( )} ``` --- ## 5. ตรวจสอบ Component ที่ใช้ร่วมกัน หาก Admin และ User ใช้ Component เดียวกัน ให้พิจารณา Option A แยกเป็น AnnouncementAdminDetail AnnouncementPublicDetail หรือ Option B ส่ง prop ``` showReviewSection ``` เช่น ``` ``` ภายใน ``` {showReviewSection && ( ... )} ``` --- ## 6. ตรวจสอบทุกหน้าที่เกี่ยวข้อง ตรวจสอบ - Dashboard ล่าสุด - Announcement Detail - Announcement List - Search Result - Notification เปิดประกาศ ว่ามีการแสดง Review Note หรือ Workflow โดยไม่ตรวจสอบสิทธิ์หรือไม่ --- ## 7. ตรวจสอบ Serializer / Mapper หากมี ``` mapAnnouncement() ``` หรือ ``` toDto() ``` ตรวจสอบว่าไม่ได้ Mapping ``` review_note ``` ไปยัง Public DTO --- ## 8. ตรวจสอบ Database Query หากใช้ Prisma ตัวอย่าง ``` select: ``` ให้เลือกเฉพาะ Field ที่จำเป็น ไม่ใช้ ``` include: true ``` หรือ ``` select * ``` โดยไม่จำเป็น เพื่อลดการส่งข้อมูลที่ไม่ควรออกจาก Server --- # สิ่งที่ต้องแก้ไข Backend - แยก Public DTO - ตัดข้อมูล Review ออกจาก Public API - ตรวจสอบ Permission ก่อน Response - จำกัด Select เฉพาะ Field ที่จำเป็น Frontend - ซ่อน Section Review สำหรับ User - Render ตาม Permission - แยก Component หากเหมาะสม Architecture - แยกข้อมูล Public และ Internal - ลดการส่งข้อมูลเกินความจำเป็น - ปรับโครงสร้างให้รองรับการขยาย Workflow ในอนาคต --- # Acceptance Criteria ✅ ผู้ใช้งานทั่วไปไม่เห็น - หมายเหตุการตรวจสอบ - ความคิดเห็นผู้อนุมัติ - Reviewer - Workflow - Audit - Reject Reason - Approval History ✅ HRD/Admin ยังเห็นข้อมูลทั้งหมดได้ตามสิทธิ์ ✅ Public API ไม่ส่งข้อมูล Review อีกต่อไป ✅ Frontend ไม่มีการ Render ข้อมูล Review สำหรับ User ✅ ไม่มี Regression กับหน้าประกาศอื่น ✅ ผ่าน TypeScript และ ESLint ✅ ไม่กระทบ Workflow เดิม --- # ผลลัพธ์ที่ต้องการจาก AI 1. วิเคราะห์สาเหตุที่แท้จริงของปัญหา 2. ระบุไฟล์ที่ต้องแก้ไขทั้งหมด 3. แก้ไข Backend และ Frontend 4. ปรับ Permission Logic ให้ถูกต้อง 5. ปรับ DTO/Mapper/Serializer 6. ปรับ Component ที่เกี่ยวข้อง 7. ตรวจสอบทุกหน้าที่ใช้รายละเอียดประกาศ 8. สรุปรายการไฟล์ที่แก้ไข 9. อธิบายเหตุผลของการแก้ไขแต่ละจุด 10. ยืนยันว่าไม่มีข้อมูลภายในของ Workflow หลุดไปยังผู้ใช้งานทั่วไปอีก