This commit is contained in:
2026-07-16 09:53:14 +07:00
parent 0fc112a2e8
commit 29cec708a3
1236 changed files with 212848 additions and 0 deletions

View 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 หลุดไปยังผู้ใช้งานทั่วไปอีก