297 lines
5.6 KiB
JavaScript
297 lines
5.6 KiB
JavaScript
const mongoose = require('mongoose')
|
|
const timestamp = require('mongoose-timestamp')
|
|
const mongoosePaginate = require('mongoose-paginate-v2')
|
|
const projectSchema = new mongoose.Schema({
|
|
title: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
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
|
|
},
|
|
age: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
age_min: {
|
|
type: Number,
|
|
required: false,
|
|
default: null
|
|
},
|
|
age_max: {
|
|
type: Number,
|
|
required: false,
|
|
default: null
|
|
},
|
|
conversation_projects: {
|
|
type: Boolean,
|
|
required: false,
|
|
default: null
|
|
},
|
|
country: {
|
|
type: Object,
|
|
default: null
|
|
},
|
|
province: {
|
|
type: Object,
|
|
default: null
|
|
},
|
|
city: {
|
|
type: Object,
|
|
default: null
|
|
},
|
|
lat: {
|
|
type: Number,
|
|
required: false,
|
|
default: null
|
|
},
|
|
lng: {
|
|
type: Number,
|
|
required: false,
|
|
default: null
|
|
},
|
|
neighborhood: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
address: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
maxLength: 1024,
|
|
default: null
|
|
},
|
|
offer_time: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
offer_price: {
|
|
type: Number,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
payment_method: {
|
|
type: String,
|
|
enum: ['monthly', 'daily', 'hourly', 'commission', 'negotiable'],
|
|
required: false,
|
|
default: undefined
|
|
},
|
|
start_date: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
maxLength: 64,
|
|
default: null
|
|
},
|
|
work_hours_start: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
maxLength: 32,
|
|
default: null
|
|
},
|
|
work_hours_end: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
maxLength: 32,
|
|
default: null
|
|
},
|
|
collaboration_type: {
|
|
type: String,
|
|
enum: ['full_time', 'part_time', 'project', 'internship'],
|
|
required: false,
|
|
default: undefined
|
|
},
|
|
experience: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
maxLength: 64,
|
|
default: null
|
|
},
|
|
roles: [{
|
|
expertise: {
|
|
type: String,
|
|
required: true,
|
|
trim: true
|
|
},
|
|
sub_expertise: {
|
|
type: [String],
|
|
default: []
|
|
},
|
|
number_of_person: {
|
|
type: Number,
|
|
default: 1
|
|
},
|
|
height_min: { type: Number, default: null },
|
|
height_max: { type: Number, default: null },
|
|
weight_min: { type: Number, default: null },
|
|
weight_max: { type: Number, default: null },
|
|
size_min: { type: Number, default: null },
|
|
size_max: { type: Number, default: null },
|
|
eye_color: { type: String, default: null },
|
|
hair_color: { type: String, default: null },
|
|
portfolio_required: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
}],
|
|
description: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 1024,
|
|
default: null
|
|
},
|
|
project_type: {
|
|
type: String,
|
|
enum: ['free', 'normal', 'force', 'highlight'],
|
|
default: 'normal'
|
|
},
|
|
payment_status: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 255,
|
|
default: null
|
|
},
|
|
// فیلد برای وضعیت پروژه
|
|
status: {
|
|
type: String,
|
|
enum: ['pre_payment', 'paid', 'temp_accept', 'accepted', 'rejected', 'done', 'cancled', 'ongoing'],
|
|
default: 'pre_payment'
|
|
},
|
|
public_status: {
|
|
type: String,
|
|
enum: ['public', 'private'],
|
|
default: 'public'
|
|
},
|
|
created_for_user: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User',
|
|
default: null
|
|
},
|
|
creator_id: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User'
|
|
},
|
|
requested_users: [{
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User'
|
|
}],
|
|
selected_user: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User',
|
|
default: null
|
|
},
|
|
final_price: {
|
|
type: Number,
|
|
required: false,
|
|
default: null
|
|
},
|
|
final_time: {
|
|
type: Number,
|
|
required: false,
|
|
default: null
|
|
},
|
|
installments: [{
|
|
installment_number: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
amount: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
due_date: {
|
|
type: Date,
|
|
required: true
|
|
}
|
|
}],
|
|
reject_reason: {
|
|
type: String,
|
|
required: false,
|
|
trim: true,
|
|
minLength: 1,
|
|
maxLength: 1024,
|
|
default: null
|
|
},
|
|
ratings: [{
|
|
creator_id: {
|
|
type: mongoose.Schema.Types.ObjectId,
|
|
ref: 'User',
|
|
required: true
|
|
},
|
|
rating: {
|
|
type: Number,
|
|
required: true
|
|
},
|
|
comment: {
|
|
type: String,
|
|
trim: true
|
|
}
|
|
}],
|
|
acceptedAt: {
|
|
type: Date,
|
|
default: null
|
|
},
|
|
isExpired: {
|
|
type: Boolean,
|
|
default: false
|
|
},
|
|
// آیا مبلغ باقیمانده (پس از کسر کارمزد) هنگام تکمیل پروژه واریز شده است
|
|
completionShareCredited: {
|
|
type: Boolean,
|
|
default: false
|
|
}
|
|
|
|
})
|
|
|
|
projectSchema.plugin(timestamp)
|
|
// اضافه کردن پیجینیشن به مدل
|
|
projectSchema.plugin(mongoosePaginate)
|
|
const ProjectModel = mongoose.model('Project', projectSchema)
|
|
module.exports = ProjectModel
|