diff options
| author | syuilo <Syuilotan@yahoo.co.jp> | 2020-01-30 04:37:25 +0900 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2020-01-30 04:37:25 +0900 |
| commit | f6154dc0af1a0d65819e87240f4385f9573095cb (patch) | |
| tree | 699a5ca07d6727b7f8497d4769f25d6d62f94b5a /src/server/api/endpoints/notes/search.ts | |
| parent | Add Event activity-type support (#5785) (diff) | |
| download | misskey-f6154dc0af1a0d65819e87240f4385f9573095cb.tar.gz misskey-f6154dc0af1a0d65819e87240f4385f9573095cb.tar.bz2 misskey-f6154dc0af1a0d65819e87240f4385f9573095cb.zip | |
v12 (#5712)
Co-authored-by: MeiMei <30769358+mei23@users.noreply.github.com>
Co-authored-by: Satsuki Yanagi <17376330+u1-liquid@users.noreply.github.com>
Diffstat (limited to 'src/server/api/endpoints/notes/search.ts')
| -rw-r--r-- | src/server/api/endpoints/notes/search.ts | 133 |
1 files changed, 72 insertions, 61 deletions
diff --git a/src/server/api/endpoints/notes/search.ts b/src/server/api/endpoints/notes/search.ts index 5557b469e4..efc08d0d4a 100644 --- a/src/server/api/endpoints/notes/search.ts +++ b/src/server/api/endpoints/notes/search.ts @@ -1,11 +1,13 @@ import $ from 'cafy'; import es from '../../../../db/elasticsearch'; import define from '../../define'; -import { ApiError } from '../../error'; import { Notes } from '../../../../models'; import { In } from 'typeorm'; import { ID } from '../../../../misc/cafy-id'; import config from '../../../../config'; +import { makePaginationQuery } from '../../common/make-pagination-query'; +import { generateVisibilityQuery } from '../../common/generate-visibility-query'; +import { generateMuteQuery } from '../../common/generate-mute-query'; export const meta = { desc: { @@ -22,16 +24,19 @@ export const meta = { validator: $.str }, + sinceId: { + validator: $.optional.type(ID), + }, + + untilId: { + validator: $.optional.type(ID), + }, + limit: { validator: $.optional.num.range(1, 100), default: 10 }, - offset: { - validator: $.optional.num.min(0), - default: 0 - }, - host: { validator: $.optional.nullable.str, default: undefined @@ -54,74 +59,80 @@ export const meta = { }, errors: { - searchingNotAvailable: { - message: 'Searching not available.', - code: 'SEARCHING_NOT_AVAILABLE', - id: '7ee9c119-16a1-479f-a6fd-6fab00ed946f' - } } }; export default define(meta, async (ps, me) => { - if (es == null) throw new ApiError(meta.errors.searchingNotAvailable); + if (es == null) { + const query = makePaginationQuery(Notes.createQueryBuilder('note'), ps.sinceId, ps.untilId) + .andWhere('note.text ILIKE :q', { q: `%${ps.query}%` }) + .leftJoinAndSelect('note.user', 'user'); - const userQuery = ps.userId != null ? [{ - term: { - userId: ps.userId - } - }] : []; + generateVisibilityQuery(query, me); + if (me) generateMuteQuery(query, me); - const hostQuery = ps.userId == null ? - ps.host === null ? [{ - bool: { - must_not: { - exists: { - field: 'userHost' - } - } - } - }] : ps.host !== undefined ? [{ + const notes = await query.take(ps.limit!).getMany(); + + return await Notes.packMany(notes, me); + } else { + const userQuery = ps.userId != null ? [{ term: { - userHost: ps.host + userId: ps.userId } - }] : [] - : []; + }] : []; - const result = await es.search({ - index: config.elasticsearch.index || 'misskey_note', - body: { - size: ps.limit!, - from: ps.offset, - query: { + const hostQuery = ps.userId == null ? + ps.host === null ? [{ bool: { - must: [{ - simple_query_string: { - fields: ['text'], - query: ps.query.toLowerCase(), - default_operator: 'and' - }, - }, ...hostQuery, ...userQuery] + must_not: { + exists: { + field: 'userHost' + } + } } - }, - sort: [{ - _doc: 'desc' - }] - } - }); + }] : ps.host !== undefined ? [{ + term: { + userHost: ps.host + } + }] : [] + : []; + + const result = await es.search({ + index: config.elasticsearch.index || 'misskey_note', + body: { + size: ps.limit!, + from: ps.offset, + query: { + bool: { + must: [{ + simple_query_string: { + fields: ['text'], + query: ps.query.toLowerCase(), + default_operator: 'and' + }, + }, ...hostQuery, ...userQuery] + } + }, + sort: [{ + _doc: 'desc' + }] + } + }); - const hits = result.body.hits.hits.map((hit: any) => hit._id); + const hits = result.body.hits.hits.map((hit: any) => hit._id); - if (hits.length === 0) return []; + if (hits.length === 0) return []; - // Fetch found notes - const notes = await Notes.find({ - where: { - id: In(hits) - }, - order: { - id: -1 - } - }); + // Fetch found notes + const notes = await Notes.find({ + where: { + id: In(hits) + }, + order: { + id: -1 + } + }); - return await Notes.packMany(notes, me); + return await Notes.packMany(notes, me); + } }); |