105 lines
2.5 KiB
JavaScript
105 lines
2.5 KiB
JavaScript
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
|
|
}
|