index.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226
  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([
  110. $.eq(['$user_id', OPENID]),
  111. $.eq(['$msg_id', '$$msg_id'])
  112. ])))
  113. .project({
  114. _id: 0,
  115. favorite_time: 1
  116. }).done(),
  117. as: 'favorite'
  118. })
  119. .unwind('$favorite')
  120. .skip(event.page_token)
  121. .limit(event.page_size)
  122. .lookup({
  123. from: 'publisher',
  124. localField: 'pub_id',
  125. foreignField: '_id',
  126. as: 'publisher'
  127. })
  128. .unwind('$publisher')
  129. .end()
  130. return {
  131. list: messages.list,
  132. next_page_token: event.page_token + messages.list.length,
  133. status: 'OK'
  134. }
  135. } else if (event.filter) {
  136. let messages = db.collection('message')
  137. .aggregate()
  138. if (event.filter[1] !== '') {
  139. messages = messages.match({
  140. type: event.filter[1]
  141. })
  142. }
  143. if (event.filter[3] !== '') {
  144. messages = messages.match({
  145. tag: db.RegExp({
  146. regexp: event.filter[3],
  147. options: 'i'
  148. })
  149. })
  150. }
  151. messages = messages.lookup({
  152. from: 'publisher',
  153. localField: 'pub_id',
  154. foreignField: '_id',
  155. as: 'publisher'
  156. })
  157. .unwind('$publisher')
  158. if (event.filter[2] !== '') {
  159. if (event.filter[2] === '我关注的') {
  160. messages = messages.lookup({
  161. from: 'follow',
  162. let: {
  163. pub_id: '$pub_id'
  164. },
  165. pipeline: $.pipeline()
  166. .match(_.expr($.and([
  167. $.eq(['$user_id', OPENID]),
  168. $.eq(['$pub_id', '$$pub_id'])
  169. ])))
  170. .project({
  171. _id: 0,
  172. follow_time: 1
  173. }).done(),
  174. as: 'follow'
  175. })
  176. .unwind('$follow')
  177. } else {
  178. messages = messages.match({
  179. 'publisher.type': event.filter[2]
  180. })
  181. }
  182. }
  183. messages = await messages.sort({
  184. publish_time: -1
  185. })
  186. .skip(event.page_token)
  187. .limit(event.page_size)
  188. .end()
  189. return {
  190. list: messages.list,
  191. next_page_token: event.page_token + messages.list.length,
  192. status: 'OK'
  193. }
  194. } else {
  195. const messages = await db.collection('message')
  196. .aggregate()
  197. .sort({
  198. publish_time: -1
  199. })
  200. .skip(event.page_token)
  201. .limit(event.page_size)
  202. .lookup({
  203. from: 'publisher',
  204. localField: 'pub_id',
  205. foreignField: '_id',
  206. as: 'publisher'
  207. })
  208. .unwind('$publisher')
  209. .end()
  210. return {
  211. list: messages.list,
  212. next_page_token: event.page_token + messages.list.length,
  213. status: 'OK'
  214. }
  215. }
  216. }