Files
Pawer/cloudfunctions/matchLike/index.js

61 lines
2.2 KiB
JavaScript

const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
const db = cloud.database()
const _ = db.command
// Reading a collection that was never created throws in WeChat 云开发, and this
// function reads `matches` before it ever adds to it — so the collection would
// never get created and every "like" would fail. Create it up-front (no-op if it
// already exists) to break that deadlock.
async function ensureCollection(name) {
try {
await db.createCollection(name)
} catch (e) {
// Already-exists error is expected on every call after the first.
}
}
exports.main = async event => {
const { OPENID } = cloud.getWXContext()
const { petId } = event
if (!petId) throw new Error('petId is required')
await ensureCollection('matches')
// Get current user and their pets
const userRes = await db.collection('users').where({ openid: OPENID }).limit(1).get()
if (!userRes.data.length) throw new Error('user not found')
const userId = userRes.data[0]._id
// Record this like (idempotent)
const existed = await db.collection('matches').where({ fromOpenid: OPENID, petId }).limit(1).get()
if (!existed.data.length) {
await db.collection('matches').add({ data: { fromOpenid: OPENID, userId, petId, createdAt: Date.now() } })
}
// Check mutual match: does the target pet's owner like any of current user's pets?
let matched = false
try {
const targetPetRes = await db.collection('pets').doc(petId).get()
const targetOwnerId = targetPetRes.data?.ownerId
if (targetOwnerId && targetOwnerId !== userId) {
const targetOwnerRes = await db.collection('users').doc(targetOwnerId).get()
const targetOpenid = targetOwnerRes.data?.openid
if (targetOpenid) {
const myPetsRes = await db.collection('pets').where({ ownerId: userId }).limit(20).get()
const myPetIds = myPetsRes.data.map(p => p._id)
if (myPetIds.length) {
const reverseRes = await db.collection('matches')
.where({ fromOpenid: targetOpenid, petId: _.in(myPetIds) })
.limit(1)
.get()
matched = reverseRes.data.length > 0
}
}
}
} catch (_) {}
return { matched }
}