diff options
author | John Molakvoæ <skjnldsv@protonmail.com> | 2023-08-09 12:31:54 +0200 |
---|---|---|
committer | John Molakvoæ <skjnldsv@protonmail.com> | 2023-08-17 18:56:37 +0200 |
commit | 998b3a2581fb873b03bcf4dc02eafb19390b3cd6 (patch) | |
tree | 9c90078211fa2af1e3f570540d38bec47a634bae /apps/files/src/services/Files.ts | |
parent | a820e3d036741ad1194361eca11bc1cbcdda0a47 (diff) | |
download | nextcloud-server-998b3a2581fb873b03bcf4dc02eafb19390b3cd6.tar.gz nextcloud-server-998b3a2581fb873b03bcf4dc02eafb19390b3cd6.zip |
feat(f2v): migrate Files
Signed-off-by: John Molakvoæ <skjnldsv@protonmail.com>
Diffstat (limited to 'apps/files/src/services/Files.ts')
-rw-r--r-- | apps/files/src/services/Files.ts | 102 |
1 files changed, 102 insertions, 0 deletions
diff --git a/apps/files/src/services/Files.ts b/apps/files/src/services/Files.ts new file mode 100644 index 00000000000..b9d6f65a0b9 --- /dev/null +++ b/apps/files/src/services/Files.ts @@ -0,0 +1,102 @@ +/** + * @copyright Copyright (c) 2023 John Molakvoæ <skjnldsv@protonmail.com> + * + * @author John Molakvoæ <skjnldsv@protonmail.com> + * + * @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/>. + * + */ +import type { ContentsWithRoot } from './Navigation' +import type { FileStat, ResponseDataDetailed, DAVResultResponseProps } from 'webdav' + +import { File, Folder, davParsePermissions } from '@nextcloud/files' +import { generateRemoteUrl } from '@nextcloud/router' +import { getCurrentUser } from '@nextcloud/auth' + +import { getClient, rootPath } from './WebdavClient' +import { getDefaultPropfind } from './DavProperties' +import { hashCode } from '../utils/hashUtils' +import logger from '../logger' + +const client = getClient() + +interface ResponseProps extends DAVResultResponseProps { + permissions: string, + fileid: number, + size: number, +} + +const resultToNode = function(node: FileStat): File | Folder { + const props = node.props as ResponseProps + const permissions = davParsePermissions(props?.permissions) + const owner = getCurrentUser()?.uid as string + + const source = generateRemoteUrl('dav' + rootPath + node.filename) + const id = props?.fileid < 0 + ? hashCode(source) + : props?.fileid as number || 0 + + const nodeData = { + id, + source, + mtime: new Date(node.lastmod), + mime: node.mime as string, + size: props?.size as number || 0, + permissions, + owner, + root: rootPath, + attributes: { + ...node, + ...props, + hasPreview: props?.['has-preview'], + failed: props?.fileid < 0, + }, + } + + delete nodeData.attributes.props + + return node.type === 'file' + ? new File(nodeData) + : new Folder(nodeData) +} + +export const getContents = async (path = '/'): Promise<ContentsWithRoot> => { + const propfindPayload = getDefaultPropfind() + + const contentsResponse = await client.getDirectoryContents(path, { + details: true, + data: propfindPayload, + includeSelf: true, + }) as ResponseDataDetailed<FileStat[]> + + const root = contentsResponse.data[0] + const contents = contentsResponse.data.slice(1) + if (root.filename !== path) { + throw new Error('Root node does not match requested path') + } + + return { + folder: resultToNode(root) as Folder, + contents: contents.map(result => { + try { + return resultToNode(result) + } catch (error) { + logger.error(`Invalid node detected '${result.basename}'`, { error }) + return null + } + }).filter(Boolean) as File[], + } +} |