fix: resolve MongoDB connection and port configuration issues

- Added dotenv configuration for environment variables
- Fixed MongoDB connection string loading
- Configured server port to 3005
- Updated cron jobs for expired messages
This commit is contained in:
root
2026-07-11 14:06:46 +03:30
parent 51eb7d0224
commit c62e4c0577
175 changed files with 23463 additions and 21573 deletions

View File

@@ -1,410 +1,410 @@
/* eslint-disable no-unused-vars */
/* eslint-disable camelcase */
const { default: mongoose } = require('mongoose')
const UserModel = require('../../../models/UserModel')
const jMoment = require('moment-jalaali')
const NotificationModel = require('../../../models/NotificationModel')
const { default: axios } = require('axios')
const getUsers = async (req, res, next) => {
try {
// بررسی توکن
const token = req.header('Authorization')?.split(' ')[1];
if (!token) return res.status(401).send('Access Denied');
// پارامترهای query
const {
page = 1,
limit = 20,
expertise,
most_price,
most_requests,
age,
gender,
startDate,
endDate,
status,
search
} = req.query;
const filter = {}; // شرط‌های فیلتر
// فیلتر تاریخ
if (startDate || endDate) {
filter.createdAt = {};
if (startDate) filter.createdAt.$gte = new Date(startDate);
if (endDate) filter.createdAt.$lte = new Date(endDate);
}
// فیلتر وضعیت
if (status) {
filter.is_verified = status;
}
// فیلتر سرچ
if (search) {
const regex = new RegExp(search, "i"); // i = ignore case
filter.$or = [
{ first_name: regex },
{ last_name: regex },
{ user_name: regex },
{ mobile: regex }
];
}
// فیلترهای دیگر (اختیاری)
if (expertise) filter.expertise = expertise;
if (age) filter.age = age;
if (gender) filter.gender = gender;
// گزینه‌های صفحه‌بندی
const options = {
page: parseInt(page),
limit: parseInt(limit),
sort: { createdAt: -1 }
};
// گرفتن کاربران با paginate
const users = await UserModel.paginate(filter, options);
// آماده‌سازی خروجی
const newUsers = users.docs.map(user => ({
_id: user._id,
mobile: user.mobile,
user_name: user.user_name,
first_name: user.first_name,
last_name: user.last_name,
user_type: user.user_type,
is_verified: user.is_verified,
profile_image: user.profile_image,
expertise: user.expertise,
sub_expertise: user.sub_expertise,
gender: user.gender,
national_code: user.national_code,
province: user.province,
city: user.city,
last_online: jMoment(user.last_online).format('jYYYY-jMM-jDD HH:mm'),
createdAt: jMoment(user.createdAt).format('jYYYY-jMM-jDD HH:mm'),
block_status: user.block_status
}));
res.status(200).json({
users: newUsers,
totalPages: users.totalPages,
totalItems: users.totalDocs
});
} catch (error) {
console.error('Error in getUsers:', error);
res.status(500).json({ message: 'خطا در دریافت کاربران.' });
}
};
// const getUsers = async (req, res, next) => {
// try {
// const token = req.header('Authorization').split(' ')[1]
// if (!token) return res.status(401).send('Access Denied')
// // eslint-disable-next-line no-unused-vars
// const {
// page = 1,
// limit = 10,
// expertise,
// most_price,
// most_requests,
// age,
// gender,
// startDate,
// endDate,
// status
// } = req.query
// const filter = {} // افزودن شرط‌های دیگر برای فیلتر
// // Date
// if (startDate || endDate) {
// filter.createdAt = {}
// if (startDate) {
// filter.createdAt.$gte = new Date(startDate) // تاریخ شروع
// }
// if (endDate) {
// filter.createdAt.$lte = new Date(endDate) // تاریخ پایان
// }
// }
// if (status) {
// filter.is_verified = status
// }
// // if (expertise) {
// // filter.expertise = expertise
// // }
// // if (age) {
// // filter.age = age
// // }
// // if (gender) {
// // filter.gender = gender
// // }
// // استفاده از مدل پیجینیت شده برای دریافت نتایج صفحه‌بندی شده
// const options = {
// page: parseInt(page), // تبدیل صفحه به عدد صحیح
// limit: parseInt(limit), // تبدیل محدودیت به عدد صحیح
// sort: { createdAt: -1 }
// }
// const users = await UserModel.paginate(filter, options)
// const newUsers = users.docs.map(user => ({
// _id: user._id,
// mobile: user.mobile,
// user_name: user.user_name,
// first_name: user.first_name,
// last_name: user.last_name,
// user_type: user.user_type,
// is_verified: user.is_verified,
// profile_image: user.profile_image,
// expertise: user.expertise,
// sub_expertise: user.sub_expertise,
// gender: user.gender,
// national_code: user.national_code,
// province: user.province,
// city: user.city,
// last_online: jMoment(user.last_online).format('jYYYY-jMM-jDD HH:mm'),
// createdAt: jMoment(user.createdAt).format('jYYYY-jMM-jDD HH:mm'),
// block_status: user.block_status
// }))
// res.status(200).json({
// users: newUsers,
// totalPages: users.totalPages, // ارسال تعداد کل صفحات
// totalItems: users.totalDocs // ارسال تعداد کل آیتم‌ها
// })
// } catch (error) {
// // در صورت بروز خطا، ارسال پیام خطا به کاربر
// console.error('Error in getProjectTypes:', error)
// res.status(500).json({ message: 'خطا در دریافت انواع پروژه.' })
// }
// }
const getUserDetail = async (req, res, next) => {
try {
const token = req.header('Authorization').split(' ')[1]
if (!token) return res.status(401).send('Access Denied')
const user_id = req.query.user_id
// eslint-disable-next-line no-unused-vars
if (!mongoose.Types.ObjectId.isValid(user_id)) {
return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' })
}
const user = await UserModel.findById(user_id)
if (!user) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
const response = {
_id: user?._id,
profile_image: user?.profile_image,
first_name: user?.first_name,
last_name: user?.last_name,
user_name: user?.user_name,
mobile: user?.mobile,
national_code: user?.national_code,
province: user?.province,
city: user?.city,
address: user?.address,
height: user?.height,
weight: user?.weight,
size: user?.size,
birthday: user?.birthday,
show_location: user?.show_location,
cooperation_abroad: user?.cooperation_abroad,
conversation_projects: user?.conversation_projects,
expertise: user?.expertise,
sub_expertise: user?.sub_expertise,
shaba: user?.shaba,
national_card_image: user?.national_card_image,
last_online: jMoment(user?.last_online).format('jYYYY-jMM-jDD HH:mm'),
createdAt: jMoment(user?.createdAt).format('jYYYY-jMM-jDD HH:mm'),
block_status: user?.block_status,
user_level: user?.user_level,
user_type: user?.user_type,
user_score: user?.user_score,
services :user?.services,
is_verified: user?.is_verified,
rate: user?.rate,
bio: user?.bio,
eye_color: user?.eye_color,
hair_color: user?.hair_color,
lat: user?.lat,
lng: user?.lng
}
return res.status(200).json({ user: response })
} catch (error) {
next(error)
}
}
const updateUser = async (req, res, next) => {
try {
const userId = req.query.userId // دریافت شناسه کاربر از درخواست
// چک کردن اعتبار شناسه کاربر
if (!mongoose.Types.ObjectId.isValid(userId)) {
return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' })
}
// فیلدهایی که می‌خواهید آپدیت شوند را از درخواست دریافت کنید
const updateFields = req.body
// اجرای آپدیت و بازگشت مقدار آپدیت شده
const updatedUser = await UserModel.findByIdAndUpdate(
userId,
updateFields,
{ new: true }
)
// بررسی آیا کاربر وجود دارد یا نه
if (!updatedUser) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
// ارسال پاسخ با مقادیر آپدیت شده
res.status(200).json({ message: 'کاربر با موفقیت ویرایش شد', id: updatedUser._id })
} catch (error) {
const errors = []
if (error.code === 11000) {
// Duplicate key error
for (const key in error.keyValue) {
errors.push({ message: `ارور در فیلد ${key}` })
}
} else {
errors.push({ message: 'خطا در آپدیت کاربر' })
}
res.status(500).json({ errors })
}
}
const verifyUser = async (req, res, next) => {
try {
const userId = req.query.userId // دریافت شناسه کاربر از درخواست
const user = await UserModel.findById(userId)
if (!user) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
user.is_verified = 'verified';
user.is_Register = true;
await user.save();
const notification = new NotificationModel({
user_id: userId,
type: 'verify',
title: 'تایید مدارک',
description: 'مدارک ارسالی شما با موفقیت تایید شد'
})
await notification.save()
// Sms
const userReciver = await UserModel.findById(userId)
const data = JSON.stringify({
mobile: userReciver?.mobile,
templateId: '632057',
parameters: [
{ name: 'USERS', value: userReciver?.first_name + ' ' + userReciver?.last_name }
]
})
const config = {
method: 'post',
url: 'https://api.sms.ir/v1/send/verify',
headers: {
'Content-Type': 'application/json',
Accept: 'text/plain',
'x-api-key': '2JKxGbTzE64t0YTkjip6RYHnm9mq1haMlidF8WWwQunwubHFVW6iaMmfFQbMXEDt'
},
data
}
axios(config)
.then(function (response) {
})
.catch(function (error) {
console.log(error)
})
// End Sms
// ارسال پاسخ با مقادیر آپدیت شده
res.status(200).json({ message: 'مدارک کاربر با موفقیت تایید شد' })
} catch (error) {
next(error)
}
}
const updateUserStatus = async (req, res, next) => {
try {
const { userId, block_status } = req.body;
if (!mongoose.Types.ObjectId.isValid(userId)) {
return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' });
}
const user = await UserModel.findByIdAndUpdate(
userId,
{ block_status },
{ new: true }
);
if (!user) return res.status(404).json({ message: 'کاربر یافت نشد' });
res.status(200).json({ message: 'وضعیت کاربر با موفقیت تغییر کرد', block_status: user.block_status });
} catch (error) {
console.error(error);
res.status(500).json({ message: 'خطای سرور' });
}
};
const rejectUser = async (req, res, next) => {
try {
const userId = req.query.userId // دریافت شناسه کاربر از درخواست
const user = await UserModel.findById(userId)
if (!user) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
user.is_verified = 'rejected'
user.is_Register = false
await user.save()
const notification = new NotificationModel({
user_id: userId,
type: 'reject-user',
title: 'رد مدارک',
description: 'مدارک ارسالی شما رد شد، برای اطلاعات بیشتر از بخش تیکت به پشتیبانی پیام دهید.'
})
await notification.save()
// ارسال پاسخ با مقادیر آپدیت شده
res.status(200).json({ message: 'مدارک کاربر با موفقیت رد شد' })
} catch (error) {
next(error)
}
}
const changePass = async (req, res, next) => {
try {
const { userId, password } = req.body;
const user = await UserModel.findById(userId)
if (!user) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
user.password = password
await user.save()
// ارسال پاسخ با مقادیر آپدیت شده
res.status(200).json({ message: 'رمز عبور با موفقیت تغییر کرد' });
} catch (error) {
next(error)
}
}
module.exports = {
getUsers, getUserDetail, updateUser, verifyUser, rejectUser, updateUserStatus, changePass
}
/* eslint-disable no-unused-vars */
/* eslint-disable camelcase */
const { default: mongoose } = require('mongoose')
const UserModel = require('../../../models/UserModel')
const jMoment = require('moment-jalaali')
const NotificationModel = require('../../../models/NotificationModel')
const { default: axios } = require('axios')
const getUsers = async (req, res, next) => {
try {
// بررسی توکن
const token = req.header('Authorization')?.split(' ')[1];
if (!token) return res.status(401).send('Access Denied');
// پارامترهای query
const {
page = 1,
limit = 20,
expertise,
most_price,
most_requests,
age,
gender,
startDate,
endDate,
status,
search
} = req.query;
const filter = {}; // شرط‌های فیلتر
// فیلتر تاریخ
if (startDate || endDate) {
filter.createdAt = {};
if (startDate) filter.createdAt.$gte = new Date(startDate);
if (endDate) filter.createdAt.$lte = new Date(endDate);
}
// فیلتر وضعیت
if (status) {
filter.is_verified = status;
}
// فیلتر سرچ
if (search) {
const regex = new RegExp(search, "i"); // i = ignore case
filter.$or = [
{ first_name: regex },
{ last_name: regex },
{ user_name: regex },
{ mobile: regex }
];
}
// فیلترهای دیگر (اختیاری)
if (expertise) filter.expertise = expertise;
if (age) filter.age = age;
if (gender) filter.gender = gender;
// گزینه‌های صفحه‌بندی
const options = {
page: parseInt(page),
limit: parseInt(limit),
sort: { createdAt: -1 }
};
// گرفتن کاربران با paginate
const users = await UserModel.paginate(filter, options);
// آماده‌سازی خروجی
const newUsers = users.docs.map(user => ({
_id: user._id,
mobile: user.mobile,
user_name: user.user_name,
first_name: user.first_name,
last_name: user.last_name,
user_type: user.user_type,
is_verified: user.is_verified,
profile_image: user.profile_image,
expertise: user.expertise,
sub_expertise: user.sub_expertise,
gender: user.gender,
national_code: user.national_code,
province: user.province,
city: user.city,
last_online: jMoment(user.last_online).format('jYYYY-jMM-jDD HH:mm'),
createdAt: jMoment(user.createdAt).format('jYYYY-jMM-jDD HH:mm'),
block_status: user.block_status
}));
res.status(200).json({
users: newUsers,
totalPages: users.totalPages,
totalItems: users.totalDocs
});
} catch (error) {
console.error('Error in getUsers:', error);
res.status(500).json({ message: 'خطا در دریافت کاربران.' });
}
};
// const getUsers = async (req, res, next) => {
// try {
// const token = req.header('Authorization').split(' ')[1]
// if (!token) return res.status(401).send('Access Denied')
// // eslint-disable-next-line no-unused-vars
// const {
// page = 1,
// limit = 10,
// expertise,
// most_price,
// most_requests,
// age,
// gender,
// startDate,
// endDate,
// status
// } = req.query
// const filter = {} // افزودن شرط‌های دیگر برای فیلتر
// // Date
// if (startDate || endDate) {
// filter.createdAt = {}
// if (startDate) {
// filter.createdAt.$gte = new Date(startDate) // تاریخ شروع
// }
// if (endDate) {
// filter.createdAt.$lte = new Date(endDate) // تاریخ پایان
// }
// }
// if (status) {
// filter.is_verified = status
// }
// // if (expertise) {
// // filter.expertise = expertise
// // }
// // if (age) {
// // filter.age = age
// // }
// // if (gender) {
// // filter.gender = gender
// // }
// // استفاده از مدل پیجینیت شده برای دریافت نتایج صفحه‌بندی شده
// const options = {
// page: parseInt(page), // تبدیل صفحه به عدد صحیح
// limit: parseInt(limit), // تبدیل محدودیت به عدد صحیح
// sort: { createdAt: -1 }
// }
// const users = await UserModel.paginate(filter, options)
// const newUsers = users.docs.map(user => ({
// _id: user._id,
// mobile: user.mobile,
// user_name: user.user_name,
// first_name: user.first_name,
// last_name: user.last_name,
// user_type: user.user_type,
// is_verified: user.is_verified,
// profile_image: user.profile_image,
// expertise: user.expertise,
// sub_expertise: user.sub_expertise,
// gender: user.gender,
// national_code: user.national_code,
// province: user.province,
// city: user.city,
// last_online: jMoment(user.last_online).format('jYYYY-jMM-jDD HH:mm'),
// createdAt: jMoment(user.createdAt).format('jYYYY-jMM-jDD HH:mm'),
// block_status: user.block_status
// }))
// res.status(200).json({
// users: newUsers,
// totalPages: users.totalPages, // ارسال تعداد کل صفحات
// totalItems: users.totalDocs // ارسال تعداد کل آیتم‌ها
// })
// } catch (error) {
// // در صورت بروز خطا، ارسال پیام خطا به کاربر
// console.error('Error in getProjectTypes:', error)
// res.status(500).json({ message: 'خطا در دریافت انواع پروژه.' })
// }
// }
const getUserDetail = async (req, res, next) => {
try {
const token = req.header('Authorization').split(' ')[1]
if (!token) return res.status(401).send('Access Denied')
const user_id = req.query.user_id
// eslint-disable-next-line no-unused-vars
if (!mongoose.Types.ObjectId.isValid(user_id)) {
return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' })
}
const user = await UserModel.findById(user_id)
if (!user) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
const response = {
_id: user?._id,
profile_image: user?.profile_image,
first_name: user?.first_name,
last_name: user?.last_name,
user_name: user?.user_name,
mobile: user?.mobile,
national_code: user?.national_code,
province: user?.province,
city: user?.city,
address: user?.address,
height: user?.height,
weight: user?.weight,
size: user?.size,
birthday: user?.birthday,
show_location: user?.show_location,
cooperation_abroad: user?.cooperation_abroad,
conversation_projects: user?.conversation_projects,
expertise: user?.expertise,
sub_expertise: user?.sub_expertise,
shaba: user?.shaba,
national_card_image: user?.national_card_image,
last_online: jMoment(user?.last_online).format('jYYYY-jMM-jDD HH:mm'),
createdAt: jMoment(user?.createdAt).format('jYYYY-jMM-jDD HH:mm'),
block_status: user?.block_status,
user_level: user?.user_level,
user_type: user?.user_type,
user_score: user?.user_score,
services :user?.services,
is_verified: user?.is_verified,
rate: user?.rate,
bio: user?.bio,
eye_color: user?.eye_color,
hair_color: user?.hair_color,
lat: user?.lat,
lng: user?.lng
}
return res.status(200).json({ user: response })
} catch (error) {
next(error)
}
}
const updateUser = async (req, res, next) => {
try {
const userId = req.query.userId // دریافت شناسه کاربر از درخواست
// چک کردن اعتبار شناسه کاربر
if (!mongoose.Types.ObjectId.isValid(userId)) {
return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' })
}
// فیلدهایی که می‌خواهید آپدیت شوند را از درخواست دریافت کنید
const updateFields = req.body
// اجرای آپدیت و بازگشت مقدار آپدیت شده
const updatedUser = await UserModel.findByIdAndUpdate(
userId,
updateFields,
{ new: true }
)
// بررسی آیا کاربر وجود دارد یا نه
if (!updatedUser) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
// ارسال پاسخ با مقادیر آپدیت شده
res.status(200).json({ message: 'کاربر با موفقیت ویرایش شد', id: updatedUser._id })
} catch (error) {
const errors = []
if (error.code === 11000) {
// Duplicate key error
for (const key in error.keyValue) {
errors.push({ message: `ارور در فیلد ${key}` })
}
} else {
errors.push({ message: 'خطا در آپدیت کاربر' })
}
res.status(500).json({ errors })
}
}
const verifyUser = async (req, res, next) => {
try {
const userId = req.query.userId // دریافت شناسه کاربر از درخواست
const user = await UserModel.findById(userId)
if (!user) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
user.is_verified = 'verified';
user.is_Register = true;
await user.save();
const notification = new NotificationModel({
user_id: userId,
type: 'verify',
title: 'تایید مدارک',
description: 'مدارک ارسالی شما با موفقیت تایید شد'
})
await notification.save()
// Sms
const userReciver = await UserModel.findById(userId)
const data = JSON.stringify({
mobile: userReciver?.mobile,
templateId: '632057',
parameters: [
{ name: 'USERS', value: userReciver?.first_name + ' ' + userReciver?.last_name }
]
})
const config = {
method: 'post',
url: 'https://api.sms.ir/v1/send/verify',
headers: {
'Content-Type': 'application/json',
Accept: 'text/plain',
'x-api-key': '2JKxGbTzE64t0YTkjip6RYHnm9mq1haMlidF8WWwQunwubHFVW6iaMmfFQbMXEDt'
},
data
}
axios(config)
.then(function (response) {
})
.catch(function (error) {
console.log(error)
})
// End Sms
// ارسال پاسخ با مقادیر آپدیت شده
res.status(200).json({ message: 'مدارک کاربر با موفقیت تایید شد' })
} catch (error) {
next(error)
}
}
const updateUserStatus = async (req, res, next) => {
try {
const { userId, block_status } = req.body;
if (!mongoose.Types.ObjectId.isValid(userId)) {
return res.status(400).json({ message: 'شناسه کاربر معتبر نیست' });
}
const user = await UserModel.findByIdAndUpdate(
userId,
{ block_status },
{ new: true }
);
if (!user) return res.status(404).json({ message: 'کاربر یافت نشد' });
res.status(200).json({ message: 'وضعیت کاربر با موفقیت تغییر کرد', block_status: user.block_status });
} catch (error) {
console.error(error);
res.status(500).json({ message: 'خطای سرور' });
}
};
const rejectUser = async (req, res, next) => {
try {
const userId = req.query.userId // دریافت شناسه کاربر از درخواست
const user = await UserModel.findById(userId)
if (!user) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
user.is_verified = 'rejected'
user.is_Register = false
await user.save()
const notification = new NotificationModel({
user_id: userId,
type: 'reject-user',
title: 'رد مدارک',
description: 'مدارک ارسالی شما رد شد، برای اطلاعات بیشتر از بخش تیکت به پشتیبانی پیام دهید.'
})
await notification.save()
// ارسال پاسخ با مقادیر آپدیت شده
res.status(200).json({ message: 'مدارک کاربر با موفقیت رد شد' })
} catch (error) {
next(error)
}
}
const changePass = async (req, res, next) => {
try {
const { userId, password } = req.body;
const user = await UserModel.findById(userId)
if (!user) {
return res.status(404).json({ message: 'کاربر مورد نظر یافت نشد' })
}
user.password = password
await user.save()
// ارسال پاسخ با مقادیر آپدیت شده
res.status(200).json({ message: 'رمز عبور با موفقیت تغییر کرد' });
} catch (error) {
next(error)
}
}
module.exports = {
getUsers, getUserDetail, updateUser, verifyUser, rejectUser, updateUserStatus, changePass
}