Files
Pawer/cloudfunctions/commentCreate/index.js
2026-06-18 15:38:28 +08:00

92 lines
2.6 KiB
JavaScript

const cloud = require('wx-server-sdk')
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
const db = cloud.database()
const _ = db.command
const COMMENTS_COLLECTION = 'comments'
function isCollectionMissing(error) {
const text = String(error?.errMsg || error?.message || error || '')
return (
text.includes('collection not exist') ||
text.includes('collection not exists') ||
text.includes('collection is not exists') ||
text.includes('DATABASE_COLLECTION_NOT_EXIST') ||
text.includes('-502005')
)
}
function isCollectionAlreadyExists(error) {
const text = String(error?.errMsg || error?.message || error || '')
return text.includes('collection already exists') || text.includes('DATABASE_COLLECTION_ALREADY_EXIST')
}
async function ensureCommentsCollection() {
if (typeof db.createCollection !== 'function') {
throw new Error('comments collection does not exist')
}
try {
await db.createCollection(COMMENTS_COLLECTION)
} catch (error) {
if (!isCollectionAlreadyExists(error)) throw error
}
}
async function addComment(data) {
try {
return await db.collection(COMMENTS_COLLECTION).add({ data })
} catch (error) {
if (!isCollectionMissing(error)) throw error
await ensureCommentsCollection()
return db.collection(COMMENTS_COLLECTION).add({ data })
}
}
exports.main = async event => {
const { OPENID } = cloud.getWXContext()
if (!OPENID) throw new Error('no openid in wx context')
const postId = String(event.postId || '').trim()
const content = String(event.content || '').trim()
if (!postId) throw new Error('postId is required')
if (!content) throw new Error('content is required')
const [postRes, userRes] = await Promise.all([
db.collection('posts').doc(postId).get(),
db.collection('users').where({ openid: OPENID }).limit(1).get()
])
if (!postRes.data) throw new Error('post not found')
if (!userRes.data.length) throw new Error('user not found')
const now = Date.now()
const user = userRes.data[0]
const result = await addComment({
postId,
openid: OPENID,
authorId: user._id,
authorSnapshot: {
name: user.nickname || '',
avatarKey: user.avatarKey || 'gradient-avatar-1',
avatarUrl: user.avatarUrl || ''
},
content: content.slice(0, 500),
createdAt: now,
updatedAt: now
})
await db.collection('posts').doc(postId).update({
data: {
'counts.comments': _.inc(1),
updatedAt: now
}
})
const updatedPost = await db.collection('posts').doc(postId).get()
return {
commentId: result._id,
comments: updatedPost.data.counts?.comments || 0
}
}