diff --git a/client/components/Api/Api.vue b/client/components/Api/Api.vue index 7b34ed3..84bec97 100644 --- a/client/components/Api/Api.vue +++ b/client/components/Api/Api.vue @@ -235,6 +235,10 @@ class Api { return await this.request({action: 'search', from, query}, 30); } + async bookSearch(query) { + return await this.request({action: 'bookSearch', query}, 30); + } + async getAuthorBookList(authorId) { return await this.request({action: 'get-author-book-list', authorId}); } diff --git a/client/components/Search/Search.vue b/client/components/Search/Search.vue index 4292d95..c1cacd9 100644 --- a/client/components/Search/Search.vue +++ b/client/components/Search/Search.vue @@ -256,6 +256,7 @@ const route2component = { 'author': {component: 'AuthorList', label: 'Авторы'}, 'series': {component: 'SeriesList', label: 'Серии'}, 'title': {component: 'TitleList', label: 'Книги'}, + 'extended': {component: 'TitleList', label: 'Расширенный поиск'}, }; const componentOptions = { @@ -529,7 +530,13 @@ class Search { get listOptions() { const result = []; for (const [route, rec] of Object.entries(route2component)) - result.push({label: rec.label, value: route}); + if (route == 'extended') { + if (this.config.extendedSearch) { + result.push({value: route, icon: 'la la-code', size: '10px'}); + } + } else { + result.push({label: rec.label, value: route, icon: rec.icon}); + } return result; } diff --git a/client/router.js b/client/router.js index 24cbe4d..0316b46 100644 --- a/client/router.js +++ b/client/router.js @@ -8,6 +8,7 @@ const myRoutes = [ ['/author', Search], ['/series', Search], ['/title', Search], + ['/extended', Search], ['/:pathMatch(.*)*', null, null, '/'], ]; diff --git a/server/controllers/WebSocketController.js b/server/controllers/WebSocketController.js index 73344b4..8c718c2 100644 --- a/server/controllers/WebSocketController.js +++ b/server/controllers/WebSocketController.js @@ -87,6 +87,8 @@ class WebSocketController { await this.getWorkerState(req, ws); break; case 'search': await this.search(req, ws); break; + case 'bookSearch': + await this.bookSearch(req, ws); break; case 'get-author-book-list': await this.getAuthorBookList(req, ws); break; case 'get-author-series-list': @@ -165,6 +167,17 @@ class WebSocketController { this.send(result, req, ws); } + async bookSearch(req, ws) { + if (!this.config.extendedSearch) + throw new Error('config.extendedSearch disabled'); + if (!req.query) + throw new Error(`query is empty`); + + const result = await this.webWorker.bookSearch(req.query); + + this.send(result, req, ws); + } + async getAuthorBookList(req, ws) { const result = await this.webWorker.getAuthorBookList(req.authorId); diff --git a/server/core/WebWorker.js b/server/core/WebWorker.js index b8d7a01..650868b 100644 --- a/server/core/WebWorker.js +++ b/server/core/WebWorker.js @@ -268,6 +268,17 @@ class WebWorker { return result; } + async bookSearch(query) { + this.checkMyState(); + + const result = await this.dbSearcher.bookSearch(query); + + const config = await this.dbConfig(); + result.inpxHash = (config.inpxHash ? config.inpxHash : ''); + + return result; + } + async opdsQuery(from, query) { this.checkMyState();