Skip to content

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: '删除失败!'
  }
}
Clone this wiki locally