Support handles and uuids filters
This commit is contained in:
parent
cf445ace4e
commit
ac0eb5f3ac
2
PeerTube
2
PeerTube
|
@ -1 +1 @@
|
||||||
Subproject commit 28be9d1d3ee92db7c9fd84c82e4ea20900eab0f5
|
Subproject commit b033851fb54241bb703f86add025229e68cc6f59
|
|
@ -32,6 +32,14 @@ export { searchChannelsRouter }
|
||||||
async function searchChannels (req: express.Request, res: express.Response) {
|
async function searchChannels (req: express.Request, res: express.Response) {
|
||||||
const query = Object.assign(req.query || {}, req.body || {}) as ChannelsSearchQuery
|
const query = Object.assign(req.query || {}, req.body || {}) as ChannelsSearchQuery
|
||||||
|
|
||||||
|
if (query.handles && query.fromHost) {
|
||||||
|
query.handles = query.handles.map(h => {
|
||||||
|
if (h.includes('@')) return h
|
||||||
|
|
||||||
|
return h + '@' + query.fromHost
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
const searcher = new Searcher(queryChannels, formatChannelForAPI)
|
const searcher = new Searcher(queryChannels, formatChannelForAPI)
|
||||||
const result = await searcher.getResult(query)
|
const result = await searcher.getResult(query)
|
||||||
|
|
||||||
|
|
|
@ -32,7 +32,6 @@ export { searchVideosRouter }
|
||||||
|
|
||||||
async function searchVideos (req: express.Request, res: express.Response) {
|
async function searchVideos (req: express.Request, res: express.Response) {
|
||||||
const query = Object.assign(req.query || {}, req.body || {}) as VideosSearchQuery
|
const query = Object.assign(req.query || {}, req.body || {}) as VideosSearchQuery
|
||||||
|
|
||||||
const searcher = new Searcher(queryVideos, formatVideoForAPI)
|
const searcher = new Searcher(queryVideos, formatVideoForAPI)
|
||||||
const result = await searcher.getResult(query)
|
const result = await searcher.getResult(query)
|
||||||
|
|
||||||
|
|
|
@ -51,6 +51,14 @@ async function queryChannels (search: ChannelsSearchQuery) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (search.handles) {
|
||||||
|
filter.push({
|
||||||
|
terms: {
|
||||||
|
handle: search.handles
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
if (filter.length !== 0) {
|
if (filter.length !== 0) {
|
||||||
Object.assign(bool, { filter })
|
Object.assign(bool, { filter })
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,6 +5,7 @@ import { CONFIG, ELASTIC_SEARCH_QUERY } from '../../initializers/constants'
|
||||||
import { DBPlaylist, EnhancedPlaylist, IndexablePlaylist } from '../../types/playlist.model'
|
import { DBPlaylist, EnhancedPlaylist, IndexablePlaylist } from '../../types/playlist.model'
|
||||||
import { PlaylistsSearchQuery } from '../../types/search-query/playlist-search.model'
|
import { PlaylistsSearchQuery } from '../../types/search-query/playlist-search.model'
|
||||||
import { buildSort, extractQueryResult } from './elastic-search-queries'
|
import { buildSort, extractQueryResult } from './elastic-search-queries'
|
||||||
|
import { addUUIDFilters } from './shared'
|
||||||
import { buildChannelOrAccountSummaryMapping, formatActorForDB, formatActorSummaryForAPI } from './shared/elastic-search-actor'
|
import { buildChannelOrAccountSummaryMapping, formatActorForDB, formatActorSummaryForAPI } from './shared/elastic-search-actor'
|
||||||
|
|
||||||
async function queryPlaylists (search: PlaylistsSearchQuery) {
|
async function queryPlaylists (search: PlaylistsSearchQuery) {
|
||||||
|
@ -50,6 +51,10 @@ async function queryPlaylists (search: PlaylistsSearchQuery) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (search.uuids) {
|
||||||
|
addUUIDFilters(filter, search.uuids)
|
||||||
|
}
|
||||||
|
|
||||||
if (filter.length !== 0) {
|
if (filter.length !== 0) {
|
||||||
Object.assign(bool, { filter })
|
Object.assign(bool, { filter })
|
||||||
}
|
}
|
||||||
|
|
|
@ -7,6 +7,7 @@ import { CONFIG, ELASTIC_SEARCH_QUERY } from '../../initializers/constants'
|
||||||
import { VideosSearchQuery } from '../../types/search-query/video-search.model'
|
import { VideosSearchQuery } from '../../types/search-query/video-search.model'
|
||||||
import { DBVideo, DBVideoDetails, EnhancedVideo, IndexableVideo, IndexableVideoDetails } from '../../types/video.model'
|
import { DBVideo, DBVideoDetails, EnhancedVideo, IndexableVideo, IndexableVideoDetails } from '../../types/video.model'
|
||||||
import { buildSort, extractQueryResult } from './elastic-search-queries'
|
import { buildSort, extractQueryResult } from './elastic-search-queries'
|
||||||
|
import { addUUIDFilters } from './shared'
|
||||||
import { buildChannelOrAccountSummaryMapping, formatActorForDB, formatActorSummaryForAPI } from './shared/elastic-search-actor'
|
import { buildChannelOrAccountSummaryMapping, formatActorForDB, formatActorSummaryForAPI } from './shared/elastic-search-actor'
|
||||||
|
|
||||||
async function queryVideos (search: VideosSearchQuery) {
|
async function queryVideos (search: VideosSearchQuery) {
|
||||||
|
@ -162,7 +163,7 @@ async function queryVideos (search: VideosSearchQuery) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
if (exists(search.host)) {
|
if (search.host) {
|
||||||
filter.push({
|
filter.push({
|
||||||
term: {
|
term: {
|
||||||
'account.host': search.host
|
'account.host': search.host
|
||||||
|
@ -170,6 +171,10 @@ async function queryVideos (search: VideosSearchQuery) {
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (search.uuids) {
|
||||||
|
addUUIDFilters(filter, search.uuids)
|
||||||
|
}
|
||||||
|
|
||||||
Object.assign(bool, { filter })
|
Object.assign(bool, { filter })
|
||||||
|
|
||||||
if (mustNot.length !== 0) {
|
if (mustNot.length !== 0) {
|
||||||
|
|
|
@ -1,2 +1,3 @@
|
||||||
export * from './elastic-search-actor'
|
export * from './elastic-search-actor'
|
||||||
export * from './elastic-search-avatar'
|
export * from './elastic-search-avatar'
|
||||||
|
export * from './query-helpers'
|
||||||
|
|
|
@ -0,0 +1,36 @@
|
||||||
|
import validator from 'validator'
|
||||||
|
|
||||||
|
function addUUIDFilters (filters: any[], uuids: string[]) {
|
||||||
|
if (!filters) return
|
||||||
|
|
||||||
|
const result = {
|
||||||
|
shortUUIDs: [] as string[],
|
||||||
|
uuids: [] as string[]
|
||||||
|
}
|
||||||
|
|
||||||
|
for (const uuid of uuids) {
|
||||||
|
if (validator.isUUID(uuid)) result.uuids.push(uuid)
|
||||||
|
else result.shortUUIDs.push(uuid)
|
||||||
|
}
|
||||||
|
|
||||||
|
filters.push({
|
||||||
|
bool: {
|
||||||
|
should: [
|
||||||
|
{
|
||||||
|
terms: {
|
||||||
|
uuid: result.uuids
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
terms: {
|
||||||
|
shortUUID: result.shortUUIDs
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
export {
|
||||||
|
addUUIDFilters
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
import { check } from 'express-validator'
|
|
||||||
import * as express from 'express'
|
import * as express from 'express'
|
||||||
|
import { check } from 'express-validator'
|
||||||
import { isDateValid, toArray } from '../../helpers/custom-validators/misc'
|
import { isDateValid, toArray } from '../../helpers/custom-validators/misc'
|
||||||
import { isNSFWQueryValid, isNumberArray, isStringArray } from '../../helpers/custom-validators/search-videos'
|
import { isNSFWQueryValid, isNumberArray, isStringArray } from '../../helpers/custom-validators/search-videos'
|
||||||
import { logger } from '../../helpers/logger'
|
import { logger } from '../../helpers/logger'
|
||||||
|
@ -78,6 +78,10 @@ const videosSearchValidator = [
|
||||||
.customSanitizer(toArray)
|
.customSanitizer(toArray)
|
||||||
.custom(isStringArray).withMessage('Should have a valid boostLanguages array'),
|
.custom(isStringArray).withMessage('Should have a valid boostLanguages array'),
|
||||||
|
|
||||||
|
check('uuids')
|
||||||
|
.optional()
|
||||||
|
.toArray(),
|
||||||
|
|
||||||
(req: express.Request, res: express.Response, next: express.NextFunction) => {
|
(req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||||||
logger.debug({ query: req.query, body: req.body }, 'Checking videos search query')
|
logger.debug({ query: req.query, body: req.body }, 'Checking videos search query')
|
||||||
|
|
||||||
|
@ -88,8 +92,9 @@ const videosSearchValidator = [
|
||||||
]
|
]
|
||||||
|
|
||||||
const videoChannelsSearchValidator = [
|
const videoChannelsSearchValidator = [
|
||||||
check('search').not().isEmpty().withMessage('Should have a valid search'),
|
check('search').optional().not().isEmpty().withMessage('Should have a valid search'),
|
||||||
check('host').optional().not().isEmpty().withMessage('Should have a valid host'),
|
check('host').optional().not().isEmpty().withMessage('Should have a valid host'),
|
||||||
|
check('handles').optional().toArray(),
|
||||||
|
|
||||||
(req: express.Request, res: express.Response, next: express.NextFunction) => {
|
(req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||||||
logger.debug({ query: req.query, body: req.body }, 'Checking video channels search query')
|
logger.debug({ query: req.query, body: req.body }, 'Checking video channels search query')
|
||||||
|
@ -101,9 +106,14 @@ const videoChannelsSearchValidator = [
|
||||||
]
|
]
|
||||||
|
|
||||||
const videoPlaylistsSearchValidator = [
|
const videoPlaylistsSearchValidator = [
|
||||||
check('search').not().isEmpty().withMessage('Should have a valid search'),
|
check('search').optional().not().isEmpty().withMessage('Should have a valid search'),
|
||||||
|
|
||||||
check('host').optional().not().isEmpty().withMessage('Should have a valid host'),
|
check('host').optional().not().isEmpty().withMessage('Should have a valid host'),
|
||||||
|
|
||||||
|
check('uuids')
|
||||||
|
.optional()
|
||||||
|
.toArray(),
|
||||||
|
|
||||||
(req: express.Request, res: express.Response, next: express.NextFunction) => {
|
(req: express.Request, res: express.Response, next: express.NextFunction) => {
|
||||||
logger.debug({ query: req.query, body: req.body }, 'Checking video playlists search query')
|
logger.debug({ query: req.query, body: req.body }, 'Checking video playlists search query')
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue