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 }