Add search target check params
authorChocobozzz <me@florianbigard.com>
Tue, 9 Jun 2020 14:39:45 +0000 (16:39 +0200)
committerChocobozzz <chocobozzz@cpy.re>
Wed, 10 Jun 2020 12:02:41 +0000 (14:02 +0200)
client/src/app/header/search-typeahead.component.ts
config/test.yaml
server/helpers/custom-validators/search.ts
server/middlewares/validators/search.ts
server/tests/api/check-params/search.ts
shared/models/search/videos-search-query.model.ts

index 6c8b8efee30f549898792919574178f988662d9f..7d04e0f6d42b616535e896e332b334898378c6b6 100644 (file)
@@ -112,10 +112,10 @@ export class SearchTypeaheadComponent implements OnInit, AfterViewInit, AfterVie
     const searchIndexConfig = this.serverConfig.search.searchIndex
 
     if (!this.activeSearch) {
-      if (searchIndexConfig.enabled && searchIndexConfig.isDefaultSearch) {
-        this.activeSearch = 'search-instance'
-      } else {
+      if (searchIndexConfig.enabled && (searchIndexConfig.isDefaultSearch || searchIndexConfig.disableLocalSearch)) {
         this.activeSearch = 'search-index'
+      } else {
+        this.activeSearch = 'search-instance'
       }
     }
 
index da34ccd03e8693a51cdb787827184c22ba4e9f59..fb37ff8c7a3c09fd65a7bd27f582393b5875f71a 100644 (file)
@@ -110,7 +110,7 @@ search:
   # Use a third party index instead of your local index, only for search results
   # Useful to discover content outside of your instance
   search_index:
-    enabled: true
+    enabled: false
     # URL of the search index, that should use the same search API and routes
     # than PeerTube: https://docs.joinpeertube.org/api-rest-reference.html
     # You should deploy your own with https://framagit.org/framasoft/peertube/search-index,
index bb17134c391926a14f775d88a0a542df34b7d5f5..429fcafcf9525f94e392f88baeb687a559d88a36 100644 (file)
@@ -1,5 +1,7 @@
 import validator from 'validator'
-import { isArray } from './misc'
+import { SearchTargetType } from '@shared/models/search/search-target-query.model'
+import { isArray, exists } from './misc'
+import { CONFIG } from '@server/initializers/config'
 
 function isNumberArray (value: any) {
   return isArray(value) && value.every(v => validator.isInt('' + v))
@@ -13,10 +15,23 @@ function isNSFWQueryValid (value: any) {
   return value === 'true' || value === 'false' || value === 'both'
 }
 
+function isSearchTargetValid (value: SearchTargetType) {
+  if (!exists(value)) return true
+
+  const searchIndexConfig = CONFIG.SEARCH.SEARCH_INDEX
+
+  if (value === 'local' && (!searchIndexConfig.ENABLED || !searchIndexConfig.DISABLE_LOCAL_SEARCH)) return true
+
+  if (value === 'search-index' && searchIndexConfig.ENABLED) return true
+
+  return false
+}
+
 // ---------------------------------------------------------------------------
 
 export {
   isNumberArray,
   isStringArray,
-  isNSFWQueryValid
+  isNSFWQueryValid,
+  isSearchTargetValid
 }
index 5a3c83f2ca9bbe18033426fbca9c4c618907cafc..b4faa8894ab8620330f9187514f4bb5ef3244d1b 100644 (file)
@@ -3,6 +3,7 @@ import { areValidationErrors } from './utils'
 import { logger } from '../../helpers/logger'
 import { query } from 'express-validator'
 import { isDateValid } from '../../helpers/custom-validators/misc'
+import { isSearchTargetValid } from '@server/helpers/custom-validators/search'
 
 const videosSearchValidator = [
   query('search').optional().not().isEmpty().withMessage('Should have a valid search'),
@@ -16,6 +17,8 @@ const videosSearchValidator = [
   query('durationMin').optional().isInt().withMessage('Should have a valid min duration'),
   query('durationMax').optional().isInt().withMessage('Should have a valid max duration'),
 
+  query('searchTarget').optional().custom(isSearchTargetValid).withMessage('Should have a valid search target'),
+
   (req: express.Request, res: express.Response, next: express.NextFunction) => {
     logger.debug('Checking videos search query', { parameters: req.query })
 
@@ -27,6 +30,7 @@ const videosSearchValidator = [
 
 const videoChannelsSearchValidator = [
   query('search').not().isEmpty().withMessage('Should have a valid search'),
+  query('searchTarget').optional().custom(isSearchTargetValid).withMessage('Should have a valid search target'),
 
   (req: express.Request, res: express.Response, next: express.NextFunction) => {
     logger.debug('Checking video channels search query', { parameters: req.query })
index f8d0cd4ecea43664d03aa1a03872aee67394d2db..1a8a7235e7a488aabbb1ebc8fc90d61faf9b1772 100644 (file)
@@ -1,14 +1,32 @@
 /* eslint-disable @typescript-eslint/no-unused-expressions,@typescript-eslint/require-await */
 
 import 'mocha'
-
-import { cleanupTests, flushAndRunServer, immutableAssign, makeGetRequest, ServerInfo } from '../../../../shared/extra-utils'
+import {
+  cleanupTests,
+  flushAndRunServer,
+  immutableAssign,
+  makeGetRequest,
+  ServerInfo,
+  updateCustomSubConfig,
+  setAccessTokensToServers
+} from '../../../../shared/extra-utils'
 import {
   checkBadCountPagination,
   checkBadSortPagination,
   checkBadStartPagination
 } from '../../../../shared/extra-utils/requests/check-api-params'
 
+function updateSearchIndex (server: ServerInfo, enabled: boolean, disableLocalSearch = false) {
+  return updateCustomSubConfig(server.url, server.accessToken, {
+    search: {
+      searchIndex: {
+        enabled,
+        disableLocalSearch
+      }
+    }
+  })
+}
+
 describe('Test videos API validator', function () {
   let server: ServerInfo
 
@@ -18,6 +36,7 @@ describe('Test videos API validator', function () {
     this.timeout(30000)
 
     server = await flushAndRunServer(1)
+    await setAccessTokensToServers([ server ])
   })
 
   describe('When searching videos', function () {
@@ -144,6 +163,62 @@ describe('Test videos API validator', function () {
     })
   })
 
+  describe('Search target', function () {
+
+    it('Should fail/succeed depending on the search target', async function () {
+      this.timeout(10000)
+
+      const query = { search: 'coucou' }
+      const paths = [
+        '/api/v1/search/video-channels/',
+        '/api/v1/search/videos/'
+      ]
+
+      for (const path of paths) {
+        {
+          const customQuery = immutableAssign(query, { searchTarget: 'hello' })
+          await makeGetRequest({ url: server.url, path, query: customQuery, statusCodeExpected: 400 })
+        }
+
+        {
+          const customQuery = immutableAssign(query, { searchTarget: undefined })
+          await makeGetRequest({ url: server.url, path, query: customQuery, statusCodeExpected: 200 })
+        }
+
+        {
+          const customQuery = immutableAssign(query, { searchTarget: 'local' })
+          await makeGetRequest({ url: server.url, path, query: customQuery, statusCodeExpected: 200 })
+        }
+
+        {
+          const customQuery = immutableAssign(query, { searchTarget: 'search-index' })
+          await makeGetRequest({ url: server.url, path, query: customQuery, statusCodeExpected: 400 })
+        }
+
+        await updateSearchIndex(server, true, true)
+
+        {
+          const customQuery = immutableAssign(query, { searchTarget: 'local' })
+          await makeGetRequest({ url: server.url, path, query: customQuery, statusCodeExpected: 400 })
+        }
+
+        {
+          const customQuery = immutableAssign(query, { searchTarget: 'search-index' })
+          await makeGetRequest({ url: server.url, path, query: customQuery, statusCodeExpected: 200 })
+        }
+
+        await updateSearchIndex(server, true, false)
+
+        {
+          const customQuery = immutableAssign(query, { searchTarget: 'local' })
+          await makeGetRequest({ url: server.url, path, query: customQuery, statusCodeExpected: 200 })
+        }
+
+        await updateSearchIndex(server, false, false)
+      }
+    })
+  })
+
   after(async function () {
     await cleanupTests([ server ])
   })
index bd6bb5bc125f67f158db30e2ad6bef35aaee693f..3ce4ff73e3f66edabb41ecef8160e75f0630c614 100644 (file)
@@ -1,10 +1,8 @@
-import { NSFWQuery } from './nsfw-query.model'
 import { VideoFilter } from '../videos'
+import { NSFWQuery } from './nsfw-query.model'
 import { SearchTargetQuery } from './search-target-query.model'
 
 export interface VideosSearchQuery extends SearchTargetQuery {
-  forceLocalSearch?: boolean
-
   search?: string
 
   start?: number