修改bug
This commit is contained in:
@@ -2,6 +2,18 @@ const cloud = require('wx-server-sdk')
|
||||
|
||||
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
|
||||
const db = cloud.database()
|
||||
const _ = db.command
|
||||
|
||||
async function fetchUsers(ids) {
|
||||
if (!ids.length) return []
|
||||
const out = []
|
||||
for (let i = 0; i < ids.length; i += 100) {
|
||||
const chunk = ids.slice(i, i + 100)
|
||||
const res = await db.collection('users').where({ _id: _.in(chunk) }).limit(100).get()
|
||||
out.push(...res.data)
|
||||
}
|
||||
return out
|
||||
}
|
||||
|
||||
function hashId(id) {
|
||||
let h = 5381
|
||||
@@ -46,19 +58,48 @@ function distanceText(petLoc, userLoc) {
|
||||
}
|
||||
|
||||
exports.main = async event => {
|
||||
const { OPENID } = cloud.getWXContext()
|
||||
const filter = event.filters?.type || 'all'
|
||||
const userLoc = event.location || null
|
||||
const query = {}
|
||||
if (filter === 'dog' || filter === 'cat') query.species = filter
|
||||
if (filter === 'online') query.online = true
|
||||
|
||||
let meId = ''
|
||||
let followingSet = new Set()
|
||||
let followerSet = new Set()
|
||||
|
||||
if (OPENID) {
|
||||
const meRes = await db.collection('users').where({ openid: OPENID }).limit(1).get()
|
||||
const me = meRes.data[0]
|
||||
if (me) {
|
||||
meId = me._id
|
||||
const [followingRes, followerRes] = await Promise.all([
|
||||
db.collection('follows').where({ followerId: meId }).limit(500).get(),
|
||||
db.collection('follows').where({ followeeId: meId }).limit(500).get()
|
||||
])
|
||||
followingSet = new Set(followingRes.data.map(f => f.followeeId))
|
||||
followerSet = new Set(followerRes.data.map(f => f.followerId))
|
||||
}
|
||||
}
|
||||
|
||||
const res = await db.collection('pets').where(query).limit(50).get()
|
||||
const ownerIds = [...new Set(res.data.map(pet => pet.ownerId).filter(Boolean))]
|
||||
const owners = await fetchUsers(ownerIds)
|
||||
const ownerMap = new Map(owners.map(owner => [owner._id, owner]))
|
||||
|
||||
const list = res.data.map(pet => {
|
||||
const realCoord = pet.location && typeof pet.location.latitude === 'number' ? pet.location : null
|
||||
const coord = realCoord || (userLoc ? syntheticCoord(pet._id, userLoc) : null)
|
||||
const owner = ownerMap.get(pet.ownerId)
|
||||
const isFollowing = followingSet.has(pet.ownerId)
|
||||
const isFollowedBy = followerSet.has(pet.ownerId)
|
||||
return {
|
||||
...pet,
|
||||
ownerName: owner?.nickname || '',
|
||||
isMine: Boolean(meId && pet.ownerId === meId),
|
||||
isFollowing,
|
||||
isFriend: isFollowing && isFollowedBy,
|
||||
latitude: coord ? coord.latitude : undefined,
|
||||
longitude: coord ? coord.longitude : undefined,
|
||||
distanceText: distanceText(coord, userLoc) || pet.distanceText || null,
|
||||
|
||||
Reference in New Issue
Block a user