Files
Pawer/cloudfunctions/userList/index.js
2026-06-18 14:33:50 +08:00

47 lines
1.5 KiB
JavaScript

const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
const db = cloud.database()
const _ = db.command
// Discover other users to follow. Optional keyword filters by nickname.
exports.main = async event => {
const { OPENID } = cloud.getWXContext()
if (!OPENID) throw new Error('no openid in wx context')
const meRes = await db.collection('users').where({ openid: OPENID }).limit(1).get()
if (!meRes.data.length) throw new Error('user not found')
const meId = meRes.data[0]._id
const keyword = String(event.keyword || '').trim()
const where = { _id: _.neq(meId) }
if (keyword) where.nickname = db.RegExp({ regexp: keyword, options: 'i' })
const usersRes = await db.collection('users')
.where(where)
.orderBy('lastLoginAt', 'desc')
.limit(30)
.get()
const safeFollows = where2 =>
db.collection('follows').where(where2).limit(500).get().catch(() => ({ data: [] }))
const [followingRes, followerRes] = await Promise.all([
safeFollows({ followerId: meId }),
safeFollows({ followeeId: meId })
])
const followingSet = new Set(followingRes.data.map(f => f.followeeId))
const followerSet = new Set(followerRes.data.map(f => f.followerId))
const list = usersRes.data.map(u => ({
id: u._id,
name: u.nickname || '用户',
handle: u.handle || '',
avatarKey: u.avatarKey || 'gradient-avatar-1',
avatarUrl: u.avatarUrl || '',
bio: u.bio || '',
isFollowing: followingSet.has(u._id),
isFriend: followingSet.has(u._id) && followerSet.has(u._id)
}))
return { list }
}