index.js 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140
  1. // 云函数入口文件
  2. const cloud = require('wx-server-sdk')
  3. cloud.init()
  4. const db = cloud.database()
  5. const _ = db.command
  6. const $ = db.command.aggregate
  7. // 云函数入口函数
  8. exports.main = async (event, context) => {
  9. const {
  10. OPENID
  11. } = cloud.getWXContext()
  12. if (event.pub_id) {
  13. const messages = await db.collection('message')
  14. .aggregate()
  15. .match({
  16. pub_id: event.pub_id
  17. })
  18. .sort({
  19. publish_time: -1
  20. })
  21. .skip(event.page_token)
  22. .limit(event.page_size)
  23. .end()
  24. return {
  25. list: messages.list,
  26. next_page_token: event.page_token + messages.list.length,
  27. status: 'OK'
  28. }
  29. } else if (event.keyword) {
  30. const regexp = db.RegExp({
  31. regexp: event.keyword,
  32. options: 'i'
  33. })
  34. const messages = await db.collection('message')
  35. .aggregate()
  36. .match(_.or([{
  37. name: regexp
  38. }, {
  39. brief: regexp
  40. }, {
  41. detail: regexp
  42. }]))
  43. .sort({
  44. publish_time: -1
  45. })
  46. .skip(event.page_token)
  47. .limit(event.page_size)
  48. .lookup({
  49. from: 'publisher',
  50. localField: 'pub_id',
  51. foreignField: '_id',
  52. as: 'publisher'
  53. })
  54. .end()
  55. for (let i = 0; i < messages.list.length; i++) {
  56. messages.list[i].publisher = messages.list[i].publisher[0]
  57. }
  58. await db.collection('search')
  59. .add({
  60. data: {
  61. user_id: OPENID,
  62. keyword: event.keyword || '',
  63. search_time: new Date()
  64. }
  65. })
  66. return {
  67. list: messages.list,
  68. next_page_token: event.page_token + messages.list.length,
  69. status: 'OK'
  70. }
  71. } else if (event.favorite) {
  72. const messages = await db.collection('message')
  73. .aggregate()
  74. .lookup({
  75. from: 'favorite',
  76. let: {
  77. msg_id: '$_id'
  78. },
  79. pipeline: $.pipeline()
  80. .match(_.expr($.and([$.eq(['$msg_id', '$$msg_id']), $.eq(['$user_id', OPENID])])))
  81. .project({
  82. _id: 0,
  83. favorite_time: 1
  84. }).done(),
  85. as: 'favorite'
  86. })
  87. .unwind('$favorite')
  88. .skip(event.page_token)
  89. .limit(event.page_size)
  90. .lookup({
  91. from: 'publisher',
  92. localField: 'pub_id',
  93. foreignField: '_id',
  94. as: 'publisher'
  95. })
  96. .end()
  97. for (let i = 0; i < messages.list.length; i++) {
  98. messages.list[i].publisher = messages.list[i].publisher[0]
  99. }
  100. return {
  101. list: messages.list,
  102. next_page_token: event.page_token + messages.list.length,
  103. status: 'OK'
  104. }
  105. } else {
  106. const messages = await db.collection('message')
  107. .aggregate()
  108. .sort({
  109. publish_time: -1
  110. })
  111. .skip(event.page_token)
  112. .limit(event.page_size)
  113. .lookup({
  114. from: 'publisher',
  115. localField: 'pub_id',
  116. foreignField: '_id',
  117. as: 'publisher'
  118. })
  119. .end()
  120. for (let i = 0; i < messages.list.length; i++) {
  121. messages.list[i].publisher = messages.list[i].publisher[0]
  122. }
  123. return {
  124. list: messages.list,
  125. next_page_token: event.page_token + messages.list.length,
  126. status: 'OK'
  127. }
  128. }
  129. }