const mongoose = require('mongoose'); const portfolioSchema = new mongoose.Schema({ title: { type: String, required: true, trim: true }, description: { type: String, required: true }, shortDescription: { type: String, required: true, maxlength: 200 }, category: { type: String, required: true, enum: ['web-development', 'mobile-app', 'ui-ux-design', 'branding', 'e-commerce', 'other'] }, technologies: [{ type: String, trim: true }], images: [{ url: { type: String, required: true }, alt: { type: String, default: '' }, isPrimary: { type: Boolean, default: false } }], clientName: { type: String, trim: true }, projectUrl: { type: String, trim: true }, githubUrl: { type: String, trim: true }, status: { type: String, enum: ['completed', 'in-progress', 'planning'], default: 'completed' }, featured: { type: Boolean, default: false }, publishedAt: { type: Date, default: Date.now }, completedAt: { type: Date }, isPublished: { type: Boolean, default: true }, viewCount: { type: Number, default: 0 }, likes: { type: Number, default: 0 }, order: { type: Number, default: 0 }, seo: { metaTitle: String, metaDescription: String, keywords: [String] } }, { timestamps: true }); // Index for search and sorting portfolioSchema.index({ title: 'text', description: 'text', technologies: 'text' }); portfolioSchema.index({ category: 1, publishedAt: -1 }); portfolioSchema.index({ featured: -1, publishedAt: -1 }); // Virtual for primary image portfolioSchema.virtual('primaryImage').get(function() { const primary = this.images.find(img => img.isPrimary); return primary || (this.images.length > 0 ? this.images[0] : null); }); portfolioSchema.set('toJSON', { virtuals: true }); module.exports = mongoose.model('Portfolio', portfolioSchema);