66 lines
1.8 KiB
JavaScript
66 lines
1.8 KiB
JavaScript
const cloud = require('wx-server-sdk')
|
|
|
|
cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV })
|
|
const db = cloud.database()
|
|
const DRAFTS_COLLECTION = 'drafts'
|
|
|
|
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 ensureDraftsCollection() {
|
|
if (typeof db.createCollection !== 'function') {
|
|
throw new Error('drafts collection does not exist')
|
|
}
|
|
|
|
try {
|
|
await db.createCollection(DRAFTS_COLLECTION)
|
|
} catch (error) {
|
|
if (!isCollectionAlreadyExists(error)) throw error
|
|
}
|
|
}
|
|
|
|
async function getExistingDraft(openid) {
|
|
try {
|
|
return await db.collection(DRAFTS_COLLECTION).where({ openid }).limit(1).get()
|
|
} catch (error) {
|
|
if (!isCollectionMissing(error)) throw error
|
|
await ensureDraftsCollection()
|
|
return { data: [] }
|
|
}
|
|
}
|
|
|
|
exports.main = async event => {
|
|
const { OPENID } = cloud.getWXContext()
|
|
if (!OPENID) throw new Error('no openid in wx context')
|
|
|
|
const now = Date.now()
|
|
const data = {
|
|
openid: OPENID,
|
|
draft: event.draft || {},
|
|
updatedAt: now
|
|
}
|
|
const existed = await getExistingDraft(OPENID)
|
|
const collection = db.collection(DRAFTS_COLLECTION)
|
|
|
|
if (existed.data.length) {
|
|
await collection.doc(existed.data[0]._id).update({ data })
|
|
return { draftId: existed.data[0]._id, updatedAt: now }
|
|
}
|
|
|
|
const result = await collection.add({ data })
|
|
return { draftId: result._id, updatedAt: now }
|
|
}
|