107 lines
2.0 KiB
JavaScript
107 lines
2.0 KiB
JavaScript
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); |