commit
This commit is contained in:
373
plans/announcement-review-note-permission-bug-fix-plan.md
Normal file
373
plans/announcement-review-note-permission-bug-fix-plan.md
Normal file
@@ -0,0 +1,373 @@
|
||||
# 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 && (
|
||||
<ReviewNote />
|
||||
)}
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 5. ตรวจสอบ Component ที่ใช้ร่วมกัน
|
||||
|
||||
หาก Admin และ User ใช้ Component เดียวกัน
|
||||
|
||||
ให้พิจารณา
|
||||
|
||||
Option A
|
||||
|
||||
แยกเป็น
|
||||
|
||||
AnnouncementAdminDetail
|
||||
|
||||
AnnouncementPublicDetail
|
||||
|
||||
หรือ
|
||||
|
||||
Option B
|
||||
|
||||
ส่ง prop
|
||||
|
||||
```
|
||||
showReviewSection
|
||||
```
|
||||
|
||||
เช่น
|
||||
|
||||
```
|
||||
<AnnouncementDetail
|
||||
announcement={announcement}
|
||||
showReviewSection={isAdmin}
|
||||
/>
|
||||
```
|
||||
|
||||
ภายใน
|
||||
|
||||
```
|
||||
{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 หลุดไปยังผู้ใช้งานทั่วไปอีก
|
||||
Reference in New Issue
Block a user