Spaces:
Sleeping
Sleeping
Tristan Yu commited on
Commit ·
f26854d
1
Parent(s): 89d3be6
feat(brief): store week-level brief and return it when no SourceText exists
Browse files- models/WeekBrief.js +22 -0
- routes/auth.js +3 -0
- routes/search.js +10 -1
models/WeekBrief.js
ADDED
|
@@ -0,0 +1,22 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 1 |
+
const mongoose = require('mongoose');
|
| 2 |
+
|
| 3 |
+
const weekBriefSchema = new mongoose.Schema({
|
| 4 |
+
category: {
|
| 5 |
+
type: String,
|
| 6 |
+
enum: ['tutorial', 'weekly-practice'],
|
| 7 |
+
required: true,
|
| 8 |
+
index: true
|
| 9 |
+
},
|
| 10 |
+
weekNumber: {
|
| 11 |
+
type: Number,
|
| 12 |
+
required: true,
|
| 13 |
+
index: true
|
| 14 |
+
},
|
| 15 |
+
translationBrief: {
|
| 16 |
+
type: String,
|
| 17 |
+
}
|
| 18 |
+
}, { timestamps: true, indexes: [{ fields: { category: 1, weekNumber: 1 }, unique: true }] });
|
| 19 |
+
|
| 20 |
+
module.exports = mongoose.model('WeekBrief', weekBriefSchema);
|
| 21 |
+
|
| 22 |
+
|
routes/auth.js
CHANGED
|
@@ -447,10 +447,13 @@ router.put('/admin/tutorial-brief/:weekNumber', authenticateToken, requireAdmin,
|
|
| 447 |
router.put('/admin/weekly-brief/:weekNumber', authenticateToken, requireAdmin, async (req, res) => {
|
| 448 |
try {
|
| 449 |
const SourceText = require('../models/SourceText');
|
|
|
|
| 450 |
const { translationBrief } = req.body;
|
| 451 |
const weekNumber = parseInt(req.params.weekNumber);
|
| 452 |
if (translationBrief === undefined || translationBrief === null) return res.status(400).json({ error: 'Translation brief is required' });
|
| 453 |
const result = await SourceText.updateMany({ category: 'weekly-practice', weekNumber }, { translationBrief });
|
|
|
|
|
|
|
| 454 |
res.json({ success: true, message: `Translation brief updated successfully for ${result.modifiedCount} weekly practice tasks`, modifiedCount: result.modifiedCount });
|
| 455 |
} catch (error) {
|
| 456 |
console.error('Update weekly practice brief error:', error);
|
|
|
|
| 447 |
router.put('/admin/weekly-brief/:weekNumber', authenticateToken, requireAdmin, async (req, res) => {
|
| 448 |
try {
|
| 449 |
const SourceText = require('../models/SourceText');
|
| 450 |
+
const WeekBrief = require('../models/WeekBrief');
|
| 451 |
const { translationBrief } = req.body;
|
| 452 |
const weekNumber = parseInt(req.params.weekNumber);
|
| 453 |
if (translationBrief === undefined || translationBrief === null) return res.status(400).json({ error: 'Translation brief is required' });
|
| 454 |
const result = await SourceText.updateMany({ category: 'weekly-practice', weekNumber }, { translationBrief });
|
| 455 |
+
// Also persist a week-level brief so it shows even when no SourceText items exist (e.g., file-based week)
|
| 456 |
+
await WeekBrief.findOneAndUpdate({ category: 'weekly-practice', weekNumber }, { translationBrief }, { upsert: true, new: true });
|
| 457 |
res.json({ success: true, message: `Translation brief updated successfully for ${result.modifiedCount} weekly practice tasks`, modifiedCount: result.modifiedCount });
|
| 458 |
} catch (error) {
|
| 459 |
console.error('Update weekly practice brief error:', error);
|
routes/search.js
CHANGED
|
@@ -43,13 +43,22 @@ router.get('/tutorial-tasks/:week', authenticateToken, async (req, res) => {
|
|
| 43 |
router.get('/weekly-practice/:week', authenticateToken, async (req, res) => {
|
| 44 |
try {
|
| 45 |
const SourceText = require('../models/SourceText');
|
|
|
|
| 46 |
const weekNumber = parseInt(req.params.week);
|
| 47 |
|
| 48 |
const practice = await SourceText.find({
|
| 49 |
category: 'weekly-practice',
|
| 50 |
weekNumber: weekNumber
|
| 51 |
}).sort({ position: 1, createdAt: 1 });
|
| 52 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 53 |
res.json(practice);
|
| 54 |
} catch (error) {
|
| 55 |
// Reduced logging to prevent excessive console output
|
|
|
|
| 43 |
router.get('/weekly-practice/:week', authenticateToken, async (req, res) => {
|
| 44 |
try {
|
| 45 |
const SourceText = require('../models/SourceText');
|
| 46 |
+
const WeekBrief = require('../models/WeekBrief');
|
| 47 |
const weekNumber = parseInt(req.params.week);
|
| 48 |
|
| 49 |
const practice = await SourceText.find({
|
| 50 |
category: 'weekly-practice',
|
| 51 |
weekNumber: weekNumber
|
| 52 |
}).sort({ position: 1, createdAt: 1 });
|
| 53 |
+
|
| 54 |
+
// If no SourceText items exist for this week, attempt to fetch week-level brief
|
| 55 |
+
if (practice.length === 0) {
|
| 56 |
+
const wb = await WeekBrief.findOne({ category: 'weekly-practice', weekNumber });
|
| 57 |
+
if (wb && wb.translationBrief) {
|
| 58 |
+
return res.json([{ _id: `wb-${weekNumber}`, title: `Week ${weekNumber} Brief`, content: '', category: 'weekly-practice', weekNumber, translationBrief: wb.translationBrief }]);
|
| 59 |
+
}
|
| 60 |
+
}
|
| 61 |
+
|
| 62 |
res.json(practice);
|
| 63 |
} catch (error) {
|
| 64 |
// Reduced logging to prevent excessive console output
|