const cloud = require('wx-server-sdk') cloud.init({ env: cloud.DYNAMIC_CURRENT_ENV }) const db = cloud.database() const _ = db.command // 项目暂未建立独立的通知集合,这里通过聚合"我的动态"收到的点赞 / 评论 // 实时合成通知列表;已读状态通过用户文档上的 lastReadNotificationsAt 时间戳比对得出 exports.main = async (event, context) => { const { OPENID } = cloud.getWXContext() try { const meRes = await db.collection('users').where({ openid: OPENID }).get() if (meRes.data.length === 0) return { code: 0, data: [] } const me = meRes.data[0] const lastRead = me.lastReadNotificationsAt ? new Date(me.lastReadNotificationsAt).getTime() : 0 const myPostsRes = await db.collection('posts') .where({ authorId: OPENID }) .field({ _id: true }) .orderBy('createdAt', 'desc') .limit(50) .get() const myPostIds = myPostsRes.data.map(p => p._id) const items = [] if (myPostIds.length) { const [likesRes, commentsRes] = await Promise.all([ db.collection('likes') .where({ postId: _.in(myPostIds), userId: _.neq(OPENID) }) .orderBy('createdAt', 'desc') .limit(20) .get(), db.collection('comments') .where({ postId: _.in(myPostIds), authorId: _.neq(OPENID) }) .orderBy('createdAt', 'desc') .limit(20) .get(), ]) likesRes.data.forEach(l => items.push({ _id: `like_${l._id}`, fromId: l.userId, postId: l.postId, action: '点赞', target: '动态', createdAt: l.createdAt, })) commentsRes.data.forEach(c => items.push({ _id: `comment_${c._id}`, fromId: c.authorId, postId: c.postId, action: '评论', target: '动态', createdAt: c.createdAt, })) } items.sort((a, b) => new Date(b.createdAt).getTime() - new Date(a.createdAt).getTime()) const sliced = items.slice(0, 30) const fromIds = [...new Set(sliced.map(i => i.fromId).filter(Boolean))] const usersRes = fromIds.length ? await db.collection('users').where({ openid: _.in(fromIds) }).field({ openid: true, nickName: true }).get() : { data: [] } const nickMap = {} usersRes.data.forEach(u => { nickMap[u.openid] = u.nickName }) const result = sliced.map(i => ({ ...i, fromNick: nickMap[i.fromId] || '一位用户', isRead: new Date(i.createdAt).getTime() <= lastRead, })) return { code: 0, data: result } } catch (e) { return { code: -1, message: e.message } } }