|
| 1 | +'use strict'; |
| 2 | + |
| 3 | +const Service = require('egg').Service; |
| 4 | + |
| 5 | +class SearchService extends Service { |
| 6 | + constructor(app) { |
| 7 | + super(app); |
| 8 | + this.limit = this.config.list_topic_count; |
| 9 | + } |
| 10 | + |
| 11 | + /* |
| 12 | + * 根据关键字查询本地数据库 |
| 13 | + */ |
| 14 | + async searchLocal(query, keyword) { |
| 15 | + const { tab } = query; |
| 16 | + const page = parseInt(query.page) || 1; |
| 17 | + let users = []; |
| 18 | + let topics = []; |
| 19 | + let data = []; |
| 20 | + let count = this.limit; |
| 21 | + |
| 22 | + switch (tab) { |
| 23 | + case 'user': |
| 24 | + [ data, count ] = await this.searchUser(keyword, page); |
| 25 | + break; |
| 26 | + case 'topic': |
| 27 | + [ data, count ] = await this.searchTopic(keyword, page); |
| 28 | + break; |
| 29 | + default: |
| 30 | + [ users, topics ] = await this.searchUserAndTopic(keyword, page); |
| 31 | + } |
| 32 | + |
| 33 | + const pages = Math.ceil(count / this.limit); |
| 34 | + return { |
| 35 | + keyword, |
| 36 | + data, |
| 37 | + users, |
| 38 | + topics, |
| 39 | + current_page: parseInt(query.page) || 1, |
| 40 | + tab, |
| 41 | + pages, |
| 42 | + base: '/search?q=' + keyword, |
| 43 | + }; |
| 44 | + } |
| 45 | + |
| 46 | + queryFactory(keyword, searchKey, page) { |
| 47 | + const opt = { skip: (page - 1) * this.limit, limit: this.limit, sort: '-create_at' }; |
| 48 | + return [ |
| 49 | + { [searchKey]: { $regex: new RegExp(keyword, 'i') } }, |
| 50 | + opt, |
| 51 | + ]; |
| 52 | + } |
| 53 | + |
| 54 | + /* |
| 55 | + * 根据关键字查找用户列表 |
| 56 | + * @param {String} keyword 关键字, {Number} page 第几页 |
| 57 | + * @return {Promise[data, count]} 承载用户列表, 查询总数的 Promise 对象 |
| 58 | + */ |
| 59 | + searchUser(keyword, page) { |
| 60 | + const searchQuery = this.queryFactory(keyword, 'name', page); |
| 61 | + return Promise.all([ |
| 62 | + this.service.user.getUsersByQuery(...searchQuery), |
| 63 | + this.service.user.getCountByQuery(...searchQuery), |
| 64 | + ]); |
| 65 | + } |
| 66 | + |
| 67 | + /* |
| 68 | + * 根据关键字查找帖子列表 |
| 69 | + * @param {String} keyword 关键字, {Number} page 第几页 |
| 70 | + * @return {Promise[data, count]} 承载帖子列表, 查询总数的 Promise 对象 |
| 71 | + */ |
| 72 | + searchTopic(keyword, page) { |
| 73 | + const searchQuery = this.queryFactory(keyword, 'title', page); |
| 74 | + return Promise.all([ |
| 75 | + this.service.topic.getTopicsByQuery(...searchQuery), |
| 76 | + this.service.topic.getCountByQuery(...searchQuery), |
| 77 | + ]); |
| 78 | + } |
| 79 | + |
| 80 | + /* |
| 81 | + * 根据关键字查找用户和帖子列表 |
| 82 | + * @param {String} keyword 关键字, {Number} page 第几页 |
| 83 | + * @return {Promise[data, count]} 承载用户列表, 帖子列表的 Promise 对象 |
| 84 | + */ |
| 85 | + searchUserAndTopic(keyword, page) { |
| 86 | + const userQuery = this.queryFactory(keyword, 'name', page); |
| 87 | + const topicQuery = this.queryFactory(keyword, 'title', page); |
| 88 | + return Promise.all([ |
| 89 | + this.service.user.getUsersByQuery(...userQuery), |
| 90 | + this.service.topic.getTopicsByQuery(...topicQuery), |
| 91 | + ]); |
| 92 | + } |
| 93 | +} |
| 94 | + |
| 95 | +module.exports = SearchService; |
0 commit comments