135 lines
7.2 KiB
Markdown
135 lines
7.2 KiB
Markdown
# Sprint 6 Phase 2 Notification Review
|
|
|
|
## Summary
|
|
|
|
ดำเนินการสร้าง Notification Center แบบใช้งานจริงบนฐานข้อมูลเดิมเรียบร้อยแล้ว โดยใช้ตาราง `notifications` ที่มีอยู่แล้วในระบบ และเชื่อมเข้ากับ Auth.js, Drizzle, React Query, header notification popover และหน้า `/dashboard/notifications`
|
|
|
|
งานในรอบนี้ครอบคลุม:
|
|
|
|
- สร้าง notification data layer และ reusable notification service
|
|
- เพิ่ม API สำหรับ list, mark read, mark all read
|
|
- เชื่อม notification event เข้ากับ training review, employee import และ master review
|
|
- เปลี่ยน notification center/header จาก mock store เป็นข้อมูลจริงจากฐานข้อมูล
|
|
- สร้าง notification center page แบบค้นหา กรอง อ่านทีละรายการ และอ่านทั้งหมด
|
|
- เพิ่ม audit log สำหรับ mark read และ mark all read
|
|
|
|
## Files Changed
|
|
|
|
- `src/app/dashboard/notifications/page.tsx`
|
|
- `src/app/api/notifications/route.ts`
|
|
- `src/app/api/notifications/[id]/read/route.ts`
|
|
- `src/app/api/notifications/read-all/route.ts`
|
|
- `src/app/api/training-records/[id]/review/route.ts`
|
|
- `src/app/api/import-employees/route.ts`
|
|
- `src/app/api/master-review/route.ts`
|
|
- `src/proxy.ts`
|
|
- `src/components/ui/notification-card.tsx`
|
|
- `src/features/audit-logs/server/audit-service.ts`
|
|
- `src/features/audit-logs/constants/audit-log-options.ts`
|
|
- `src/features/notifications/api/types.ts`
|
|
- `src/features/notifications/api/service.ts`
|
|
- `src/features/notifications/api/queries.ts`
|
|
- `src/features/notifications/api/mutations.ts`
|
|
- `src/features/notifications/constants/notification-options.ts`
|
|
- `src/features/notifications/server/notification-service.ts`
|
|
- `src/features/notifications/server/notification-data.ts`
|
|
- `src/features/notifications/components/notifications-listing.tsx`
|
|
- `src/features/notifications/components/notifications-page.tsx`
|
|
- `src/features/notifications/components/notification-center.tsx`
|
|
|
|
## Database Changes
|
|
|
|
- ไม่มีการเปลี่ยน schema
|
|
- ไม่มี migration ใหม่
|
|
- ใช้งานตารางเดิม `notifications`
|
|
|
|
## Routes Added
|
|
|
|
- `GET /api/notifications`
|
|
- `PATCH /api/notifications/[id]/read`
|
|
- `PATCH /api/notifications/read-all`
|
|
- ใช้งานหน้าเดิม `/dashboard/notifications` แต่เปลี่ยนเป็น data-driven implementation
|
|
|
|
## Notification Events Implemented
|
|
|
|
- `createNotification()`
|
|
- `createTrainingApprovedNotification()`
|
|
- `createTrainingRejectedNotification()`
|
|
- `createAnnouncementNotification()`
|
|
- `createImportCompletedNotification()`
|
|
- `createMasterReviewNotification()`
|
|
- `markNotificationAsRead()`
|
|
- `markAllNotificationsAsRead()`
|
|
|
|
Workflow ที่เชื่อมแล้ว:
|
|
|
|
- HRD อนุมัติ training record -> แจ้ง employee
|
|
- HRD ปฏิเสธ training record -> แจ้ง employee
|
|
- Employee import completed -> แจ้ง HRD ผู้ที่ทำรายการ
|
|
- Master review approve/reject -> แจ้ง HRD ผู้ที่ทำรายการ
|
|
|
|
## Permission Rules
|
|
|
|
- ผู้ใช้เห็นเฉพาะ notification ของตัวเอง
|
|
- HRD เห็นเฉพาะ notification ของตัวเอง
|
|
- API บังคับ ownership ที่ server-side ด้วย `organizationId + userId`
|
|
- การอ่าน notification ทีละรายการและอ่านทั้งหมดทำได้เฉพาะของตัวเอง
|
|
- หน้า `/dashboard/notifications` ใช้ `requireEmployeeDashboardAccess()`
|
|
- API `/api/notifications/**` ใช้ `requireOrganizationAccess()`
|
|
|
|
## Audit Events Added
|
|
|
|
- `NOTIFICATION_MARK_READ`
|
|
- `NOTIFICATION_MARK_ALL_READ`
|
|
- `NOTIFICATION_CREATE` สำหรับ system/manual notification flow ที่เปิด audit
|
|
|
|
หมายเหตุ:
|
|
|
|
- ไม่ได้ audit notification อัตโนมัติทุกตัว เพื่อลด log noise
|
|
- mark read actions ถูก audit ตาม requirement
|
|
|
|
## Thai Localization Changes
|
|
|
|
- เปลี่ยน notification center และ notification page เป็นข้อความไทย
|
|
- ปรับ label ของ filter, action, state, empty/error/loading ให้เป็นไทย
|
|
- ปรับ relative time บน notification card เป็นไทย
|
|
|
|
## Responsive/Mobile Notes
|
|
|
|
- Notification popover ยังคงรองรับ mobile width แบบเดิม
|
|
- หน้า `/dashboard/notifications` ใช้ stacked filters บนจอเล็ก
|
|
- ปุ่ม action และ mark-all ยังใช้งานได้บน mobile
|
|
- card layout ไม่ซ้อนทับข้อความและยังรองรับหลายบรรทัด
|
|
|
|
## Manual Test Checklist
|
|
|
|
- Employee can see only own notifications.
|
|
- HRD can see only own notifications.
|
|
- Training approved creates notification for employee.
|
|
- Training rejected creates notification for employee.
|
|
- Import completed creates notification for HRD.
|
|
- Master review action creates notification for HRD.
|
|
- Unread count displays correctly.
|
|
- Mark as read works.
|
|
- Mark all as read works.
|
|
- Search works.
|
|
- Filter unread/read works.
|
|
- Notification center works on mobile.
|
|
- Direct API access cannot read other users' notifications.
|
|
- Audit log records mark read actions.
|
|
|
|
## Known Limitations
|
|
|
|
- ตาราง `notifications.type` เดิมเป็น enum ชุดเก่า (`approved`, `rejected`, `announcement`, `reminder`) จึงต้อง map logical notification type ของ phase นี้เข้ากับ enum เดิมแทนการเพิ่ม enum ใหม่
|
|
- filter ประเภท notification ฝั่ง server ใช้การ resolve จาก `type + referenceType` หลัง query ไม่ได้ทำ SQL-native classification
|
|
- `createAnnouncementNotification()` ถูกเตรียมไว้แล้ว แต่ announcements module ยังเป็น placeholder จึงยังไม่ได้เชื่อม workflow publish จริงใน phase นี้
|
|
- notification center popover แสดงล่าสุด 5 รายการ ส่วนหน้ารวมใช้ pagination
|
|
|
|
## Next Phase Recommendation
|
|
|
|
- เชื่อม announcements publish workflow ให้สร้าง notification จริง
|
|
- เพิ่ม background delivery strategy หากภายหลังต้องรองรับ email/push
|
|
- เพิ่ม bulk cleanup หรือ archive strategy สำหรับ notification จำนวนมาก
|
|
- เพิ่ม richer notification linking เช่น deep link ไปหน้ารายละเอียดแบบ anchor/state-aware
|
|
- พิจารณาปรับ enum notification type ใน DB เมื่อพร้อมทำ migration อย่างเป็นทางการ
|