387 lines
6.7 KiB
JavaScript
387 lines
6.7 KiB
JavaScript
const mongoose = require('mongoose')
|
|
const mongoosePaginate = require('mongoose-paginate-v2')
|
|
const timestamp = require('mongoose-timestamp')
|
|
const userSchema = new mongoose.Schema({
|
|
mobile: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
unique: true
|
|
},
|
|
otp: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 6,
|
|
maxLength: 6,
|
|
default: null
|
|
},
|
|
otpSentAt: {
|
|
type: Date,
|
|
required: false,
|
|
default: null
|
|
},
|
|
user_name: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
password: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
first_name: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
last_name: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
user_type: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
is_verified: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: 'none'
|
|
},
|
|
profile_image: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
default: null
|
|
},
|
|
national_card_image: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
default: null
|
|
},
|
|
expertise: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
sub_expertise: {
|
|
type: [String], // تغییر نوع به آرایه از استرینگ
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
gender: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
height: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
weight: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
size: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
eye_color: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
hair_color: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
cooperation_type: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
cooperation_abroad: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: null
|
|
},
|
|
conversation_projects: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: null
|
|
},
|
|
bio: {
|
|
type: String,
|
|
required: false,
|
|
minLength: 1,
|
|
maxLength: 1024,
|
|
default: null
|
|
},
|
|
national_code: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
birthday: {
|
|
type: Date,
|
|
required: false,
|
|
default: null
|
|
},
|
|
is_Register: {
|
|
type: String,
|
|
|
|
default: false
|
|
},
|
|
shaba: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
address: {
|
|
type: String,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 512,
|
|
default: null
|
|
},
|
|
province: {
|
|
type: Object,
|
|
default: null
|
|
},
|
|
city: {
|
|
type: Object,
|
|
default: null
|
|
},
|
|
lat: {
|
|
type: String,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 512,
|
|
default: null
|
|
},
|
|
lng: {
|
|
type: String,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 512,
|
|
default: null
|
|
},
|
|
show_location: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: null
|
|
},
|
|
rate: {
|
|
type: String,
|
|
trim: true,
|
|
maxLength: 512,
|
|
default: null
|
|
},
|
|
referral_code: {
|
|
type: String,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 512,
|
|
default: null
|
|
},
|
|
shop_id: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'Shop',
|
|
default: null
|
|
},
|
|
last_online: {
|
|
type: Date, // ذخیره تاریخ و زمان آخرین بازدید
|
|
default: Date.now // تنظیم تاریخ به تاریخ فعلی
|
|
},
|
|
business_license: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
default: null
|
|
},
|
|
user_level: {
|
|
type: String,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 512,
|
|
default: null
|
|
},
|
|
user_score: {
|
|
type: String,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 512,
|
|
default: null
|
|
},
|
|
last_post: {
|
|
type: Object,
|
|
default: null
|
|
},
|
|
// user_ratings: [{
|
|
// project_id: {
|
|
// type: mongoose.Schema.Types.ObjectId,
|
|
// ref: 'Project',
|
|
// required: true
|
|
// },
|
|
// creator_id: {
|
|
// type: mongoose.Schema.Types.ObjectId,
|
|
// ref: 'User',
|
|
// required: true
|
|
// },
|
|
// rating: {
|
|
// type: Number,
|
|
// required: true
|
|
// },
|
|
// comment: {
|
|
// type: String,
|
|
// trim: true
|
|
// }
|
|
// }],
|
|
daily_free_request: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
last_free_request_date: {
|
|
type: Date,
|
|
default: null
|
|
},
|
|
blocked_by: [{
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User'
|
|
}],
|
|
blocked_users: [{
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User'
|
|
}],
|
|
block_status: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: null
|
|
},
|
|
advertising_profiles: [{
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'AdvertisingProfile'
|
|
}],
|
|
services: [{
|
|
title: {
|
|
type: String,
|
|
required: true,
|
|
trim: true
|
|
},
|
|
originalPrice: {
|
|
type: String,
|
|
required: true
|
|
},
|
|
discountPrice: {
|
|
type: String,
|
|
required: false
|
|
},
|
|
discountPercentage: {
|
|
type: Number,
|
|
required: false
|
|
},
|
|
status: {
|
|
type: String,
|
|
default: "UnderReview",
|
|
required: false
|
|
},
|
|
image: {
|
|
type: String,
|
|
required: false,
|
|
trim: true
|
|
}
|
|
}],
|
|
monthly_free_offer: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
last_free_offer_date: {
|
|
type: Date,
|
|
default: null
|
|
}
|
|
// contactInfo: {
|
|
// phone: String,
|
|
// mobile: String,
|
|
// telegramLink: String,
|
|
// whatsappNumber: String,
|
|
// instagramLink: String,
|
|
// saveInfoForNextAds: { type: Boolean, default: false }
|
|
// },
|
|
// adTotalRatings: {
|
|
// type: Number,
|
|
// default: 0
|
|
// },
|
|
// adRatingsCount: {
|
|
// type: Number,
|
|
// default: 0
|
|
// },
|
|
// adAverageRating: {
|
|
// type: Number,
|
|
// default: 0
|
|
// }
|
|
})
|
|
|
|
userSchema.plugin(timestamp)
|
|
userSchema.plugin(mongoosePaginate)
|
|
const UserModel = mongoose.model('User', userSchema)
|
|
module.exports = UserModel
|