-
Notifications
You must be signed in to change notification settings - Fork 22
jimmyarea 留言(后端)
Jimmy edited this page Jul 8, 2021
·
1 revision
let xss = require('xss')
const ObjectId = require('mongodb').ObjectId;
let mongoose = require('mongoose')
let Message = mongoose.model('Message')
let User = mongoose.model('User')
import { sendMail, decodeToken } from '../utils/util'
// 解密出邮箱等个人信息
const decodeUserInfo = async (ctx, next) => {
let user = {}
// ... 详细的解密过程(省略)
return user
}
/**
* @apiGroup Messsage
* @api {post} /private/leave/message 发表留言
* @apiVersion 1.0.0
*
*
* @apiSuccessExample {json} 返回成功
* HTTP/1.1 200
* {
* "code": 0,
* "msg": "ok",
* "data": [{
* "key": "value"
* }]
* }
*
* @apiSampleRequest off
*/
exports.postMessage = async (ctx, next) => {
let user = await decodeUserInfo(ctx, next)
let subject = xss(ctx.request.body.subject.trim()) || ''
let content = xss(ctx.request.body.content.trim())
let type = ctx.request.body.type
let pid = ctx.request.body.pid || '-1'
let replyTargetId = ctx.request.body.replyTargetId || '-1'
if(![1,2].includes(type)) {
ctx.body = {
code: 20000,
msg: '留言失败~'
}
return
}
let message = new Message({
subject,
content,
userId: ObjectId(user._id),
pid,
replyTargetId,
type,
meta: { // 要对meta的值传递值,不然不准确
createAt: new Date(),
updateAt: new Date()
}
})
let data = await message.save()
if(data.content) {
ctx.body = {
data,
msg: '留言成功!'
}
} else {
ctx.body = {
code: 20000,
msg: '留言失败!'
}
}
// new Promise((resolve, reject) => {
// sendMail('***@outlook.com', subject, `<p>${content}</p>`, (state) => {
// resolve(state)
// })
// })
}
/**
* @apiGroup Messsage
* @api {get} /public/leave/message 查看所有留言
* @apiVersion 1.0.0
*
*
* @apiSuccessExample {json} 返回成功
* HTTP/1.1 200
* {
* "code": 0,
* "msg": "ok",
* "data": [{
* "key": "value"
* }]
* }
*
* @apiSampleRequest off
*/
exports.getMessageList = async (ctx, next) => {
let user = await decodeUserInfo(ctx, next)
let current = ctx.query.current && ctx.query.current.trim() || '';
let pageSize = ctx.query.pageSize && ctx.query.pageSize.trim() || '';
try {
current = parseInt(current, 10) || 1
pageSize = parseInt(pageSize, 10) || 10
} catch (err) {
current = 1
pageSize = 10
}
let count = await Message.count({pid: '-1'})
let data = await Message.find({pid: '-1'})
.skip((current-1) * pageSize)
.limit(pageSize)
.sort({ 'meta.createAt': -1})
.populate({
path: 'userId',
select: 'username _id' // select: 'username -_id' -_id 是排除_id
})
.lean(true) // 添加lean变成js的json字符串
const pids = Array.isArray(data) ? data.map(i => i._id) : [];
let resReply = []
if(pids.length) {
resReply = await Message.find({pid: {$in: pids}})
.sort({ 'meta.createAt': 1})
.populate({
path: 'userId',
select: 'username _id' // select: 'username -_id' -_id 是排除_id
})
}
const list = data.map(item => {
const children = JSON.parse(JSON.stringify(resReply.filter(i => i.pid === item._id.toString()))) // 引用问题
const tranformChildren = children.map(innerItem => ({
...innerItem,
canDel: innerItem.userId && innerItem.userId._id.toString() === (user._id&&user._id.toString()) ? 1 : 0
}))
return {
...item,
children: tranformChildren,
canDel: item.userId && item.userId._id.toString() === (user._id&&user._id.toString()) ? 1 : 0
}
})
if(list) {
ctx.body = {
results: list,
current: 1,
count
}
return
}
ctx.body = {
code: 10002,
msg: '获取留言失败!'
}
}
/**
* @apiGroup Messsage
* @api {get} /private/leave/message/:id 删除留言(有权限)
* @apiVersion 1.0.0
*
*
* @apiSuccessExample {json} 返回成功
* HTTP/1.1 200
* {
* "code": 0,
* "msg": "ok",
* "data": {}
* }
*
* @apiSampleRequest off
*/
exports.deleteMessageItem = async (ctx, next) => {
let user = await decodeUserInfo(ctx, next)
let id = ctx.params.id
console.log(id)
let result = await Message.deleteMany({
$or: [{_id: id, userId: ObjectId(user._id)}, {pid: id}]
})
if(result.deletedCount > 0) {
ctx.body = {
msg: ' 删除成功!'
}
return
}
ctx.body = {
code: 10002,
msg: '删除失败!'
}
}