diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2018-07-04 13:21:30 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2018-07-04 13:21:30 +0900 |
| commit | 67afe968b4385584e373b9e619617051159759ea (patch) | |
| tree | 44993d1d638814818daf5b3db2b857f061423a4c /src/server/api/endpoints | |
| parent | Merge pull request #1839 from syuilo/greenkeeper/elasticsearch-15.1.1 (diff) | |
| download | sharkey-67afe968b4385584e373b9e619617051159759ea.tar.gz sharkey-67afe968b4385584e373b9e619617051159759ea.tar.bz2 sharkey-67afe968b4385584e373b9e619617051159759ea.zip | |
wip
Diffstat (limited to 'src/server/api/endpoints')
| -rw-r--r-- | src/server/api/endpoints/notes/search.ts | 63 |
1 files changed, 63 insertions, 0 deletions
diff --git a/src/server/api/endpoints/notes/search.ts b/src/server/api/endpoints/notes/search.ts new file mode 100644 index 0000000000..20c628b84d --- /dev/null +++ b/src/server/api/endpoints/notes/search.ts @@ -0,0 +1,63 @@ +import $ from 'cafy'; +import * as mongo from 'mongodb'; +import Note from '../../../../models/note'; +import { ILocalUser } from '../../../../models/user'; +import { pack } from '../../../../models/note'; +import es from '../../../../db/elasticsearch'; + +module.exports = (params: any, me: ILocalUser) => new Promise(async (res, rej) => { + // Get 'query' parameter + const [query, queryError] = $.str.get(params.query); + if (queryError) return rej('invalid query param'); + + // Get 'offset' parameter + const [offset = 0, offsetErr] = $.num.optional().min(0).get(params.offset); + if (offsetErr) return rej('invalid offset param'); + + // Get 'limit' parameter + const [limit = 10, limitErr] = $.num.optional().range(1, 30).get(params.limit); + if (limitErr) return rej('invalid limit param'); + + es.search({ + index: 'misskey', + type: 'note', + body: { + size: limit, + from: offset, + query: { + simple_query_string: { + fields: ['text'], + query: query, + default_operator: 'and' + } + }, + sort: [ + { _doc: 'desc' } + ] + } + }, async (error, response) => { + if (error) { + console.error(error); + return res(500); + } + + if (response.hits.total === 0) { + return res([]); + } + + const hits = response.hits.hits.map(hit => new mongo.ObjectID(hit._id)); + + // Fetch found notes + const notes = await Note.find({ + _id: { + $in: hits + } + }, { + sort: { + _id: -1 + } + }); + + res(await Promise.all(notes.map(note => pack(note, me)))); + }); +}); |