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,105 @@
# Announcement Approval Workflow Implementation Report
## 1. Executive Summary
Announcement now uses the same action-based approval flow as Online Lesson for authoring and review:
- remove status selection from the form
- add `บันทึกร่าง` and `ส่งตรวจสอบ`
- submit now notifies reviewer users
- approve / return / reject / publish still notify the author
- build and TypeScript both pass after the change
## 2. Architecture Review
- Reused shared approval rules from `src/features/content-approval/lib/workflow.ts`
- Reused shared review UX from `src/features/content-approval/components/content-review-action-dialog.tsx`
- Kept persistence in local Route Handlers with Drizzle
- Kept notifications in `src/features/notifications/server/notification-service.ts`
- Reused the Online Lesson approval pattern instead of duplicating new workflow logic
## 3. Files Modified
- `src/features/announcements/components/announcement-form.tsx`
- `src/features/announcements/schemas/announcement.ts`
- `src/features/announcements/api/types.ts`
- `src/features/announcements/api/service.ts`
- `src/features/announcements/server/announcement-data.ts`
- `src/app/api/announcements/route.ts`
- `src/app/api/announcements/[id]/route.ts`
- `src/features/audit-logs/server/audit-service.ts`
- `src/features/audit-logs/constants/audit-log-options.ts`
## 4. Business Logic Changes
- Create and edit form payloads now send `action: 'draft' | 'submit'` instead of editable `status`
- Route handlers derive `draft` or `pending_review` from the requested action
- Submit permission is enforced with the shared `canTransitionContent()` rule
- Reviewer recipients are resolved from organization memberships with announcement review permissions
- Added audit coverage for `ANNOUNCEMENT_DRAFT_SAVED`
## 5. UI Changes
- Removed status dropdown from the announcement form
- Added form-level error summary with field errors
- Added footer workflow actions matching Online Lesson
- Kept publish and archive as reviewer/manager actions on edit and detail views
- Preserved review comment visibility for authors and reviewers
## 6. Permission Changes
- No new permission names were introduced
- Existing content approval permissions are now used more consistently for author submit vs reviewer actions
- Draft save and draft edit remain owner-scoped through existing shared permission checks
## 7. Workflow Changes
- Author can save draft without manually selecting a status
- Author can submit draft / returned / rejected content for review
- Submit now creates reviewer notifications for users with announcement review permissions
- Approve / return / reject / publish continue to notify the creator
- Publish still creates organization-wide announcement notifications
## 8. Refactoring Summary
- Announcement workflow now follows the same action-based contract used by Online Lesson
- Reviewer lookup was extracted into `getAnnouncementReviewRecipientIds()`
- Form and route contracts are cleaner because writable status is no longer exposed from the client
## 9. Breaking Changes
- Client announcement create/update multipart payload changed from `status` to `action`
## 10. Regression Risk
- Low for Online Lesson because its code path was not changed
- Medium for downstream clients that may still post announcement `status` directly instead of `action`
## 11. Test Checklist
- [x] Create Draft
- [x] Submit
- [x] Approve
- [x] Reject
- [x] Publish
- [ ] Schedule Publish
- [x] Notification
- [x] Permission
- [x] UI
- [x] Validation
## 12. Known Issues
- `Scheduled` / `Schedule Publish` is still not implemented in the shared content workflow or announcement data model
- There is no `scheduled_publish_at` field or scheduled publish executor in the current app flow
- This report therefore treats schedule publish as a remaining follow-up, not a completed part of this change
## 13. Recommendation
- If schedule publish is required next, implement it once at the shared workflow and schema level for both Announcement and Online Lesson together
- Add `scheduled` status, `scheduled_publish_at`, and a publish processor entrypoint before exposing schedule actions in UI
## Verification
- `npx tsc --noEmit`
- `npm run build`