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:
@@ -1,131 +1,131 @@
|
||||
const MessageModel = require('../../../models/MessageModel')
|
||||
const UserModel = require('../../../models/UserModel')
|
||||
const jwt = require('jsonwebtoken')
|
||||
const moment = require('moment-jalaali')
|
||||
const {
|
||||
viewerBlockedUser,
|
||||
userBlockedViewer,
|
||||
} = require('../../../utils/blockVisibility')
|
||||
const getMessages = async (req, res, next) => {
|
||||
try {
|
||||
const token = req.header('Authorization').split(' ')[1]
|
||||
if (!token) return res.status(401).send('Access Denied')
|
||||
|
||||
const decodedToken = jwt.verify(token, process.env.APP_SECRET)
|
||||
const userId = decodedToken.id
|
||||
|
||||
const { search } = req.query
|
||||
|
||||
// پیدا کردن تمام پیامهایی که کاربر مورد نظر آنها فرستنده یا گیرنده بوده است
|
||||
const messageFilter = {
|
||||
$or: [
|
||||
{ senderId: userId },
|
||||
{ receiverId: userId }
|
||||
]
|
||||
}
|
||||
|
||||
// پیدا کردن تمام پیامها با فیلتر و سورت براساس جدیدترین پیام
|
||||
const messages = await MessageModel.find(messageFilter).sort({ createdAt: -1 })
|
||||
|
||||
// استخراج شناسههای تمام کاربران مرتبط با این پیامها (بدون تکرار)
|
||||
const userIdToLastMessageDate = {}
|
||||
messages.forEach(message => {
|
||||
if (!userIdToLastMessageDate[message.senderId]) {
|
||||
userIdToLastMessageDate[message.senderId] = message.createdAt
|
||||
}
|
||||
if (!userIdToLastMessageDate[message.receiverId]) {
|
||||
userIdToLastMessageDate[message.receiverId] = message.createdAt
|
||||
}
|
||||
})
|
||||
|
||||
// تبدیل مجموعه شناسههای کاربر به آرایه
|
||||
const userIdsArray = Object.keys(userIdToLastMessageDate)
|
||||
|
||||
// ساخت فیلتر جستجو برای کاربران مرتبط
|
||||
const userFilter = { _id: { $in: userIdsArray } }
|
||||
|
||||
if (search) {
|
||||
userFilter.$and = [
|
||||
{ _id: { $in: userIdsArray } }, // فقط کاربران مرتبط
|
||||
{
|
||||
$or: [
|
||||
{ first_name: { $regex: search, $options: 'i' } },
|
||||
{ last_name: { $regex: search, $options: 'i' } },
|
||||
{ user_name: { $regex: search, $options: 'i' } }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
// پیدا کردن اطلاعات کاربران مرتبط بر اساس فیلتر جستجو و شمارش تعداد پیامهای خوانده نشده برای هر کاربر
|
||||
const usersData = await UserModel.find(userFilter)
|
||||
const usersWithUnreadCount = await Promise.all(usersData.map(async (user) => {
|
||||
const unreadMessagesCount = await MessageModel.countDocuments({ receiverId: userId, senderId: user._id, readStatus: 0 })
|
||||
|
||||
let lastOnlineStatus
|
||||
const now = moment()
|
||||
const lastOnline = moment(user.last_online)
|
||||
const diffMinutes = now.diff(lastOnline, 'minutes')
|
||||
|
||||
if (diffMinutes < 1) {
|
||||
lastOnlineStatus = 'آنلاین'
|
||||
} else if (diffMinutes < 60) {
|
||||
lastOnlineStatus = `${diffMinutes} دقیقه پیش`
|
||||
} else if (diffMinutes < 1440) {
|
||||
lastOnlineStatus = `${Math.floor(diffMinutes / 60)} ساعت پیش`
|
||||
} else {
|
||||
lastOnlineStatus = `${Math.floor(diffMinutes / 1440)} روز پیش`
|
||||
}
|
||||
|
||||
// بررسی آیا کاربر فعلی در لیست بلاکشدههای این کاربر است یا خیر
|
||||
const blockedByCurrentUser = viewerBlockedUser(user, userId)
|
||||
const blockedYou = userBlockedViewer(user, userId)
|
||||
|
||||
return {
|
||||
first_name: user.first_name,
|
||||
last_name: user.last_name,
|
||||
user_name: user.user_name,
|
||||
is_verified: user.is_verified,
|
||||
profile_image: user.profile_image,
|
||||
last_online: lastOnlineStatus,
|
||||
_id: user._id,
|
||||
unread_messages_count: unreadMessagesCount,
|
||||
is_blocked: blockedByCurrentUser,
|
||||
blocked_you: blockedYou,
|
||||
last_message_date: userIdToLastMessageDate[user._id]
|
||||
}
|
||||
}))
|
||||
|
||||
// حذف کاربر فعلی از آرایه و سورت کردن کاربران براساس آخرین پیام
|
||||
const filteredUsersData = usersWithUnreadCount
|
||||
.filter(user => user._id.toString() !== userId)
|
||||
.sort((a, b) => new Date(b.last_message_date) - new Date(a.last_message_date))
|
||||
|
||||
res.status(200).json({
|
||||
filteredUsersData,
|
||||
totalMessages: messages.length
|
||||
})
|
||||
} catch (error) {
|
||||
next(error)
|
||||
}
|
||||
}
|
||||
|
||||
const getUnreadMessages = async (req, res, next) => {
|
||||
try {
|
||||
const token = req.header('Authorization').split(' ')[1]
|
||||
if (!token) return res.status(401).send('Access Denied')
|
||||
|
||||
const decodedToken = jwt.verify(token, process.env.APP_SECRET)
|
||||
const userId = decodedToken.id
|
||||
|
||||
// پیدا کردن تمام پیامهای کاربر که هنوز خوانده نشدهاند
|
||||
const unreadMessagesCount = await MessageModel.countDocuments({ receiverId: userId, readStatus: 0 })
|
||||
|
||||
res.status(200).json({ unread_messages_count: unreadMessagesCount })
|
||||
} catch (error) {
|
||||
next(error)
|
||||
}
|
||||
}
|
||||
module.exports = {
|
||||
getMessages, getUnreadMessages
|
||||
}
|
||||
const MessageModel = require('../../../models/MessageModel')
|
||||
const UserModel = require('../../../models/UserModel')
|
||||
const jwt = require('jsonwebtoken')
|
||||
const moment = require('moment-jalaali')
|
||||
const {
|
||||
viewerBlockedUser,
|
||||
userBlockedViewer,
|
||||
} = require('../../../utils/blockVisibility')
|
||||
const getMessages = async (req, res, next) => {
|
||||
try {
|
||||
const token = req.header('Authorization').split(' ')[1]
|
||||
if (!token) return res.status(401).send('Access Denied')
|
||||
|
||||
const decodedToken = jwt.verify(token, process.env.APP_SECRET)
|
||||
const userId = decodedToken.id
|
||||
|
||||
const { search } = req.query
|
||||
|
||||
// پیدا کردن تمام پیامهایی که کاربر مورد نظر آنها فرستنده یا گیرنده بوده است
|
||||
const messageFilter = {
|
||||
$or: [
|
||||
{ senderId: userId },
|
||||
{ receiverId: userId }
|
||||
]
|
||||
}
|
||||
|
||||
// پیدا کردن تمام پیامها با فیلتر و سورت براساس جدیدترین پیام
|
||||
const messages = await MessageModel.find(messageFilter).sort({ createdAt: -1 })
|
||||
|
||||
// استخراج شناسههای تمام کاربران مرتبط با این پیامها (بدون تکرار)
|
||||
const userIdToLastMessageDate = {}
|
||||
messages.forEach(message => {
|
||||
if (!userIdToLastMessageDate[message.senderId]) {
|
||||
userIdToLastMessageDate[message.senderId] = message.createdAt
|
||||
}
|
||||
if (!userIdToLastMessageDate[message.receiverId]) {
|
||||
userIdToLastMessageDate[message.receiverId] = message.createdAt
|
||||
}
|
||||
})
|
||||
|
||||
// تبدیل مجموعه شناسههای کاربر به آرایه
|
||||
const userIdsArray = Object.keys(userIdToLastMessageDate)
|
||||
|
||||
// ساخت فیلتر جستجو برای کاربران مرتبط
|
||||
const userFilter = { _id: { $in: userIdsArray } }
|
||||
|
||||
if (search) {
|
||||
userFilter.$and = [
|
||||
{ _id: { $in: userIdsArray } }, // فقط کاربران مرتبط
|
||||
{
|
||||
$or: [
|
||||
{ first_name: { $regex: search, $options: 'i' } },
|
||||
{ last_name: { $regex: search, $options: 'i' } },
|
||||
{ user_name: { $regex: search, $options: 'i' } }
|
||||
]
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
// پیدا کردن اطلاعات کاربران مرتبط بر اساس فیلتر جستجو و شمارش تعداد پیامهای خوانده نشده برای هر کاربر
|
||||
const usersData = await UserModel.find(userFilter)
|
||||
const usersWithUnreadCount = await Promise.all(usersData.map(async (user) => {
|
||||
const unreadMessagesCount = await MessageModel.countDocuments({ receiverId: userId, senderId: user._id, readStatus: 0 })
|
||||
|
||||
let lastOnlineStatus
|
||||
const now = moment()
|
||||
const lastOnline = moment(user.last_online)
|
||||
const diffMinutes = now.diff(lastOnline, 'minutes')
|
||||
|
||||
if (diffMinutes < 1) {
|
||||
lastOnlineStatus = 'آنلاین'
|
||||
} else if (diffMinutes < 60) {
|
||||
lastOnlineStatus = `${diffMinutes} دقیقه پیش`
|
||||
} else if (diffMinutes < 1440) {
|
||||
lastOnlineStatus = `${Math.floor(diffMinutes / 60)} ساعت پیش`
|
||||
} else {
|
||||
lastOnlineStatus = `${Math.floor(diffMinutes / 1440)} روز پیش`
|
||||
}
|
||||
|
||||
// بررسی آیا کاربر فعلی در لیست بلاکشدههای این کاربر است یا خیر
|
||||
const blockedByCurrentUser = viewerBlockedUser(user, userId)
|
||||
const blockedYou = userBlockedViewer(user, userId)
|
||||
|
||||
return {
|
||||
first_name: user.first_name,
|
||||
last_name: user.last_name,
|
||||
user_name: user.user_name,
|
||||
is_verified: user.is_verified,
|
||||
profile_image: user.profile_image,
|
||||
last_online: lastOnlineStatus,
|
||||
_id: user._id,
|
||||
unread_messages_count: unreadMessagesCount,
|
||||
is_blocked: blockedByCurrentUser,
|
||||
blocked_you: blockedYou,
|
||||
last_message_date: userIdToLastMessageDate[user._id]
|
||||
}
|
||||
}))
|
||||
|
||||
// حذف کاربر فعلی از آرایه و سورت کردن کاربران براساس آخرین پیام
|
||||
const filteredUsersData = usersWithUnreadCount
|
||||
.filter(user => user._id.toString() !== userId)
|
||||
.sort((a, b) => new Date(b.last_message_date) - new Date(a.last_message_date))
|
||||
|
||||
res.status(200).json({
|
||||
filteredUsersData,
|
||||
totalMessages: messages.length
|
||||
})
|
||||
} catch (error) {
|
||||
next(error)
|
||||
}
|
||||
}
|
||||
|
||||
const getUnreadMessages = async (req, res, next) => {
|
||||
try {
|
||||
const token = req.header('Authorization').split(' ')[1]
|
||||
if (!token) return res.status(401).send('Access Denied')
|
||||
|
||||
const decodedToken = jwt.verify(token, process.env.APP_SECRET)
|
||||
const userId = decodedToken.id
|
||||
|
||||
// پیدا کردن تمام پیامهای کاربر که هنوز خوانده نشدهاند
|
||||
const unreadMessagesCount = await MessageModel.countDocuments({ receiverId: userId, readStatus: 0 })
|
||||
|
||||
res.status(200).json({ unread_messages_count: unreadMessagesCount })
|
||||
} catch (error) {
|
||||
next(error)
|
||||
}
|
||||
}
|
||||
module.exports = {
|
||||
getMessages, getUnreadMessages
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user