setName('files:delete') ->setDescription('Delete a file or folder') ->addArgument('file', InputArgument::REQUIRED, 'File id or path') ->addOption('force', 'f', InputOption::VALUE_NONE, "Don't ask for configuration and don't output any warnings"); } public function execute(InputInterface $input, OutputInterface $output): int { $fileInput = $input->getArgument('file'); $inputIsId = is_numeric($fileInput); $force = $input->getOption('force'); $node = $this->fileUtils->getNode($fileInput); if (!$node) { $output->writeln("file $fileInput not found"); return self::FAILURE; } $deleteConfirmed = $force; if (!$deleteConfirmed) { /** @var QuestionHelper $helper */ $helper = $this->getHelper('question'); $storage = $node->getStorage(); if (!$inputIsId && $storage->instanceOfStorage(SharedStorage::class) && $node->getInternalPath() === '') { /** @var SharedStorage $storage */ [,$user] = explode('/', $fileInput, 3); $question = new ConfirmationQuestion("$fileInput in a shared file, do you want to unshare the file from $user instead of deleting the source file? [Y/n] ", true); if ($helper->ask($input, $output, $question)) { $storage->unshareStorage(); return self::SUCCESS; } else { $node = $storage->getShare()->getNode(); $output->writeln(''); } } $filesByUsers = $this->fileUtils->getFilesByUser($node); if (count($filesByUsers) > 1) { $output->writeln('Warning: the provided file is accessible by more than one user'); $output->writeln(' all of the following users will lose access to the file when deleted:'); $output->writeln(''); foreach ($filesByUsers as $user => $filesByUser) { $output->writeln($user . ':'); foreach ($filesByUser as $file) { $output->writeln(' - ' . $file->getPath()); } } $output->writeln(''); } if ($node instanceof Folder) { $maybeContents = " and all it's contents"; } else { $maybeContents = ''; } $question = new ConfirmationQuestion('Delete ' . $node->getPath() . $maybeContents . '? [y/N] ', false); $deleteConfirmed = $helper->ask($input, $output, $question); } if ($deleteConfirmed) { if ($node->isDeletable()) { $node->delete(); } else { $output->writeln('File cannot be deleted, insufficient permissions.'); } } return self::SUCCESS; } }