aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_external/src/services/externalStorage.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_external/src/services/externalStorage.ts')
-rw-r--r--apps/files_external/src/services/externalStorage.ts87
1 files changed, 87 insertions, 0 deletions
diff --git a/apps/files_external/src/services/externalStorage.ts b/apps/files_external/src/services/externalStorage.ts
new file mode 100644
index 00000000000..fe4271ae94a
--- /dev/null
+++ b/apps/files_external/src/services/externalStorage.ts
@@ -0,0 +1,87 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+// eslint-disable-next-line n/no-extraneous-import
+import type { AxiosResponse } from '@nextcloud/axios'
+import type { ContentsWithRoot } from '@nextcloud/files'
+import type { OCSResponse } from '@nextcloud/typings/ocs'
+
+import { Folder, Permission } from '@nextcloud/files'
+import { generateOcsUrl, generateRemoteUrl, generateUrl } from '@nextcloud/router'
+import { getCurrentUser } from '@nextcloud/auth'
+import axios from '@nextcloud/axios'
+
+import { STORAGE_STATUS } from '../utils/credentialsUtils'
+
+export const rootPath = `/files/${getCurrentUser()?.uid}`
+
+export type StorageConfig = {
+ applicableUsers?: string[]
+ applicableGroups?: string[]
+ authMechanism: string
+ backend: string
+ backendOptions: Record<string, string>
+ can_edit: boolean
+ id: number
+ mountOptions?: Record<string, string>
+ mountPoint: string
+ priority: number
+ status: number
+ statusMessage: string
+ type: 'system' | 'user'
+ userProvided: boolean
+}
+
+/**
+ * https://github.com/nextcloud/server/blob/ac2bc2384efe3c15ff987b87a7432bc60d545c67/apps/files_external/lib/Controller/ApiController.php#L71-L97
+ */
+export type MountEntry = {
+ name: string
+ path: string,
+ type: 'dir',
+ backend: 'SFTP',
+ scope: 'system' | 'personal',
+ permissions: number,
+ id: number,
+ class: string
+ config: StorageConfig
+}
+
+const entryToFolder = (ocsEntry: MountEntry): Folder => {
+ const path = (ocsEntry.path + '/' + ocsEntry.name).replace(/^\//gm, '')
+ return new Folder({
+ id: ocsEntry.id,
+ source: generateRemoteUrl('dav' + rootPath + '/' + path),
+ root: rootPath,
+ owner: getCurrentUser()?.uid || null,
+ permissions: ocsEntry.config.status !== STORAGE_STATUS.SUCCESS
+ ? Permission.NONE
+ : ocsEntry?.permissions || Permission.READ,
+ attributes: {
+ displayName: path,
+ ...ocsEntry,
+ },
+ })
+}
+
+export const getContents = async (): Promise<ContentsWithRoot> => {
+ const response = await axios.get(generateOcsUrl('apps/files_external/api/v1/mounts')) as AxiosResponse<OCSResponse<MountEntry[]>>
+ const contents = response.data.ocs.data.map(entryToFolder)
+
+ return {
+ folder: new Folder({
+ id: 0,
+ source: generateRemoteUrl('dav' + rootPath),
+ root: rootPath,
+ owner: getCurrentUser()?.uid || null,
+ permissions: Permission.READ,
+ }),
+ contents,
+ }
+}
+
+export const getStatus = function(id: number, global = true) {
+ const type = global ? 'userglobalstorages' : 'userstorages'
+ return axios.get(generateUrl(`apps/files_external/${type}/${id}?testOnly=false`)) as Promise<AxiosResponse<StorageConfig>>
+}