From 25ba00a576403ca7d2731e281027c2720c332bd1 Mon Sep 17 00:00:00 2001 From: JoinTyang <41655440+JoinTyang@users.noreply.github.com> Date: Mon, 18 Dec 2023 15:36:37 +0800 Subject: [PATCH] all_repo_search_use_seasearch (#5832) --- frontend/src/components/search/search.js | 37 ++++++++++++++++++++---- frontend/src/pages/search/main-panel.js | 29 ++++++++++++++++++- seahub/ai/apis.py | 23 +++++++++++---- seahub/ai/utils.py | 12 ++++++++ 4 files changed, 88 insertions(+), 13 deletions(-) diff --git a/frontend/src/components/search/search.js b/frontend/src/components/search/search.js index f03091af4f..f362ca7675 100644 --- a/frontend/src/components/search/search.js +++ b/frontend/src/components/search/search.js @@ -3,7 +3,7 @@ import PropTypes from 'prop-types'; import isHotkey from 'is-hotkey'; import MediaQuery from 'react-responsive'; import { seafileAPI } from '../../utils/seafile-api'; -import { gettext, siteRoot } from '../../utils/constants'; +import { enableSeafileAI, gettext, siteRoot } from '../../utils/constants'; import SearchResultItem from './search-result-item'; import { Utils } from '../../utils/utils'; import { isMac } from '../../utils/extra-attributes'; @@ -280,10 +280,19 @@ class Search extends Component { this.setState({ isLoading: false }); }); } else { - this.updateSearchPageURL(queryData); - queryData['per_page'] = PER_PAGE; - queryData['page'] = page; - seafileAPI.searchFiles(queryData, cancelToken).then(res => { + if (enableSeafileAI) { + this.onAiSearch(queryData, cancelToken) + } else { + this.onNormalSearch(queryData, cancelToken, page) + } + } + }; + + onNormalSearch = (queryData, cancelToken, page) => { + this.updateSearchPageURL(queryData); + queryData['per_page'] = PER_PAGE; + queryData['page'] = page; + seafileAPI.searchFiles(queryData, cancelToken).then(res => { this.source = null; if (res.data.total > 0) { this.setState({ @@ -307,7 +316,23 @@ class Search extends Component { console.log(error); this.setState({ isLoading: false }); }); - } + } + + onAiSearch = (params, cancelToken) => { + let results = []; + seafileAPI.aiSearchFiles(params, cancelToken).then(res => { + results = [...results, ...this.formatResultItems(res.data.results)]; + this.setState({ + resultItems: results, + isResultGetted: true, + isLoading: false, + hasMore: false, + }); + }).catch(error => { + /* eslint-disable */ + console.log(error); + this.setState({ isLoading: false }); + }); }; onResultListScroll = (e) => { diff --git a/frontend/src/pages/search/main-panel.js b/frontend/src/pages/search/main-panel.js index 090eb131b0..c68278ff21 100644 --- a/frontend/src/pages/search/main-panel.js +++ b/frontend/src/pages/search/main-panel.js @@ -1,6 +1,6 @@ import React from 'react'; import deepCopy from 'deep-copy'; -import { gettext } from '../../utils/constants'; +import { gettext, enableSeafileAI } from '../../utils/constants'; import { seafileAPI } from '../../utils/seafile-api'; import SearchResults from './search-results'; import AdvancedSearch from './advanced-search'; @@ -49,6 +49,15 @@ class SearchViewPanel extends React.Component { isLoading: true, isResultGot: false, }); + + if (enableSeafileAI) { + this.onAiSearch(params) + } else { + this.onNormalSearch(params); + } + } + + onNormalSearch = (params) => { const stateHistory = deepCopy(this.state); seafileAPI.searchFiles(params, null).then(res => { const { results, has_more, total } = res.data; @@ -75,6 +84,24 @@ class SearchViewPanel extends React.Component { }); } + onAiSearch = (params) => { + let results = []; + seafileAPI.aiSearchFiles(params, null).then(res => { + results = [...results, ...this.formatResultItems(res.data.results)]; + this.setState({ + resultItems: results, + isResultGetted: true, + isLoading: false, + hasMore: false, + }); + }).catch(error => { + /* eslint-disable */ + console.log(error); + this.setState({ isLoading: false }); + }); + }; + + handleSearchParams = (page) => { let params = { q: this.state.q.trim(), page: page }; const ftype = this.getFileTypesList(); diff --git a/seahub/ai/apis.py b/seahub/ai/apis.py index a48bd5edf2..9755db823e 100644 --- a/seahub/ai/apis.py +++ b/seahub/ai/apis.py @@ -13,10 +13,11 @@ from seahub.api2.authentication import TokenAuthentication, SeafileAiAuthenticat from seahub.api2.utils import api_error from seahub.views import check_folder_permission -from seahub.utils.repo import parse_repo_perm +from seahub.utils.repo import parse_repo_perm, is_valid_repo_id_format from seahub.ai.utils import create_library_sdoc_index, search, update_library_sdoc_index, \ delete_library_index, query_task_status, query_library_index_state, question_answering_search_in_library,\ - get_file_download_token + get_file_download_token, get_search_repos +from seahub.utils import is_org_context from seaserv import seafile_api @@ -70,7 +71,7 @@ class Search(APIView): def post(self, request): query = request.data.get('query') - repo_id = request.data.get('repo_id') + search_repo = request.data.get('search_repo', 'all') try: count = int(request.data.get('count')) @@ -80,13 +81,23 @@ class Search(APIView): if not query: return api_error(status.HTTP_400_BAD_REQUEST, 'query invalid') - if not repo_id: - return api_error(status.HTTP_400_BAD_REQUEST, 'repo_id invalid') + if not is_valid_repo_id_format(search_repo) and search_repo != 'all': + error_msg = 'search_repo invalid.' + return api_error(status.HTTP_400_BAD_REQUEST, error_msg) + + if search_repo == 'all': + org_id = request.user.org.org_id if is_org_context(request) else None + repo_id_list = get_search_repos(request.user.username, org_id) + is_all_repo = True + else: + repo_id_list = [search_repo] + is_all_repo = False params = { 'query': query, - 'repo_id': repo_id, + 'repo_id_list': repo_id_list, 'count': count, + 'is_all_repo': is_all_repo, } try: diff --git a/seahub/ai/utils.py b/seahub/ai/utils.py index 5eefdc632b..ab31432fdb 100644 --- a/seahub/ai/utils.py +++ b/seahub/ai/utils.py @@ -5,6 +5,7 @@ import time from urllib.parse import urljoin from seahub.settings import SEAFILE_AI_SERVER_URL, SEAFILE_AI_SECRET_KEY +from seahub.utils import get_user_repos from seaserv import seafile_api @@ -68,3 +69,14 @@ def query_library_index_state(repo_id): def get_file_download_token(repo_id, file_id, username): return seafile_api.get_fileserver_access_token(repo_id, file_id, 'download', username, use_onetime=True) + + +def get_search_repos(username, org_id): + repo_id_list = [] + owned_repos, shared_repos, group_repos, public_repos = get_user_repos(username, org_id=org_id) + repo_list = owned_repos + shared_repos + group_repos + public_repos + + for repo in repo_list: + repo_id_list.append(repo.id) + + return repo_id_list