aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files/src/services/Files.ts
diff options
context:
space:
mode:
authorJohn Molakvoæ <skjnldsv@protonmail.com>2023-08-09 12:31:54 +0200
committerJohn Molakvoæ <skjnldsv@protonmail.com>2023-08-17 18:56:37 +0200
commit998b3a2581fb873b03bcf4dc02eafb19390b3cd6 (patch)
tree9c90078211fa2af1e3f570540d38bec47a634bae /apps/files/src/services/Files.ts
parenta820e3d036741ad1194361eca11bc1cbcdda0a47 (diff)
downloadnextcloud-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.ts102
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[],
+ }
+}