index.js 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163
  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. .unwind('$publisher')
  55. .end()
  56. await db.collection('search')
  57. .add({
  58. data: {
  59. user_id: OPENID,
  60. keyword: event.keyword || '',
  61. search_time: new Date()
  62. }
  63. })
  64. return {
  65. list: messages.list,
  66. next_page_token: event.page_token + messages.list.length,
  67. status: 'OK'
  68. }
  69. } else if (event.hot) {
  70. const reads = await db.collection('read')
  71. .aggregate()
  72. .match(_.expr($.lt([$.subtract([new Date(), '$read_time']), 1000 * 60 * 60 * 24])))
  73. .group({
  74. _id: '$msg_id',
  75. total: $.sum(1)
  76. })
  77. .sort({
  78. total: -1
  79. })
  80. .limit(10)
  81. .lookup({
  82. from: 'message',
  83. localField: '_id',
  84. foreignField: '_id',
  85. as: 'message'
  86. })
  87. .unwind('$message')
  88. .lookup({
  89. from: 'publisher',
  90. localField: 'message.pub_id',
  91. foreignField: '_id',
  92. as: 'message.publisher'
  93. })
  94. .unwind('$message.publisher')
  95. .end()
  96. return {
  97. list: reads.list,
  98. status: 'OK'
  99. }
  100. } else if (event.favorite) {
  101. const messages = await db.collection('message')
  102. .aggregate()
  103. .lookup({
  104. from: 'favorite',
  105. let: {
  106. msg_id: '$_id'
  107. },
  108. pipeline: $.pipeline()
  109. .match(_.expr($.and([$.eq(['$msg_id', '$$msg_id']), $.eq(['$user_id', OPENID])])))
  110. .project({
  111. _id: 0,
  112. favorite_time: 1
  113. }).done(),
  114. as: 'favorite'
  115. })
  116. .unwind('$favorite')
  117. .skip(event.page_token)
  118. .limit(event.page_size)
  119. .lookup({
  120. from: 'publisher',
  121. localField: 'pub_id',
  122. foreignField: '_id',
  123. as: 'publisher'
  124. })
  125. .unwind('$publisher')
  126. .end()
  127. return {
  128. list: messages.list,
  129. next_page_token: event.page_token + messages.list.length,
  130. status: 'OK'
  131. }
  132. } else {
  133. const messages = await db.collection('message')
  134. .aggregate()
  135. .sort({
  136. publish_time: -1
  137. })
  138. .skip(event.page_token)
  139. .limit(event.page_size)
  140. .lookup({
  141. from: 'publisher',
  142. localField: 'pub_id',
  143. foreignField: '_id',
  144. as: 'publisher'
  145. })
  146. .unwind('$publisher')
  147. .end()
  148. return {
  149. list: messages.list,
  150. next_page_token: event.page_token + messages.list.length,
  151. status: 'OK'
  152. }
  153. }
  154. }