Spaces:
Sleeping
Sleeping
| const mongoose = require('mongoose'); | |
| const subtitleSubmissionSchema = new mongoose.Schema({ | |
| userId: { | |
| type: mongoose.Schema.Types.ObjectId, | |
| ref: 'User', | |
| required: true | |
| }, | |
| username: { | |
| type: String, | |
| required: true, | |
| trim: true | |
| }, | |
| segmentId: { | |
| type: Number, | |
| required: true, | |
| min: 1, | |
| max: 100, | |
| // Remove implicit single-field index to avoid duplicate with compound indexes below | |
| index: false | |
| }, | |
| chineseTranslation: { | |
| type: String, | |
| required: true, | |
| trim: true, | |
| maxlength: 500 | |
| }, | |
| submissionDate: { | |
| type: Date, | |
| default: Date.now | |
| }, | |
| isAnonymous: { | |
| type: Boolean, | |
| default: false | |
| }, | |
| weekNumber: { | |
| type: Number, | |
| required: true, | |
| default: 2 // Week 2 for Nike video | |
| }, | |
| // For future features | |
| status: { | |
| type: String, | |
| enum: ['submitted', 'reviewed', 'approved'], | |
| default: 'submitted' | |
| }, | |
| notes: { | |
| type: String, | |
| trim: true, | |
| maxlength: 1000 | |
| } | |
| }, { | |
| timestamps: true | |
| }); | |
| // Indexes for efficient queries | |
| subtitleSubmissionSchema.index({ segmentId: 1, weekNumber: 1 }); | |
| subtitleSubmissionSchema.index({ userId: 1, weekNumber: 1 }); | |
| subtitleSubmissionSchema.index({ submissionDate: -1 }); | |
| // Virtual for display name (anonymous or username) | |
| subtitleSubmissionSchema.virtual('displayName').get(function() { | |
| return this.isAnonymous ? 'Anonymous' : this.username; | |
| }); | |
| // Static method to get submissions for a specific segment | |
| subtitleSubmissionSchema.statics.getSubmissionsForSegment = function(segmentId, weekNumber = 2) { | |
| return this.find({ segmentId, weekNumber }) | |
| .sort({ submissionDate: -1 }) | |
| .select('username chineseTranslation submissionDate isAnonymous status notes'); | |
| }; | |
| // Static method to get user's submissions for a week | |
| subtitleSubmissionSchema.statics.getUserSubmissions = function(userId, weekNumber = 2) { | |
| return this.find({ userId, weekNumber }) | |
| .sort({ segmentId: 1, submissionDate: -1 }); | |
| }; | |
| // Static method to get submission count for a segment | |
| subtitleSubmissionSchema.statics.getSubmissionCount = function(segmentId, weekNumber = 2) { | |
| return this.countDocuments({ segmentId, weekNumber }); | |
| }; | |
| // Method to check if user has already submitted for this segment | |
| subtitleSubmissionSchema.statics.hasUserSubmitted = function(userId, segmentId, weekNumber = 2) { | |
| return this.exists({ userId, segmentId, weekNumber }); | |
| }; | |
| // Method to update existing submission | |
| subtitleSubmissionSchema.statics.updateSubmission = function(userId, segmentId, chineseTranslation, weekNumber = 2) { | |
| return this.findOneAndUpdate( | |
| { userId, segmentId, weekNumber }, | |
| { | |
| chineseTranslation, | |
| submissionDate: new Date(), | |
| isAnonymous: false // Reset to false on update | |
| }, | |
| { new: true, upsert: true } | |
| ); | |
| }; | |
| const SubtitleSubmission = mongoose.model('SubtitleSubmission', subtitleSubmissionSchema); | |
| module.exports = SubtitleSubmission; |