commit
This commit is contained in:
105
docs/announcement-approval-workflow-implementation-report.md
Normal file
105
docs/announcement-approval-workflow-implementation-report.md
Normal 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`
|
||||
Reference in New Issue
Block a user