init commit
This commit is contained in:
107
.history/models/Portfolio_20251019162544.js
Normal file
107
.history/models/Portfolio_20251019162544.js
Normal file
@@ -0,0 +1,107 @@
|
||||
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);
|
||||
Reference in New Issue
Block a user