aboutsummaryrefslogtreecommitdiffstats
path: root/apps/files_trashbin/src/files_actions/restoreAction.ts
diff options
context:
space:
mode:
Diffstat (limited to 'apps/files_trashbin/src/files_actions/restoreAction.ts')
-rw-r--r--apps/files_trashbin/src/files_actions/restoreAction.ts71
1 files changed, 71 insertions, 0 deletions
diff --git a/apps/files_trashbin/src/files_actions/restoreAction.ts b/apps/files_trashbin/src/files_actions/restoreAction.ts
new file mode 100644
index 00000000000..3aeeceea7b3
--- /dev/null
+++ b/apps/files_trashbin/src/files_actions/restoreAction.ts
@@ -0,0 +1,71 @@
+/**
+ * SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
+ * SPDX-License-Identifier: AGPL-3.0-or-later
+ */
+import { getCurrentUser } from '@nextcloud/auth'
+import { showError } from '@nextcloud/dialogs'
+import { emit } from '@nextcloud/event-bus'
+import { Permission, Node, View, FileAction } from '@nextcloud/files'
+import { t } from '@nextcloud/l10n'
+import { encodePath } from '@nextcloud/paths'
+import { generateRemoteUrl } from '@nextcloud/router'
+import axios from '@nextcloud/axios'
+import svgHistory from '@mdi/svg/svg/history.svg?raw'
+
+import { TRASHBIN_VIEW_ID } from '../files_views/trashbinView.ts'
+import logger from '../../../files/src/logger.ts'
+
+export const restoreAction = new FileAction({
+ id: 'restore',
+
+ displayName() {
+ return t('files_trashbin', 'Restore')
+ },
+
+ iconSvgInline: () => svgHistory,
+
+ enabled(nodes: Node[], view) {
+ // Only available in the trashbin view
+ if (view.id !== TRASHBIN_VIEW_ID) {
+ return false
+ }
+
+ // Only available if all nodes have read permission
+ return nodes.length > 0
+ && nodes
+ .map((node) => node.permissions)
+ .every((permission) => Boolean(permission & Permission.READ))
+ },
+
+ async exec(node: Node) {
+ try {
+ const destination = generateRemoteUrl(encodePath(`dav/trashbin/${getCurrentUser()!.uid}/restore/${node.basename}`))
+ await axios.request({
+ method: 'MOVE',
+ url: node.encodedSource,
+ headers: {
+ destination,
+ },
+ })
+
+ // Let's pretend the file is deleted since
+ // we don't know the restored location
+ emit('files:node:deleted', node)
+ return true
+ } catch (error) {
+ if (error.response?.status === 507) {
+ showError(t('files_trashbin', 'Not enough free space to restore the file/folder'))
+ }
+ logger.error('Failed to restore node', { error, node })
+ return false
+ }
+ },
+
+ async execBatch(nodes: Node[], view: View, dir: string) {
+ return Promise.all(nodes.map(node => this.exec(node, view, dir)))
+ },
+
+ order: 1,
+
+ inline: () => true,
+})