Frontend:
- Add translate button click handler in submission-modal-enhanced.js
- Display loading state during translation (⏳ Translating...)
- Update French textarea with translated content
- Auto-update word counts after translation
- Show success message with DeepL attribution
Backend:
- Add POST /api/submissions/:id/translate endpoint
- Integrate Translation.service (DeepL)
- Save translations to SubmissionTracking.documents
- Mark translations as 'translatedBy: deepl', 'approved: false'
- Return translated text with caching metadata
Complete Translation Flow:
1. User clicks 'Translate EN → FR' button
2. Frontend sends English text to /api/submissions/:id/translate
3. Backend calls DeepL API via Translation.service
4. Translation cached for 24 hours
5. Result saved to submission.documents[docType].versions[]
6. French textarea populated with translation
7. User can review/edit before saving submission
Next: Configure DEEPL_API_KEY in .env to enable translations
88 lines
2.2 KiB
JavaScript
88 lines
2.2 KiB
JavaScript
/**
|
|
* Submissions Routes
|
|
* API endpoints for submission tracking
|
|
*/
|
|
|
|
const express = require('express');
|
|
const router = express.Router();
|
|
const submissionsController = require('../controllers/submissions.controller');
|
|
const { authenticateToken, requireAdmin } = require('../middleware/auth.middleware');
|
|
|
|
// All submission routes require admin authentication
|
|
router.use(authenticateToken);
|
|
router.use(requireAdmin);
|
|
|
|
/**
|
|
* POST /api/submissions
|
|
* Create new submission tracking entry
|
|
*/
|
|
router.post('/', submissionsController.createSubmission);
|
|
|
|
/**
|
|
* GET /api/submissions
|
|
* Get all submissions with optional filtering
|
|
* Query params: status, publicationId, limit, offset
|
|
*/
|
|
router.get('/', submissionsController.getSubmissions);
|
|
|
|
/**
|
|
* GET /api/submissions/statistics
|
|
* Get submission statistics (must be before /:id route)
|
|
*/
|
|
router.get('/statistics', submissionsController.getSubmissionStatistics);
|
|
|
|
/**
|
|
* GET /api/submissions/publication/:publicationId
|
|
* Get submissions for specific publication
|
|
*/
|
|
router.get('/publication/:publicationId', submissionsController.getSubmissionsByPublication);
|
|
|
|
/**
|
|
* GET /api/submissions/by-blog-post/:blogPostId
|
|
* Get submission by blog post ID
|
|
*/
|
|
router.get('/by-blog-post/:blogPostId', submissionsController.getSubmissionByBlogPost);
|
|
|
|
/**
|
|
* POST /api/submissions/:id/translate
|
|
* Translate document using DeepL
|
|
*/
|
|
router.post('/:id/translate', submissionsController.translateDocument);
|
|
|
|
/**
|
|
* GET /api/submissions/:id/export
|
|
* Export submission package
|
|
*/
|
|
router.get('/:id/export', submissionsController.exportSubmission);
|
|
|
|
/**
|
|
* GET /api/submissions/:id
|
|
* Get specific submission by ID
|
|
*/
|
|
router.get('/:id', submissionsController.getSubmissionById);
|
|
|
|
/**
|
|
* PUT /api/submissions/:id
|
|
* Update submission entry
|
|
*/
|
|
router.put('/:id', submissionsController.updateSubmission);
|
|
|
|
/**
|
|
* PUT /api/submissions/:id/status
|
|
* Update submission status
|
|
*/
|
|
router.put('/:id/status', submissionsController.updateSubmissionStatus);
|
|
|
|
/**
|
|
* POST /api/submissions/:id/notes
|
|
* Add note to submission
|
|
*/
|
|
router.post('/:id/notes', submissionsController.addSubmissionNote);
|
|
|
|
/**
|
|
* DELETE /api/submissions/:id
|
|
* Delete submission tracking entry
|
|
*/
|
|
router.delete('/:id', submissionsController.deleteSubmission);
|
|
|
|
module.exports = router;
|