47 lines
1.4 KiB
JavaScript
47 lines
1.4 KiB
JavaScript
const UserFollowModel = require('../models/UserFollowModel')
|
|
const UserModel = require('../models/UserModel')
|
|
|
|
async function getFollowCounts (userId) {
|
|
const [followersCount, followingCount] = await Promise.all([
|
|
UserFollowModel.countDocuments({ followingId: userId }),
|
|
UserFollowModel.countDocuments({ followerId: userId })
|
|
])
|
|
return { followersCount, followingCount }
|
|
}
|
|
|
|
async function mapFollowUsers (ids, viewerId) {
|
|
if (!ids.length) return []
|
|
const users = await UserModel.find({ _id: { $in: ids } })
|
|
.select('_id user_name first_name last_name profile_image is_verified verify_badge account_status')
|
|
.lean()
|
|
const byId = Object.fromEntries(users.map((u) => [String(u._id), u]))
|
|
|
|
let followingSet = new Set()
|
|
if (viewerId) {
|
|
const rows = await UserFollowModel.find({
|
|
followerId: viewerId,
|
|
followingId: { $in: ids }
|
|
}).select('followingId').lean()
|
|
followingSet = new Set(rows.map((r) => String(r.followingId)))
|
|
}
|
|
|
|
return ids
|
|
.map((id) => byId[String(id)])
|
|
.filter(Boolean)
|
|
.map((u) => ({
|
|
_id: String(u._id),
|
|
user_name: u.user_name || '',
|
|
first_name: u.first_name || '',
|
|
last_name: u.last_name || '',
|
|
profile_image: u.profile_image || '',
|
|
is_verified: u.is_verified || 'none',
|
|
verify_badge: u.verify_badge || 'none',
|
|
is_following: followingSet.has(String(u._id))
|
|
}))
|
|
}
|
|
|
|
module.exports = {
|
|
getFollowCounts,
|
|
mapFollowUsers
|
|
}
|