tractatus/src/routes/submissions.routes.js
TheFlow 2279ef38de feat(translation): complete DeepL translation workflow
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
2025-10-24 11:22:50 +13:00

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;