84 lines
2.5 KiB
JavaScript
84 lines
2.5 KiB
JavaScript
const cloud = require('wx-server-sdk')
|
||
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
|
||
const db = cloud.database()
|
||
const _ = db.command
|
||
const PAGE_SIZE = 10
|
||
|
||
exports.main = async (event, context) => {
|
||
const { OPENID } = cloud.getWXContext()
|
||
const { page = 0, type = 'hot', userId, latitude, longitude } = event
|
||
|
||
try {
|
||
let query = db.collection('posts')
|
||
const skip = page * PAGE_SIZE
|
||
|
||
if (userId) {
|
||
// 某用户的帖子
|
||
query = query.where({ authorId: userId })
|
||
} else if (type === 'feed') {
|
||
// 关注的用户帖子
|
||
const followsRes = await db.collection('follows')
|
||
.where({ followerId: OPENID })
|
||
.field({ followeeId: true })
|
||
.get()
|
||
const followeeIds = followsRes.data.map(f => f.followeeId)
|
||
followeeIds.push(OPENID)
|
||
query = query.where({ authorId: _.in(followeeIds) })
|
||
} else if (type === 'nearby' && latitude && longitude) {
|
||
// 附近帖子:使用地理围栏查询(简化版,用 geo_near)
|
||
query = query.where(
|
||
_.and([
|
||
{ 'location.latitude': _.gt(latitude - 0.1) },
|
||
{ 'location.latitude': _.lt(latitude + 0.1) },
|
||
{ 'location.longitude': _.gt(longitude - 0.15) },
|
||
{ 'location.longitude': _.lt(longitude + 0.15) },
|
||
])
|
||
)
|
||
}
|
||
// type === 'hot' 全量按热度排序
|
||
|
||
const total = await query.count()
|
||
const postsRes = await query
|
||
.orderBy('createdAt', 'desc')
|
||
.skip(skip)
|
||
.limit(PAGE_SIZE)
|
||
.get()
|
||
|
||
const posts = postsRes.data
|
||
|
||
// 批量获取作者信息
|
||
const authorIds = [...new Set(posts.map(p => p.authorId))]
|
||
const authorsRes = await db.collection('users')
|
||
.where({ openid: _.in(authorIds) })
|
||
.field({ nickName: true, avatarUrl: true, openid: true, pets: true, location: true })
|
||
.get()
|
||
const authorMap = {}
|
||
authorsRes.data.forEach(u => { authorMap[u.openid] = u })
|
||
|
||
// 获取当前用户点赞状态
|
||
const postIds = posts.map(p => p._id)
|
||
const likesRes = await db.collection('likes')
|
||
.where({ userId: OPENID, postId: _.in(postIds) })
|
||
.field({ postId: true })
|
||
.get()
|
||
const likedSet = new Set(likesRes.data.map(l => l.postId))
|
||
|
||
const enriched = posts.map(p => ({
|
||
...p,
|
||
author: authorMap[p.authorId] || null,
|
||
isLiked: likedSet.has(p._id),
|
||
}))
|
||
|
||
return {
|
||
code: 0,
|
||
data: {
|
||
list: enriched,
|
||
total: total.total,
|
||
hasMore: skip + posts.length < total.total,
|
||
},
|
||
}
|
||
} catch (e) {
|
||
return { code: -1, message: e.message }
|
||
}
|
||
}
|