Files
modstagram-back/models/ProjectModel.js
payacom 3f416a7a60 full
2026-08-31 20:45:41 +03:30

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