setName('sharing:fix-owncloud-group-shares') ->setDescription('Fix group share subshares left pending after renaming on an ownCloud-migrated instance') ->addOption( 'dry-run', null, InputOption::VALUE_NONE, 'Show how many shares would be fixed without making any changes', ); } #[\Override] public function execute(InputInterface $input, OutputInterface $output): int { $dryRun = $input->getOption('dry-run'); $qb = $this->connection->getQueryBuilder(); $count = (int)$qb->select($qb->func()->count('id')) ->from('share') ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('accepted', $qb->createNamedParameter(IShare::STATUS_PENDING, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))) ->executeQuery() ->fetchOne(); if ($count === 0) { $output->writeln('No affected group share subshares found.'); return self::SUCCESS; } if ($dryRun) { $output->writeln("Would fix $count group share subshare(s) (dry-run, no changes made)."); return self::SUCCESS; } $qb = $this->connection->getQueryBuilder(); $qb->update('share') ->set('accepted', $qb->createNamedParameter(IShare::STATUS_ACCEPTED, IQueryBuilder::PARAM_INT)) ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(IShare::TYPE_USERGROUP, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->eq('accepted', $qb->createNamedParameter(IShare::STATUS_PENDING, IQueryBuilder::PARAM_INT))) ->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0, IQueryBuilder::PARAM_INT))) ->executeStatement(); $output->writeln("Fixed $count group share subshare(s)."); return self::SUCCESS; } }