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;