Add full project files

This commit is contained in:
root
2026-07-04 19:24:56 +03:30
parent d54f5441a3
commit b245e7b71a
835 changed files with 30149 additions and 0 deletions

View File

@@ -0,0 +1,127 @@
const MessageModel = require('../../../models/MessageModel')
const UserModel = require('../../../models/UserModel')
const jwt = require('jsonwebtoken')
const moment = require('moment-jalaali')
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 = user.blocked_by.includes(userId)
const blockedYou = user.blocked_users.includes(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
}