Spaces:
Sleeping
Sleeping
| const mongoose = require('mongoose'); | |
| const bcrypt = require('bcryptjs'); | |
| const userSchema = new mongoose.Schema({ | |
| email: { type: String, required: true, unique: true }, | |
| password: { type: String, required: true }, | |
| role: { type: String, enum: ['photographer', 'customer'], default: 'customer' }, | |
| roles: { type: [String], enum: ['photographer', 'customer'], default: ['customer'] }, | |
| firstName: String, | |
| lastName: String, | |
| bio: String, | |
| profilePicture: String, | |
| specialty: String, | |
| price: Number, | |
| experience: Number, | |
| address: String, | |
| location: { | |
| type: { | |
| type: String, | |
| enum: ['Point'], | |
| default: 'Point' | |
| }, | |
| coordinates: { | |
| type: [Number], | |
| default: [0, 0] | |
| } | |
| }, | |
| isVerified: { | |
| type: Boolean, | |
| default: false | |
| }, | |
| recommendationScore: { | |
| type: Number, | |
| default: 0 | |
| }, | |
| availability: [String], | |
| portfolio: [ | |
| { | |
| type: { type: String, enum: ['image', 'video'], default: 'image' }, | |
| url: { type: String, required: true } | |
| } | |
| ], | |
| rating: { type: Number, default: 4.9 }, | |
| reviewsCount: { type: Number, default: 0 }, | |
| createdAt: { type: Date, default: Date.now } | |
| }); | |
| userSchema.pre('save', async function () { | |
| if (!this.isModified('password')) return; | |
| this.password = await bcrypt.hash(this.password, 10); | |
| }); | |
| userSchema.methods.comparePassword = async function (candidatePassword) { | |
| return await bcrypt.compare(candidatePassword, this.password); | |
| }; | |
| module.exports = mongoose.model('User', userSchema); | |