index.js 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  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. if (event.page_token === 0) {
  57. await db.collection('search')
  58. .add({
  59. data: {
  60. user_id: OPENID,
  61. keyword: event.keyword || '',
  62. search_time: new Date()
  63. }
  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.hot) {
  72. const reads = await db.collection('read')
  73. .aggregate()
  74. .match(_.expr($.lt([$.subtract([new Date(), '$read_time']), 1000 * 60 * 60 * 24])))
  75. .group({
  76. _id: '$msg_id',
  77. total: $.sum(1)
  78. })
  79. .sort({
  80. total: -1
  81. })
  82. .limit(10)
  83. .lookup({
  84. from: 'message',
  85. localField: '_id',
  86. foreignField: '_id',
  87. as: 'message'
  88. })
  89. .unwind('$message')
  90. .lookup({
  91. from: 'publisher',
  92. localField: 'message.pub_id',
  93. foreignField: '_id',
  94. as: 'message.publisher'
  95. })
  96. .unwind('$message.publisher')
  97. .end()
  98. return {
  99. list: reads.list,
  100. status: 'OK'
  101. }
  102. } else if (event.favorite) {
  103. const messages = await db.collection('message')
  104. .aggregate()
  105. .lookup({
  106. from: 'favorite',
  107. let: {
  108. msg_id: '$_id'
  109. },
  110. pipeline: $.pipeline()
  111. .match(_.expr($.and([
  112. $.eq(['$user_id', OPENID]),
  113. $.eq(['$msg_id', '$$msg_id'])
  114. ])))
  115. .project({
  116. _id: 0,
  117. favorite_time: 1
  118. }).done(),
  119. as: 'favorite'
  120. })
  121. .unwind('$favorite')
  122. .skip(event.page_token)
  123. .limit(event.page_size)
  124. .lookup({
  125. from: 'publisher',
  126. localField: 'pub_id',
  127. foreignField: '_id',
  128. as: 'publisher'
  129. })
  130. .unwind('$publisher')
  131. .end()
  132. return {
  133. list: messages.list,
  134. next_page_token: event.page_token + messages.list.length,
  135. status: 'OK'
  136. }
  137. } else if (event.filter) {
  138. let messages = db.collection('message')
  139. .aggregate()
  140. if (event.filter[1] !== '') {
  141. messages = messages.match({
  142. type: event.filter[1]
  143. })
  144. }
  145. if (event.filter[3] !== '') {
  146. messages = messages.match({
  147. tag: db.RegExp({
  148. regexp: event.filter[3],
  149. options: 'i'
  150. })
  151. })
  152. }
  153. messages = messages.lookup({
  154. from: 'publisher',
  155. localField: 'pub_id',
  156. foreignField: '_id',
  157. as: 'publisher'
  158. })
  159. .unwind('$publisher')
  160. if (event.filter[2] !== '') {
  161. if (event.filter[2] === '我关注的') {
  162. messages = messages.lookup({
  163. from: 'follow',
  164. let: {
  165. pub_id: '$pub_id'
  166. },
  167. pipeline: $.pipeline()
  168. .match(_.expr($.and([
  169. $.eq(['$user_id', OPENID]),
  170. $.eq(['$pub_id', '$$pub_id'])
  171. ])))
  172. .project({
  173. _id: 0,
  174. follow_time: 1
  175. }).done(),
  176. as: 'follow'
  177. })
  178. .unwind('$follow')
  179. } else {
  180. messages = messages.match({
  181. 'publisher.type': event.filter[2]
  182. })
  183. }
  184. }
  185. messages = await messages.sort({
  186. publish_time: -1
  187. })
  188. .skip(event.page_token)
  189. .limit(event.page_size)
  190. .end()
  191. return {
  192. list: messages.list,
  193. next_page_token: event.page_token + messages.list.length,
  194. status: 'OK'
  195. }
  196. } else {
  197. const messages = await db.collection('message')
  198. .aggregate()
  199. .sort({
  200. publish_time: -1
  201. })
  202. .skip(event.page_token)
  203. .limit(event.page_size)
  204. .lookup({
  205. from: 'publisher',
  206. localField: 'pub_id',
  207. foreignField: '_id',
  208. as: 'publisher'
  209. })
  210. .unwind('$publisher')
  211. .end()
  212. return {
  213. list: messages.list,
  214. next_page_token: event.page_token + messages.list.length,
  215. status: 'OK'
  216. }
  217. }
  218. }