Initial commit
This commit is contained in:
104
helpers/viewOnceMessages.js
Normal file
104
helpers/viewOnceMessages.js
Normal 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
|
||||
}
|
||||
Reference in New Issue
Block a user