diff options
Diffstat (limited to 'apps/files/src/services/Recent.ts')
-rw-r--r-- | apps/files/src/services/Recent.ts | 92 |
1 files changed, 44 insertions, 48 deletions
diff --git a/apps/files/src/services/Recent.ts b/apps/files/src/services/Recent.ts index 47f31466dd2..d0ca285b05c 100644 --- a/apps/files/src/services/Recent.ts +++ b/apps/files/src/services/Recent.ts @@ -1,38 +1,29 @@ /** - * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> - * - * @author John Molakvoæ <skjnldsv@protonmail.com> - * @author Ferdinand Thiessen <opensource@fthiessen.de> - * - * @license AGPL-3.0-or-later - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as - * published by the Free Software Foundation, either version 3 of the - * License, or (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - * + * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors + * SPDX-License-Identifier: AGPL-3.0-or-later */ import type { ContentsWithRoot, Node } from '@nextcloud/files' -import type { FileStat, ResponseDataDetailed } from 'webdav' +import type { FileStat, ResponseDataDetailed, SearchResult } from 'webdav' import { getCurrentUser } from '@nextcloud/auth' -import { Folder, Permission, davGetRecentSearch, davGetClient, davResultToNode, davRootPath, davRemoteURL } from '@nextcloud/files' +import { Folder, Permission, davGetRecentSearch, davRootPath, davRemoteURL, davResultToNode } from '@nextcloud/files' +import { CancelablePromise } from 'cancelable-promise' import { useUserConfigStore } from '../store/userconfig.ts' -import { pinia } from '../store/index.ts' - -const client = davGetClient() +import { getPinia } from '../store/index.ts' +import { client } from './WebdavClient.ts' +import { getBaseUrl } from '@nextcloud/router' const lastTwoWeeksTimestamp = Math.round((Date.now() / 1000) - (60 * 60 * 24 * 14)) /** + * Helper to map a WebDAV result to a Nextcloud node + * The search endpoint already includes the dav remote URL so we must not include it in the source + * + * @param stat the WebDAV result + */ +const resultToNode = (stat: FileStat) => davResultToNode(stat, davRootPath, getBaseUrl()) + +/** * Get recently changed nodes * * This takes the users preference about hidden files into account. @@ -40,8 +31,9 @@ const lastTwoWeeksTimestamp = Math.round((Date.now() / 1000) - (60 * 60 * 24 * 1 * * @param path Path to search for recent changes */ -export const getContents = async (path = '/'): Promise<ContentsWithRoot> => { - const store = useUserConfigStore(pinia) +export const getContents = (path = '/'): CancelablePromise<ContentsWithRoot> => { + const store = useUserConfigStore(getPinia()) + /** * Filter function that returns only the visible nodes - or hidden if explicitly configured * @param node The node to check @@ -51,28 +43,32 @@ export const getContents = async (path = '/'): Promise<ContentsWithRoot> => { || store.userConfig.show_hidden // If configured to show hidden files we can early return || !node.dirname.split('/').some((dir) => dir.startsWith('.')) // otherwise only include the file if non of the parent directories is hidden - const contentsResponse = await client.getDirectoryContents(path, { - details: true, - data: davGetRecentSearch(lastTwoWeeksTimestamp), - headers: { - // Patched in WebdavClient.ts - method: 'SEARCH', - // Somehow it's needed to get the correct response - 'Content-Type': 'application/xml; charset=utf-8', - }, - deep: true, - }) as ResponseDataDetailed<FileStat[]> + const controller = new AbortController() + const handler = async () => { + const contentsResponse = await client.search('/', { + signal: controller.signal, + details: true, + data: davGetRecentSearch(lastTwoWeeksTimestamp), + }) as ResponseDataDetailed<SearchResult> - const contents = contentsResponse.data + const contents = contentsResponse.data.results + .map(resultToNode) + .filter(filterHidden) - return { - folder: new Folder({ - id: 0, - source: `${davRemoteURL}${davRootPath}`, - root: davRootPath, - owner: getCurrentUser()?.uid || null, - permissions: Permission.READ, - }), - contents: contents.map((r) => davResultToNode(r)).filter(filterHidden), + return { + folder: new Folder({ + id: 0, + source: `${davRemoteURL}${davRootPath}`, + root: davRootPath, + owner: getCurrentUser()?.uid || null, + permissions: Permission.READ, + }), + contents, + } } + + return new CancelablePromise(async (resolve, reject, cancel) => { + cancel(() => controller.abort()) + resolve(handler()) + }) } |