Skip to content

[Backend] Add content moderation queue with approve/reject workflow #123

Description

@jobbykings

Description

As user-generated content (course descriptions, forum posts, assignment submissions) grows, we need a moderation system where flagged or new content can be reviewed, approved, or rejected by moderators before being publicly visible.

Definition of Done

  • Content types eligible for moderation: course descriptions, user-submitted resources, discussion posts, reviews
  • Auto-flagging based on configurable keyword/pattern blocklist
  • User flagging: any authenticated user can "Report" content with a reason
  • Moderation queue endpoint: GET /api/admin/moderation/queue with filters by status (pending, approved, rejected), content type, date range
  • Moderation actions: approve (content becomes visible), reject with reason (content hidden, author notified), request revision (author can resubmit)
  • Moderation history logged in audit trail (see related audit logging issue)
  • Author receives notification (in-app + optional email) when content is moderated
  • Batch moderation: select multiple items and approve/reject in bulk
  • Role-based access: only users with moderator or admin role can access moderation endpoints

Files to Modify

  • frontend/src/app/admin/content/moderation/page.tsx
  • NEW: backend/src/models/ModerationFlag.ts
  • NEW: backend/src/services/moderationService.ts
  • NEW: backend/src/routes/admin/moderation.ts
  • NEW: backend/src/services/__tests__/moderationService.test.ts
  • backend/src/services/contentService.ts (integrate moderation check on content visibility)
  • backend/src/middleware/rbac.ts (add moderator role checks)
  • backend/migrations/ (new migration for moderation tables)
  • backend/src/controllers/notificationController.ts (send moderation result notifications)

Acceptance Criteria

  • User reports a course description as "Inappropriate content"; it appears in moderation queue with status "pending"
  • Moderator reviews the report, clicks "Reject - Violates guidelines"; content is hidden and author gets notification
  • Moderator approves a flagged post; it becomes visible and flag is cleared
  • Auto-flagging catches content with blocked keywords before it becomes public
  • Bulk approve/reject selects multiple queue items and applies action to all
  • Non-moderator user gets 403 when accessing moderation endpoints
  • Each moderation action is recorded in audit log with moderator ID, timestamp, reason

Metadata

Metadata

Assignees

Labels

Type

No type

Projects

No projects

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions