tractatus/src/routes/crm.routes.js
TheFlow 0b853c537d feat(crm): complete Phase 3 multi-project CRM + critical bug fixes
Phase 3 Multi-Project CRM Implementation:
- Add UnifiedContact model for cross-project contact linking
- Add Organization model with domain-based auto-detection
- Add ActivityTimeline model for comprehensive interaction tracking
- Add SLATracking model for 24-hour response commitment
- Add ResponseTemplate model with variable substitution
- Add CRM controller with 8 API endpoints
- Add Inbox controller for unified communications
- Add CRM dashboard frontend with tabs (Contacts, Orgs, SLA, Templates)
- Add Contact Management interface (Phase 1)
- Add Unified Inbox interface (Phase 2)
- Integrate CRM routes into main API

Critical Bug Fixes:
- Fix newsletter DELETE button (event handler context issue)
- Fix case submission invisible button (invalid CSS class)
- Fix Chart.js CSP violation (add cdn.jsdelivr.net to policy)
- Fix Chart.js SRI integrity hash mismatch

Technical Details:
- Email-based contact deduplication across projects
- Automatic organization linking via email domain
- Cross-project activity timeline aggregation
- SLA breach detection and alerting system
- Template rendering with {placeholder} substitution

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

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

66 lines
1.5 KiB
JavaScript

/**
* CRM Routes
* Multi-project CRM system
*/
const express = require('express');
const router = express.Router();
const crmController = require('../controllers/crm.controller');
const { authenticateToken, requireRole } = require('../middleware/auth.middleware');
const { asyncHandler } = require('../middleware/error.middleware');
// Dashboard
router.get('/dashboard/stats',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(crmController.getDashboardStats)
);
// Contacts
router.get('/contacts',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(crmController.listContacts)
);
router.get('/contacts/:id',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(crmController.getContact)
);
// Organizations
router.get('/organizations',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(crmController.listOrganizations)
);
router.get('/organizations/:id',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(crmController.getOrganization)
);
// SLA Tracking
router.get('/sla/dashboard',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(crmController.getSLADashboard)
);
// Response Templates
router.get('/templates',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(crmController.listTemplates)
);
router.post('/templates/:id/render',
authenticateToken,
requireRole('admin', 'moderator'),
asyncHandler(crmController.renderTemplate)
);
module.exports = router;