tractatus/src/routes/media.routes.js
TheFlow e24638ba58 feat: implement AI-powered features (Phase 1 Core)
**Three Public Features:**
- Media Inquiry System: Press/media can submit inquiries with AI triage (Phase 2)
- Case Study Submissions: Community can submit real-world AI safety failures
- Blog Curation: Admin-only topic suggestions with AI assistance (Phase 2)

**Backend Implementation:**
- Media routes/controller: /api/media/inquiries endpoints
- Cases routes/controller: /api/cases/submit endpoints
- Blog routes/controller: Already existed, documented
- Human oversight: All submissions go to moderation queue
- Tractatus boundaries: BoundaryEnforcer integration in blog controller

**Frontend Forms:**
- /media-inquiry.html: Public submission form for press/media
- /case-submission.html: Public submission form for case studies
- Full validation, error handling, success messages

**Validation Middleware Updates:**
- Support nested field validation (contact.email, submitter.name)
- validateEmail(fieldPath) now parameterized
- validateRequired() supports dot-notation paths

**Phase 1 Status:**
- AI triage: Manual (Phase 2 will add Claude API integration)
- All submissions require human review and approval
- Moderation queue operational
- Admin dashboard endpoints ready

**Files Added:**
- public/media-inquiry.html
- public/case-submission.html
- src/controllers/media.controller.js
- src/controllers/cases.controller.js
- src/routes/media.routes.js
- src/routes/cases.routes.js

**Files Modified:**
- src/routes/index.js (registered new routes)
- src/routes/auth.routes.js (updated validateEmail call)
- src/middleware/validation.middleware.js (nested field support)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-10-08 00:14:00 +13:00

76 lines
2.1 KiB
JavaScript

/**
* Media Inquiry Routes
* Press/media inquiry submission and triage endpoints
*/
const express = require('express');
const router = express.Router();
const mediaController = require('../controllers/media.controller');
const { authenticateToken, requireRole } = require('../middleware/auth.middleware');
const { validateRequired, validateEmail, validateObjectId } = require('../middleware/validation.middleware');
const { asyncHandler } = require('../middleware/error.middleware');
/**
* Public routes
*/
// POST /api/media/inquiries - Submit media inquiry (public)
router.post('/inquiries',
validateRequired(['contact.name', 'contact.email', 'contact.outlet', 'inquiry.subject', 'inquiry.message']),
validateEmail('contact.email'),
asyncHandler(mediaController.submitInquiry)
);
/**
* Admin routes
*/
// GET /api/media/inquiries - List all inquiries (admin)
router.get('/inquiries',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(mediaController.listInquiries)
);
// GET /api/media/inquiries/urgent - List high urgency inquiries (admin)
router.get('/inquiries/urgent',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(mediaController.listUrgentInquiries)
);
// GET /api/media/inquiries/:id - Get inquiry by ID (admin)
router.get('/inquiries/:id',
authenticateToken,
requireRole('admin', 'moderator'),
validateObjectId('id'),
asyncHandler(mediaController.getInquiry)
);
// POST /api/media/inquiries/:id/assign - Assign inquiry to user (admin)
router.post('/inquiries/:id/assign',
authenticateToken,
requireRole('admin'),
validateObjectId('id'),
asyncHandler(mediaController.assignInquiry)
);
// POST /api/media/inquiries/:id/respond - Mark as responded (admin)
router.post('/inquiries/:id/respond',
authenticateToken,
requireRole('admin', 'moderator'),
validateObjectId('id'),
validateRequired(['content']),
asyncHandler(mediaController.respondToInquiry)
);
// DELETE /api/media/inquiries/:id - Delete inquiry (admin)
router.delete('/inquiries/:id',
authenticateToken,
requireRole('admin'),
validateObjectId('id'),
asyncHandler(mediaController.deleteInquiry)
);
module.exports = router;