Initial commit

This commit is contained in:
payacom
2026-07-08 21:01:30 +03:30
parent 59c7c8e11c
commit 0b01b262fa
38 changed files with 1415 additions and 288 deletions

104
helpers/viewOnceMessages.js Normal file
View File

@@ -0,0 +1,104 @@
const MessageModel = require('../models/MessageModel')
const { deleteMessagesAndNotify } = require('./expiredMessages')
function parseViewOnce(raw) {
if (raw == null || raw === '' || raw === false || raw === 'false' || raw === 0) {
return false
}
return raw === true || raw === 'true' || raw === 1 || raw === '1'
}
const VIEW_ONCE_MEDIA = new Set(['image', 'video', 'voice'])
function isViewOnceMediaType(fileType) {
return VIEW_ONCE_MEDIA.has(fileType)
}
/** Hide file URL for receiver until they open view-once media */
function sanitizeMessageForViewer(message, viewerId) {
const doc = message._doc ? { ...message._doc } : { ...message }
const viewer = String(viewerId)
const sender = String(doc.senderId)
const receiver = String(doc.receiverId)
if (!doc.viewOnce || !isViewOnceMediaType(doc.fileType)) {
return doc
}
if (viewer === sender) {
return doc
}
if (viewer === receiver) {
if (doc.viewOnceOpenedAt) {
return {
...doc,
file: '',
viewOnceExpired: true
}
}
return {
...doc,
file: '',
viewOnceLocked: true
}
}
return doc
}
async function openViewOnceMessage(messageId, userId) {
const msg = await MessageModel.findById(messageId)
if (!msg || !msg.viewOnce) {
return { error: 'پیام یافت نشد', status: 404 }
}
if (String(msg.receiverId) !== String(userId)) {
return { error: 'دسترسی مجاز نیست', status: 403 }
}
if (msg.viewOnceOpenedAt) {
return { error: 'این پیام قبلاً باز شده است', status: 410 }
}
msg.viewOnceOpenedAt = new Date()
await msg.save()
return {
message: msg.toObject(),
file: msg.file,
fileType: msg.fileType
}
}
async function completeViewOnceMessage(io, messageId, userId) {
const msg = await MessageModel.findById(messageId)
if (!msg || !msg.viewOnce) {
return { error: 'پیام یافت نشد', status: 404 }
}
const uid = String(userId)
const isReceiver = String(msg.receiverId) === uid
const isSender = String(msg.senderId) === uid
if (!isReceiver && !isSender) {
return { error: 'دسترسی مجاز نیست', status: 403 }
}
if (isReceiver && !msg.viewOnceOpenedAt) {
return { error: 'پیام هنوز باز نشده', status: 400 }
}
await deleteMessagesAndNotify(io, [msg], {
deletedBy: userId,
reason: 'viewOnce'
})
return { deletedIds: [String(msg._id)] }
}
module.exports = {
parseViewOnce,
isViewOnceMediaType,
sanitizeMessageForViewer,
openViewOnceMessage,
completeViewOnceMessage
}