66 lines
2.2 KiB
JavaScript
66 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
|
|
|
|
const MEDIA_TONES = ['pet-1', 'pet-2', 'pet-3']
|
|
const PET_TONES = { dog: 'gold', cat: 'purple', other: 'green' }
|
|
|
|
exports.main = async event => {
|
|
const { OPENID } = cloud.getWXContext()
|
|
const now = Date.now()
|
|
const content = String(event.content || '').trim()
|
|
if (!content) throw new Error('content is required')
|
|
|
|
// Get author info first (required for snapshot)
|
|
const userRes = await db.collection('users').where({ openid: OPENID }).limit(1).get()
|
|
if (!userRes.data.length) throw new Error('user not found')
|
|
const user = userRes.data[0]
|
|
|
|
// Get pet snapshot if petId provided
|
|
let petSnapshot = null
|
|
if (event.petId) {
|
|
try {
|
|
const petRes = await db.collection('pets').doc(event.petId).get()
|
|
if (petRes.data) {
|
|
const p = petRes.data
|
|
petSnapshot = { name: p.name, breed: p.breed, tone: PET_TONES[p.species] || 'green' }
|
|
}
|
|
} catch (_) {}
|
|
}
|
|
|
|
// Derive mediaTone from media count so similar posts look varied
|
|
const mediaCount = Array.isArray(event.media) ? event.media.length : 0
|
|
const mediaTone = event.mediaTone || MEDIA_TONES[(mediaCount + now) % 3]
|
|
|
|
const post = {
|
|
authorOpenid: OPENID,
|
|
authorId: user._id,
|
|
authorSnapshot: { name: user.nickname, avatarKey: user.avatarKey },
|
|
petId: event.petId || '',
|
|
petSnapshot,
|
|
content: content.slice(0, 2000),
|
|
topics: Array.isArray(event.topics) ? event.topics : [],
|
|
media: Array.isArray(event.media) ? event.media : [],
|
|
mediaTone,
|
|
sticker: event.sticker || null,
|
|
locationText: event.locationText || '',
|
|
location: (typeof event.latitude === 'number' && typeof event.longitude === 'number')
|
|
? { latitude: event.latitude, longitude: event.longitude }
|
|
: null,
|
|
visibility: event.visibility || 'public',
|
|
counts: { likes: 0, comments: 0, shares: 0, favorites: 0 },
|
|
createdAt: now,
|
|
updatedAt: now
|
|
}
|
|
|
|
const result = await db.collection('posts').add({ data: post })
|
|
|
|
await db.collection('users').doc(user._id).update({
|
|
data: { 'stats.posts': _.inc(1) }
|
|
})
|
|
|
|
return { postId: result._id }
|
|
}
|