TransHub_backend / models /SubtitleSubmission.js
linguabot's picture
Upload folder using huggingface_hub
da819ac verified
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;