Proposal: add enumeration function to IUserManager which simply calls a callbask for each user in all backends

This commit is contained in:
Thomas Müller 2015-12-01 12:48:23 +01:00
parent fe67db1ad0
commit 6abc02cb88
3 changed files with 53 additions and 23 deletions

View File

@ -7,6 +7,7 @@ use OCA\DAV\CardDAV\Converter;
use OCA\DAV\Connector\Sabre\Principal; use OCA\DAV\Connector\Sabre\Principal;
use OCP\IConfig; use OCP\IConfig;
use OCP\IDBConnection; use OCP\IDBConnection;
use OCP\IUser;
use OCP\IUserManager; use OCP\IUserManager;
use Sabre\CardDAV\Plugin; use Sabre\CardDAV\Plugin;
use Sabre\VObject\Component\VCard; use Sabre\VObject\Component\VCard;
@ -69,28 +70,24 @@ class SyncSystemAddressBook extends Command {
$output->writeln('Syncing users ...'); $output->writeln('Syncing users ...');
$progress = new ProgressBar($output); $progress = new ProgressBar($output);
$progress->start(); $progress->start();
$page = 0; $this->userManager->callForAllUsers(function($user) use ($systemAddressBook, $converter, $progress) {
foreach( $this->userManager->getBackends() as $backend) { /** @var IUser $user */
$users = $backend->getUsers('', 50, $page++); $name = $user->getBackendClassName();
foreach($users as $user) { $userId = $user->getUID();
$user = $this->userManager->get($user);
$name = $user->getBackendClassName();
$userId = $user->getUID();
$cardId = "$name:$userId.vcf"; $cardId = "$name:$userId.vcf";
$card = $this->backend->getCard($systemAddressBook['id'], $cardId); $card = $this->backend->getCard($systemAddressBook['id'], $cardId);
if ($card === false) { if ($card === false) {
$vCard = $converter->createCardFromUser($user); $vCard = $converter->createCardFromUser($user);
$this->backend->createCard($systemAddressBook['id'], $cardId, $vCard->serialize()); $this->backend->createCard($systemAddressBook['id'], $cardId, $vCard->serialize());
} else { } else {
$vCard = Reader::read($card['carddata']); $vCard = Reader::read($card['carddata']);
if ($converter->updateCard($vCard, $user)) { if ($converter->updateCard($vCard, $user)) {
$this->backend->updateCard($systemAddressBook['id'], $cardId, $vCard->serialize()); $this->backend->updateCard($systemAddressBook['id'], $cardId, $vCard->serialize());
}
} }
$progress->advance();
} }
} $progress->advance();
});
$progress->finish(); $progress->finish();
$output->writeln(''); $output->writeln('');
} }

View File

@ -294,21 +294,47 @@ class Manager extends PublicEmitter implements IUserManager {
$userCountStatistics = array(); $userCountStatistics = array();
foreach ($this->backends as $backend) { foreach ($this->backends as $backend) {
if ($backend->implementsActions(\OC_User_Backend::COUNT_USERS)) { if ($backend->implementsActions(\OC_User_Backend::COUNT_USERS)) {
$backendusers = $backend->countUsers(); $backendUsers = $backend->countUsers();
if($backendusers !== false) { if($backendUsers !== false) {
if($backend instanceof \OCP\IUserBackend) { if($backend instanceof \OCP\IUserBackend) {
$name = $backend->getBackendName(); $name = $backend->getBackendName();
} else { } else {
$name = get_class($backend); $name = get_class($backend);
} }
if(isset($userCountStatistics[$name])) { if(isset($userCountStatistics[$name])) {
$userCountStatistics[$name] += $backendusers; $userCountStatistics[$name] += $backendUsers;
} else { } else {
$userCountStatistics[$name] = $backendusers; $userCountStatistics[$name] = $backendUsers;
} }
} }
} }
} }
return $userCountStatistics; return $userCountStatistics;
} }
/**
* The callback is executed for each user on each backend.
* If the callback returns false no further users will be retrieved.
*
* @param \Closure $callback
* @return void
* @since 9.0.0
*/
public function callForAllUsers(\Closure $callback, $search = '') {
foreach($this->getBackends() as $backend) {
$limit = 50;
$offset = 0;
do {
$users = $backend->getUsers($search, $limit, $offset);
foreach ($users as $user) {
$user = $this->get($user);
$return = $callback($user);
if ($return === false) {
break;
}
}
$offset += $limit;
} while (count($users) >= $limit);
}
}
} }

View File

@ -134,4 +134,11 @@ interface IUserManager {
* @since 8.0.0 * @since 8.0.0
*/ */
public function countUsers(); public function countUsers();
/**
* @param \Closure $callback
* @return void
* @since 9.0.0
*/
public function callForAllUsers (\Closure $callback, $search = '');
} }