Files
modstagram-back/utils/privateProfile.js
payacom 3f416a7a60 full
2026-08-31 20:45:41 +03:30

77 lines
2.4 KiB
JavaScript

const UserFollowModel = require('../models/UserFollowModel')
const { isHiddenFromPublic } = require('./accountLifecycle')
async function viewerCanSeeUserContent (viewerId, profileUser) {
if (!profileUser) return false
if (isHiddenFromPublic(profileUser)) return false
if (!profileUser.is_private) return true
if (!viewerId) return false
if (String(viewerId) === String(profileUser._id)) return true
return !!(await UserFollowModel.exists({
followerId: viewerId,
followingId: profileUser._id,
}))
}
async function filterPostsHiddenByPrivateProfile (posts, viewerId) {
if (!posts?.length) return posts
const authorIds = [...new Set(posts.map((p) => String(p.user_id)))]
const UserModel = require('../models/UserModel')
const authors = await UserModel.find({ _id: { $in: authorIds } })
.select('_id is_private account_status')
.lean()
const authorsById = Object.fromEntries(authors.map((u) => [String(u._id), u]))
const privateAuthorIds = authors
.filter((u) => u.is_private && !isHiddenFromPublic(u))
.map((u) => String(u._id))
let visiblePrivateIds = new Set()
if (privateAuthorIds.length && viewerId) {
if (privateAuthorIds.includes(String(viewerId))) {
visiblePrivateIds.add(String(viewerId))
}
const follows = await UserFollowModel.find({
followerId: viewerId,
followingId: { $in: privateAuthorIds },
})
.select('followingId')
.lean()
follows.forEach((f) => visiblePrivateIds.add(String(f.followingId)))
}
return posts.filter((post) => {
const author = authorsById[String(post.user_id)]
if (!author || isHiddenFromPublic(author)) return false
if (!author.is_private) return true
if (!viewerId) return false
if (String(viewerId) === String(author._id)) return true
return visiblePrivateIds.has(String(author._id))
})
}
async function filterStoryUserIdsByPrivateProfile (userIds, viewerId) {
if (!userIds?.length) return []
const UserModel = require('../models/UserModel')
const users = await UserModel.find({ _id: { $in: userIds } })
.select('_id is_private account_status')
.lean()
const visible = []
for (const user of users) {
// eslint-disable-next-line no-await-in-loop
if (await viewerCanSeeUserContent(viewerId, user)) {
visible.push(String(user._id))
}
}
return visible
}
module.exports = {
viewerCanSeeUserContent,
filterPostsHiddenByPrivateProfile,
filterStoryUserIdsByPrivateProfile,
}