92 lines
2.6 KiB
JavaScript
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
|
|
}
|
|
}
|