Merge pull request #23976 from owncloud/kill-dav-migration
Remove dav migration for 9.1
This commit is contained in:
commit
e84da2cf54
|
@ -30,10 +30,6 @@ use OCA\DAV\CardDAV\SyncService;
|
||||||
use OCA\DAV\Connector\Sabre\Principal;
|
use OCA\DAV\Connector\Sabre\Principal;
|
||||||
use OCA\DAV\DAV\GroupPrincipalBackend;
|
use OCA\DAV\DAV\GroupPrincipalBackend;
|
||||||
use OCA\DAV\HookManager;
|
use OCA\DAV\HookManager;
|
||||||
use OCA\Dav\Migration\AddressBookAdapter;
|
|
||||||
use OCA\Dav\Migration\CalendarAdapter;
|
|
||||||
use OCA\Dav\Migration\MigrateAddressbooks;
|
|
||||||
use OCA\Dav\Migration\MigrateCalendars;
|
|
||||||
use \OCP\AppFramework\App;
|
use \OCP\AppFramework\App;
|
||||||
use OCP\AppFramework\IAppContainer;
|
use OCP\AppFramework\IAppContainer;
|
||||||
use OCP\Contacts\IManager;
|
use OCP\Contacts\IManager;
|
||||||
|
@ -98,30 +94,6 @@ class Application extends App {
|
||||||
return new CalDavBackend($db, $principal);
|
return new CalDavBackend($db, $principal);
|
||||||
});
|
});
|
||||||
|
|
||||||
$container->registerService('MigrateAddressbooks', function($c) {
|
|
||||||
/** @var IAppContainer $c */
|
|
||||||
$db = $c->getServer()->getDatabaseConnection();
|
|
||||||
$logger = $c->getServer()->getLogger();
|
|
||||||
return new MigrateAddressbooks(
|
|
||||||
new AddressBookAdapter($db),
|
|
||||||
$c->query('CardDavBackend'),
|
|
||||||
$logger,
|
|
||||||
null
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
$container->registerService('MigrateCalendars', function($c) {
|
|
||||||
/** @var IAppContainer $c */
|
|
||||||
$db = $c->getServer()->getDatabaseConnection();
|
|
||||||
$logger = $c->getServer()->getLogger();
|
|
||||||
return new MigrateCalendars(
|
|
||||||
new CalendarAdapter($db),
|
|
||||||
$c->query('CalDavBackend'),
|
|
||||||
$logger,
|
|
||||||
null
|
|
||||||
);
|
|
||||||
});
|
|
||||||
|
|
||||||
$container->registerService('BirthdayService', function($c) {
|
$container->registerService('BirthdayService', function($c) {
|
||||||
/** @var IAppContainer $c */
|
/** @var IAppContainer $c */
|
||||||
$g = new GroupPrincipalBackend(
|
$g = new GroupPrincipalBackend(
|
||||||
|
@ -186,38 +158,6 @@ class Application extends App {
|
||||||
$jl->add(new SyncJob());
|
$jl->add(new SyncJob());
|
||||||
}
|
}
|
||||||
|
|
||||||
public function migrateAddressbooks() {
|
|
||||||
try {
|
|
||||||
/** @var MigrateAddressbooks $migration */
|
|
||||||
$migration = $this->getContainer()->query('MigrateAddressbooks');
|
|
||||||
$migration->setup();
|
|
||||||
$userManager = $this->getContainer()->getServer()->getUserManager();
|
|
||||||
|
|
||||||
$userManager->callForAllUsers(function($user) use($migration) {
|
|
||||||
/** @var IUser $user */
|
|
||||||
$migration->migrateForUser($user->getUID());
|
|
||||||
});
|
|
||||||
} catch (\Exception $ex) {
|
|
||||||
$this->getContainer()->getServer()->getLogger()->logException($ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function migrateCalendars() {
|
|
||||||
try {
|
|
||||||
/** @var MigrateCalendars $migration */
|
|
||||||
$migration = $this->getContainer()->query('MigrateCalendars');
|
|
||||||
$migration->setup();
|
|
||||||
$userManager = $this->getContainer()->getServer()->getUserManager();
|
|
||||||
|
|
||||||
$userManager->callForAllUsers(function($user) use($migration) {
|
|
||||||
/** @var IUser $user */
|
|
||||||
$migration->migrateForUser($user->getUID());
|
|
||||||
});
|
|
||||||
} catch (\Exception $ex) {
|
|
||||||
$this->getContainer()->getServer()->getLogger()->logException($ex);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function generateBirthdays() {
|
public function generateBirthdays() {
|
||||||
try {
|
try {
|
||||||
/** @var BirthdayService $migration */
|
/** @var BirthdayService $migration */
|
||||||
|
|
|
@ -23,6 +23,4 @@ use OCA\Dav\AppInfo\Application;
|
||||||
|
|
||||||
$app = new Application();
|
$app = new Application();
|
||||||
$app->setupCron();
|
$app->setupCron();
|
||||||
$app->migrateAddressbooks();
|
|
||||||
$app->migrateCalendars();
|
|
||||||
$app->generateBirthdays();
|
$app->generateBirthdays();
|
||||||
|
|
|
@ -21,8 +21,6 @@
|
||||||
use OCA\Dav\AppInfo\Application;
|
use OCA\Dav\AppInfo\Application;
|
||||||
use OCA\DAV\Command\CreateAddressBook;
|
use OCA\DAV\Command\CreateAddressBook;
|
||||||
use OCA\DAV\Command\CreateCalendar;
|
use OCA\DAV\Command\CreateCalendar;
|
||||||
use OCA\Dav\Command\MigrateAddressbooks;
|
|
||||||
use OCA\Dav\Command\MigrateCalendars;
|
|
||||||
use OCA\DAV\Command\SyncBirthdayCalendar;
|
use OCA\DAV\Command\SyncBirthdayCalendar;
|
||||||
use OCA\DAV\Command\SyncSystemAddressBook;
|
use OCA\DAV\Command\SyncSystemAddressBook;
|
||||||
|
|
||||||
|
@ -37,5 +35,3 @@ $application->add(new CreateCalendar($userManager, $groupManager, $dbConnection)
|
||||||
$application->add(new CreateAddressBook($userManager, $app->getContainer()->query('CardDavBackend')));
|
$application->add(new CreateAddressBook($userManager, $app->getContainer()->query('CardDavBackend')));
|
||||||
$application->add(new SyncSystemAddressBook($app->getSyncService()));
|
$application->add(new SyncSystemAddressBook($app->getSyncService()));
|
||||||
$application->add(new SyncBirthdayCalendar($userManager, $app->getContainer()->query('BirthdayService')));
|
$application->add(new SyncBirthdayCalendar($userManager, $app->getContainer()->query('BirthdayService')));
|
||||||
$application->add(new MigrateAddressbooks($userManager, $app->getContainer()->query('MigrateAddressbooks')));
|
|
||||||
$application->add(new MigrateCalendars($userManager, $app->getContainer()->query('MigrateCalendars')));
|
|
||||||
|
|
|
@ -1,86 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Lukas Reschke <lukas@owncloud.com>
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
namespace OCA\Dav\Command;
|
|
||||||
|
|
||||||
use OCP\IUser;
|
|
||||||
use OCP\IUserManager;
|
|
||||||
use Symfony\Component\Console\Command\Command;
|
|
||||||
use Symfony\Component\Console\Helper\ProgressBar;
|
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
|
||||||
|
|
||||||
class MigrateAddressbooks extends Command {
|
|
||||||
|
|
||||||
/** @var IUserManager */
|
|
||||||
protected $userManager;
|
|
||||||
|
|
||||||
/** @var \OCA\Dav\Migration\MigrateAddressbooks */
|
|
||||||
private $service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param IUserManager $userManager
|
|
||||||
* @param \OCA\Dav\Migration\MigrateAddressbooks $service
|
|
||||||
*/
|
|
||||||
function __construct(IUserManager $userManager,
|
|
||||||
\OCA\Dav\Migration\MigrateAddressbooks $service
|
|
||||||
) {
|
|
||||||
parent::__construct();
|
|
||||||
$this->userManager = $userManager;
|
|
||||||
$this->service = $service;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function configure() {
|
|
||||||
$this
|
|
||||||
->setName('dav:migrate-addressbooks')
|
|
||||||
->setDescription('Migrate addressbooks from the contacts app to core')
|
|
||||||
->addArgument('user',
|
|
||||||
InputArgument::OPTIONAL,
|
|
||||||
'User for whom all addressbooks will be migrated');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output) {
|
|
||||||
$this->service->setup();
|
|
||||||
|
|
||||||
$user = $input->getArgument('user');
|
|
||||||
if (!is_null($user)) {
|
|
||||||
if (!$this->userManager->userExists($user)) {
|
|
||||||
throw new \InvalidArgumentException("User <$user> in unknown.");
|
|
||||||
}
|
|
||||||
$output->writeln("Start migration for $user");
|
|
||||||
$this->service->migrateForUser($user);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$output->writeln("Start migration of all known users ...");
|
|
||||||
$p = new ProgressBar($output);
|
|
||||||
$p->start();
|
|
||||||
$this->userManager->callForAllUsers(function($user) use ($p) {
|
|
||||||
$p->advance();
|
|
||||||
/** @var IUser $user */
|
|
||||||
$this->service->migrateForUser($user->getUID());
|
|
||||||
});
|
|
||||||
|
|
||||||
$p->finish();
|
|
||||||
$output->writeln('');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,85 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Lukas Reschke <lukas@owncloud.com>
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
namespace OCA\Dav\Command;
|
|
||||||
|
|
||||||
use OCP\IUser;
|
|
||||||
use OCP\IUserManager;
|
|
||||||
use Symfony\Component\Console\Command\Command;
|
|
||||||
use Symfony\Component\Console\Helper\ProgressBar;
|
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
|
||||||
|
|
||||||
class MigrateCalendars extends Command {
|
|
||||||
|
|
||||||
/** @var IUserManager */
|
|
||||||
protected $userManager;
|
|
||||||
|
|
||||||
/** @var \OCA\Dav\Migration\MigrateCalendars */
|
|
||||||
private $service;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param IUserManager $userManager
|
|
||||||
* @param \OCA\Dav\Migration\MigrateCalendars $service
|
|
||||||
*/
|
|
||||||
function __construct(IUserManager $userManager,
|
|
||||||
\OCA\Dav\Migration\MigrateCalendars $service
|
|
||||||
) {
|
|
||||||
parent::__construct();
|
|
||||||
$this->userManager = $userManager;
|
|
||||||
$this->service = $service;
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function configure() {
|
|
||||||
$this
|
|
||||||
->setName('dav:migrate-calendars')
|
|
||||||
->setDescription('Migrate calendars from the calendar app to core')
|
|
||||||
->addArgument('user',
|
|
||||||
InputArgument::OPTIONAL,
|
|
||||||
'User for whom all calendars will be migrated');
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output) {
|
|
||||||
$this->service->setup();
|
|
||||||
|
|
||||||
$user = $input->getArgument('user');
|
|
||||||
if (!is_null($user)) {
|
|
||||||
if (!$this->userManager->userExists($user)) {
|
|
||||||
throw new \InvalidArgumentException("User <$user> in unknown.");
|
|
||||||
}
|
|
||||||
$output->writeln("Start migration for $user");
|
|
||||||
$this->service->migrateForUser($user);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
$output->writeln("Start migration of all known users ...");
|
|
||||||
$p = new ProgressBar($output);
|
|
||||||
$p->start();
|
|
||||||
$this->userManager->callForAllUsers(function($user) use ($p) {
|
|
||||||
$p->advance();
|
|
||||||
/** @var IUser $user */
|
|
||||||
$this->service->migrateForUser($user->getUID());
|
|
||||||
});
|
|
||||||
|
|
||||||
$p->finish();
|
|
||||||
$output->writeln('');
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,106 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Lukas Reschke <lukas@owncloud.com>
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
namespace OCA\Dav\Migration;
|
|
||||||
|
|
||||||
use OCP\IDBConnection;
|
|
||||||
use Symfony\Component\Console\Command\Command;
|
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
|
||||||
|
|
||||||
class AddressBookAdapter {
|
|
||||||
|
|
||||||
/** @var \OCP\IDBConnection */
|
|
||||||
protected $dbConnection;
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
private $sourceBookTable;
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
private $sourceCardsTable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param IDBConnection $dbConnection
|
|
||||||
* @param string $sourceBookTable
|
|
||||||
* @param string $sourceCardsTable
|
|
||||||
*/
|
|
||||||
function __construct(IDBConnection $dbConnection,
|
|
||||||
$sourceBookTable = 'contacts_addressbooks',
|
|
||||||
$sourceCardsTable = 'contacts_cards') {
|
|
||||||
$this->dbConnection = $dbConnection;
|
|
||||||
$this->sourceBookTable = $sourceBookTable;
|
|
||||||
$this->sourceCardsTable = $sourceCardsTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $user
|
|
||||||
* @param \Closure $callBack
|
|
||||||
*/
|
|
||||||
public function foreachBook($user, \Closure $callBack) {
|
|
||||||
// get all addressbooks of that user
|
|
||||||
$query = $this->dbConnection->getQueryBuilder();
|
|
||||||
$stmt = $query->select('*')->from($this->sourceBookTable)
|
|
||||||
->where($query->expr()->eq('userid', $query->createNamedParameter($user)))
|
|
||||||
->execute();
|
|
||||||
|
|
||||||
while($row = $stmt->fetch()) {
|
|
||||||
$callBack($row);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setup() {
|
|
||||||
if (!$this->dbConnection->tableExists($this->sourceBookTable)) {
|
|
||||||
throw new \DomainException('Contacts tables are missing. Nothing to do.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $addressBookId
|
|
||||||
* @param \Closure $callBack
|
|
||||||
*/
|
|
||||||
public function foreachCard($addressBookId, \Closure $callBack) {
|
|
||||||
$query = $this->dbConnection->getQueryBuilder();
|
|
||||||
$stmt = $query->select('*')->from($this->sourceCardsTable)
|
|
||||||
->where($query->expr()->eq('addressbookid', $query->createNamedParameter($addressBookId)))
|
|
||||||
->execute();
|
|
||||||
|
|
||||||
while($row = $stmt->fetch()) {
|
|
||||||
$callBack($row);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $addressBookId
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getShares($addressBookId) {
|
|
||||||
$query = $this->dbConnection->getQueryBuilder();
|
|
||||||
$shares = $query->select('*')->from('share')
|
|
||||||
->where($query->expr()->eq('item_source', $query->createNamedParameter($addressBookId)))
|
|
||||||
->andWhere($query->expr()->eq('item_type', $query->expr()->literal('addressbook')))
|
|
||||||
->andWhere($query->expr()->in('share_type', [ $query->expr()->literal(0), $query->expr()->literal(1)]))
|
|
||||||
->execute()
|
|
||||||
->fetchAll();
|
|
||||||
|
|
||||||
return $shares;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,102 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Lukas Reschke <lukas@owncloud.com>
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
namespace OCA\Dav\Migration;
|
|
||||||
|
|
||||||
use OCP\IDBConnection;
|
|
||||||
|
|
||||||
class CalendarAdapter {
|
|
||||||
|
|
||||||
/** @var \OCP\IDBConnection */
|
|
||||||
protected $dbConnection;
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
private $sourceCalendarTable;
|
|
||||||
|
|
||||||
/** @var string */
|
|
||||||
private $sourceCalObjTable;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param IDBConnection $dbConnection
|
|
||||||
* @param string $sourceCalendarTable
|
|
||||||
* @param string $sourceCalObjTable
|
|
||||||
*/
|
|
||||||
function __construct(IDBConnection $dbConnection,
|
|
||||||
$sourceCalendarTable = 'clndr_calendars',
|
|
||||||
$sourceCalObjTable = 'clndr_objects') {
|
|
||||||
$this->dbConnection = $dbConnection;
|
|
||||||
$this->sourceCalendarTable = $sourceCalendarTable;
|
|
||||||
$this->sourceCalObjTable = $sourceCalObjTable;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $user
|
|
||||||
* @param \Closure $callBack
|
|
||||||
*/
|
|
||||||
public function foreachCalendar($user, \Closure $callBack) {
|
|
||||||
// get all calendars of that user
|
|
||||||
$query = $this->dbConnection->getQueryBuilder();
|
|
||||||
$stmt = $query->select('*')->from($this->sourceCalendarTable)
|
|
||||||
->where($query->expr()->eq('userid', $query->createNamedParameter($user)))
|
|
||||||
->execute();
|
|
||||||
|
|
||||||
while($row = $stmt->fetch()) {
|
|
||||||
$callBack($row);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setup() {
|
|
||||||
if (!$this->dbConnection->tableExists($this->sourceCalendarTable)) {
|
|
||||||
throw new \DomainException('Calendar tables are missing. Nothing to do.');
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $calendarId
|
|
||||||
* @param \Closure $callBack
|
|
||||||
*/
|
|
||||||
public function foreachCalendarObject($calendarId, \Closure $callBack) {
|
|
||||||
$query = $this->dbConnection->getQueryBuilder();
|
|
||||||
$stmt = $query->select('*')->from($this->sourceCalObjTable)
|
|
||||||
->where($query->expr()->eq('calendarid', $query->createNamedParameter($calendarId)))
|
|
||||||
->execute();
|
|
||||||
|
|
||||||
while($row = $stmt->fetch()) {
|
|
||||||
$callBack($row);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $addressBookId
|
|
||||||
* @return array
|
|
||||||
*/
|
|
||||||
public function getShares($addressBookId) {
|
|
||||||
$query = $this->dbConnection->getQueryBuilder();
|
|
||||||
$shares = $query->select('*')->from('share')
|
|
||||||
->where($query->expr()->eq('item_source', $query->createNamedParameter($addressBookId)))
|
|
||||||
->andWhere($query->expr()->eq('item_type', $query->expr()->literal('calendar')))
|
|
||||||
->andWhere($query->expr()->in('share_type', [ $query->expr()->literal(0), $query->expr()->literal(1)]))
|
|
||||||
->execute()
|
|
||||||
->fetchAll();
|
|
||||||
|
|
||||||
return $shares;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,131 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Lukas Reschke <lukas@owncloud.com>
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
namespace OCA\Dav\Migration;
|
|
||||||
|
|
||||||
use OCA\DAV\CardDAV\AddressBook;
|
|
||||||
use OCA\DAV\CardDAV\CardDavBackend;
|
|
||||||
use OCP\ILogger;
|
|
||||||
use Sabre\CardDAV\Plugin;
|
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
|
||||||
|
|
||||||
class MigrateAddressbooks {
|
|
||||||
|
|
||||||
/** @var AddressBookAdapter */
|
|
||||||
protected $adapter;
|
|
||||||
|
|
||||||
/** @var CardDavBackend */
|
|
||||||
private $backend;
|
|
||||||
|
|
||||||
/** @var ILogger */
|
|
||||||
private $logger;
|
|
||||||
|
|
||||||
/** @var OutputInterface */
|
|
||||||
private $consoleOutput;
|
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param AddressBookAdapter $adapter
|
|
||||||
* @param CardDavBackend $backend
|
|
||||||
*/
|
|
||||||
function __construct(AddressBookAdapter $adapter,
|
|
||||||
CardDavBackend $backend,
|
|
||||||
ILogger $logger,
|
|
||||||
OutputInterface $consoleOutput = null
|
|
||||||
) {
|
|
||||||
$this->adapter = $adapter;
|
|
||||||
$this->backend = $backend;
|
|
||||||
$this->logger = $logger;
|
|
||||||
$this->consoleOutput = $consoleOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $user
|
|
||||||
*/
|
|
||||||
public function migrateForUser($user) {
|
|
||||||
|
|
||||||
$this->adapter->foreachBook($user, function($book) use ($user) {
|
|
||||||
$principal = "principals/users/$user";
|
|
||||||
$knownBooks = $this->backend->getAddressBooksByUri($principal, $book['uri']);
|
|
||||||
if (!is_null($knownBooks)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$newId = $this->backend->createAddressBook($principal, $book['uri'], [
|
|
||||||
'{DAV:}displayname' => $book['displayname'],
|
|
||||||
'{' . Plugin::NS_CARDDAV . '}addressbook-description' => $book['description']
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->migrateBook($book['id'], $newId);
|
|
||||||
$this->migrateShares($book['id'], $newId);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setup() {
|
|
||||||
$this->adapter->setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $addressBookId
|
|
||||||
* @param int $newAddressBookId
|
|
||||||
*/
|
|
||||||
private function migrateBook($addressBookId, $newAddressBookId) {
|
|
||||||
$this->adapter->foreachCard($addressBookId, function($card) use ($newAddressBookId) {
|
|
||||||
try {
|
|
||||||
$this->backend->createCard($newAddressBookId, $card['uri'], $card['carddata']);
|
|
||||||
} catch (\Exception $ex) {
|
|
||||||
$eventId = $card['id'];
|
|
||||||
$addressBookId = $card['addressbookid'];
|
|
||||||
$msg = "One event could not be migrated. (id: $eventId, addressbookid: $addressBookId)";
|
|
||||||
$this->logger->logException($ex, ['app' => 'dav', 'message' => $msg]);
|
|
||||||
if (!is_null($this->consoleOutput)) {
|
|
||||||
$this->consoleOutput->writeln($msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $addressBookId
|
|
||||||
* @param int $newAddressBookId
|
|
||||||
*/
|
|
||||||
private function migrateShares($addressBookId, $newAddressBookId) {
|
|
||||||
$shares =$this->adapter->getShares($addressBookId);
|
|
||||||
if (empty($shares)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$add = array_map(function($s) {
|
|
||||||
$prefix = 'principal:principals/users/';
|
|
||||||
if ((int)$s['share_type'] === 1) {
|
|
||||||
$prefix = 'principal:principals/groups/';
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
'href' => $prefix . $s['share_with'],
|
|
||||||
'readOnly' => !((int)$s['permissions'] === 31)
|
|
||||||
];
|
|
||||||
}, $shares);
|
|
||||||
|
|
||||||
$newAddressBook = $this->backend->getAddressBookById($newAddressBookId);
|
|
||||||
$book = new AddressBook($this->backend, $newAddressBook);
|
|
||||||
$this->backend->updateShares($book, $add, []);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,132 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Lukas Reschke <lukas@owncloud.com>
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
namespace OCA\Dav\Migration;
|
|
||||||
|
|
||||||
use OCA\DAV\CalDAV\CalDavBackend;
|
|
||||||
use OCA\DAV\CalDAV\Calendar;
|
|
||||||
use OCP\ILogger;
|
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
|
||||||
|
|
||||||
class MigrateCalendars {
|
|
||||||
|
|
||||||
/** @var CalendarAdapter */
|
|
||||||
protected $adapter;
|
|
||||||
|
|
||||||
/** @var CalDavBackend */
|
|
||||||
private $backend;
|
|
||||||
|
|
||||||
/** @var ILogger */
|
|
||||||
private $logger;
|
|
||||||
|
|
||||||
/** @var OutputInterface */
|
|
||||||
private $consoleOutput;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param CalendarAdapter $adapter
|
|
||||||
* @param CalDavBackend $backend
|
|
||||||
*/
|
|
||||||
function __construct(CalendarAdapter $adapter,
|
|
||||||
CalDavBackend $backend,
|
|
||||||
ILogger $logger,
|
|
||||||
OutputInterface $consoleOutput = null
|
|
||||||
) {
|
|
||||||
$this->adapter = $adapter;
|
|
||||||
$this->backend = $backend;
|
|
||||||
$this->logger = $logger;
|
|
||||||
$this->consoleOutput = $consoleOutput;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param string $user
|
|
||||||
*/
|
|
||||||
public function migrateForUser($user) {
|
|
||||||
|
|
||||||
$this->adapter->foreachCalendar($user, function($calendar) use ($user) {
|
|
||||||
$principal = "principals/users/$user";
|
|
||||||
$calendarByUri = $this->backend->getCalendarByUri($principal, $calendar['uri']);
|
|
||||||
if (!is_null($calendarByUri)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$newId = $this->backend->createCalendar($principal, $calendar['uri'], [
|
|
||||||
'{DAV:}displayname' => $calendar['displayname'],
|
|
||||||
'{urn:ietf:params:xml:ns:caldav}calendar-description' => $calendar['displayname'],
|
|
||||||
'{urn:ietf:params:xml:ns:caldav}calendar-timezone' => $calendar['timezone'],
|
|
||||||
'{http://apple.com/ns/ical/}calendar-order' => $calendar['calendarorder'],
|
|
||||||
'{http://apple.com/ns/ical/}calendar-color' => $calendar['calendarcolor'],
|
|
||||||
]);
|
|
||||||
|
|
||||||
$this->migrateCalendar($calendar['id'], $newId);
|
|
||||||
$this->migrateShares($calendar['id'], $newId);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
public function setup() {
|
|
||||||
$this->adapter->setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $calendarId
|
|
||||||
* @param int $newCalendarId
|
|
||||||
*/
|
|
||||||
private function migrateCalendar($calendarId, $newCalendarId) {
|
|
||||||
$this->adapter->foreachCalendarObject($calendarId, function($calObject) use ($newCalendarId) {
|
|
||||||
try {
|
|
||||||
$this->backend->createCalendarObject($newCalendarId, $calObject['uri'], $calObject['calendardata']);
|
|
||||||
} catch (\Exception $ex) {
|
|
||||||
$eventId = $calObject['id'];
|
|
||||||
$calendarId = $calObject['calendarId'];
|
|
||||||
$msg = "One event could not be migrated. (id: $eventId, calendarid: $calendarId)";
|
|
||||||
$this->logger->logException($ex, ['app' => 'dav', 'message' => $msg]);
|
|
||||||
if (!is_null($this->consoleOutput)) {
|
|
||||||
$this->consoleOutput->writeln($msg);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param int $calendarId
|
|
||||||
* @param int $newCalendarId
|
|
||||||
*/
|
|
||||||
private function migrateShares($calendarId, $newCalendarId) {
|
|
||||||
$shares =$this->adapter->getShares($calendarId);
|
|
||||||
if (empty($shares)) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
$add = array_map(function($s) {
|
|
||||||
$prefix = 'principal:principals/users/';
|
|
||||||
if ((int)$s['share_type'] === 1) {
|
|
||||||
$prefix = 'principal:principals/groups/';
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
'href' => $prefix . $s['share_with'],
|
|
||||||
'readOnly' => !((int)$s['permissions'] === 31)
|
|
||||||
];
|
|
||||||
}, $shares);
|
|
||||||
|
|
||||||
$newCalendar = $this->backend->getCalendarById($newCalendarId);
|
|
||||||
$calendar = new Calendar($this->backend, $newCalendar);
|
|
||||||
$this->backend->updateShares($calendar, $add, []);
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,129 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
namespace OCA\DAV\Tests\Unit\Migration;
|
|
||||||
|
|
||||||
use DomainException;
|
|
||||||
use OCA\Dav\Migration\AddressBookAdapter;
|
|
||||||
use OCP\IDBConnection;
|
|
||||||
use Test\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class AddressbookAdapterTest
|
|
||||||
*
|
|
||||||
* @group DB
|
|
||||||
*
|
|
||||||
* @package OCA\DAV\Tests\Unit\Migration
|
|
||||||
*/
|
|
||||||
class AddressbookAdapterTest extends TestCase {
|
|
||||||
|
|
||||||
/** @var IDBConnection */
|
|
||||||
private $db;
|
|
||||||
/** @var AddressBookAdapter */
|
|
||||||
private $adapter;
|
|
||||||
/** @var array */
|
|
||||||
private $books = [];
|
|
||||||
/** @var array */
|
|
||||||
private $cards = [];
|
|
||||||
|
|
||||||
public function setUp() {
|
|
||||||
parent::setUp();
|
|
||||||
$this->db = \OC::$server->getDatabaseConnection();
|
|
||||||
|
|
||||||
$manager = new \OC\DB\MDB2SchemaManager($this->db);
|
|
||||||
$manager->createDbFromStructure(__DIR__ . '/contacts_schema.xml');
|
|
||||||
|
|
||||||
$this->adapter = new AddressBookAdapter($this->db);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function tearDown() {
|
|
||||||
$this->db->dropTable('contacts_addressbooks');
|
|
||||||
$this->db->dropTable('contacts_cards');
|
|
||||||
parent::tearDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException DomainException
|
|
||||||
*/
|
|
||||||
public function testOldTablesDoNotExist() {
|
|
||||||
$adapter = new AddressBookAdapter(\OC::$server->getDatabaseConnection(), 'crazy_table_that_does_no_exist');
|
|
||||||
$adapter->setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test() {
|
|
||||||
|
|
||||||
// insert test data
|
|
||||||
$builder = $this->db->getQueryBuilder();
|
|
||||||
$builder->insert('contacts_addressbooks')
|
|
||||||
->values([
|
|
||||||
'userid' => $builder->createNamedParameter('test-user-666'),
|
|
||||||
'displayname' => $builder->createNamedParameter('Display Name'),
|
|
||||||
'uri' => $builder->createNamedParameter('contacts'),
|
|
||||||
'description' => $builder->createNamedParameter('An address book for testing'),
|
|
||||||
'ctag' => $builder->createNamedParameter('112233'),
|
|
||||||
'active' => $builder->createNamedParameter('1')
|
|
||||||
])
|
|
||||||
->execute();
|
|
||||||
$builder = $this->db->getQueryBuilder();
|
|
||||||
$builder->insert('contacts_cards')
|
|
||||||
->values([
|
|
||||||
'addressbookid' => $builder->createNamedParameter(6666),
|
|
||||||
'fullname' => $builder->createNamedParameter('Full Name'),
|
|
||||||
'carddata' => $builder->createNamedParameter('datadatadata'),
|
|
||||||
'uri' => $builder->createNamedParameter('some-card.vcf'),
|
|
||||||
'lastmodified' => $builder->createNamedParameter('112233'),
|
|
||||||
])
|
|
||||||
->execute();
|
|
||||||
$builder = $this->db->getQueryBuilder();
|
|
||||||
$builder->insert('share')
|
|
||||||
->values([
|
|
||||||
'share_type' => $builder->createNamedParameter(1),
|
|
||||||
'share_with' => $builder->createNamedParameter('user01'),
|
|
||||||
'uid_owner' => $builder->createNamedParameter('user02'),
|
|
||||||
'item_type' => $builder->createNamedParameter('addressbook'),
|
|
||||||
'item_source' => $builder->createNamedParameter(6666),
|
|
||||||
'item_target' => $builder->createNamedParameter('Contacts (user02)'),
|
|
||||||
])
|
|
||||||
->execute();
|
|
||||||
|
|
||||||
// test the adapter
|
|
||||||
$this->adapter->foreachBook('test-user-666', function($row) {
|
|
||||||
$this->books[] = $row;
|
|
||||||
});
|
|
||||||
$this->assertArrayHasKey('id', $this->books[0]);
|
|
||||||
$this->assertEquals('test-user-666', $this->books[0]['userid']);
|
|
||||||
$this->assertEquals('Display Name', $this->books[0]['displayname']);
|
|
||||||
$this->assertEquals('contacts', $this->books[0]['uri']);
|
|
||||||
$this->assertEquals('An address book for testing', $this->books[0]['description']);
|
|
||||||
$this->assertEquals('112233', $this->books[0]['ctag']);
|
|
||||||
|
|
||||||
$this->adapter->foreachCard(6666, function($row) {
|
|
||||||
$this->cards[]= $row;
|
|
||||||
});
|
|
||||||
$this->assertArrayHasKey('id', $this->cards[0]);
|
|
||||||
$this->assertEquals(6666, $this->cards[0]['addressbookid']);
|
|
||||||
|
|
||||||
// test getShares
|
|
||||||
$shares = $this->adapter->getShares(6666);
|
|
||||||
$this->assertEquals(1, count($shares));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,191 +0,0 @@
|
||||||
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
|
||||||
<database>
|
|
||||||
|
|
||||||
<name>*dbname*</name>
|
|
||||||
<create>true</create>
|
|
||||||
<overwrite>false</overwrite>
|
|
||||||
|
|
||||||
<charset>utf8</charset>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
|
|
||||||
<name>*dbprefix*clndr_objects</name>
|
|
||||||
|
|
||||||
<declaration>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>id</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default>0</default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<autoincrement>1</autoincrement>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>calendarid</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>objecttype</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<length>40</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>startdate</name>
|
|
||||||
<type>timestamp</type>
|
|
||||||
<default>1970-01-01 00:00:00</default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>enddate</name>
|
|
||||||
<type>timestamp</type>
|
|
||||||
<default>1970-01-01 00:00:00</default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>repeating</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>summary</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>255</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>calendardata</name>
|
|
||||||
<type>clob</type>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>uri</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>255</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>lastmodified</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
</declaration>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
|
|
||||||
<name>*dbprefix*clndr_calendars</name>
|
|
||||||
|
|
||||||
<declaration>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>id</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default>0</default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<autoincrement>1</autoincrement>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>userid</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>255</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>displayname</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>100</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>uri</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>255</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>active</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default>1</default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>ctag</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default>0</default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>calendarorder</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default>0</default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>calendarcolor</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>10</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>timezone</name>
|
|
||||||
<type>clob</type>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>components</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>100</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
</declaration>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</database>
|
|
|
@ -1,131 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
namespace OCA\DAV\Tests\Unit\Migration;
|
|
||||||
|
|
||||||
use DomainException;
|
|
||||||
use OCA\Dav\Migration\AddressBookAdapter;
|
|
||||||
use OCA\Dav\Migration\CalendarAdapter;
|
|
||||||
use OCP\IDBConnection;
|
|
||||||
use Test\TestCase;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Class CalendarAdapterTest
|
|
||||||
*
|
|
||||||
* @group DB
|
|
||||||
*
|
|
||||||
* @package OCA\DAV\Tests\Unit\Migration
|
|
||||||
*/
|
|
||||||
class CalendarAdapterTest extends TestCase {
|
|
||||||
|
|
||||||
/** @var IDBConnection */
|
|
||||||
private $db;
|
|
||||||
/** @var CalendarAdapter */
|
|
||||||
private $adapter;
|
|
||||||
/** @var array */
|
|
||||||
private $cals = [];
|
|
||||||
/** @var array */
|
|
||||||
private $calObjs = [];
|
|
||||||
|
|
||||||
public function setUp() {
|
|
||||||
parent::setUp();
|
|
||||||
$this->db = \OC::$server->getDatabaseConnection();
|
|
||||||
|
|
||||||
$manager = new \OC\DB\MDB2SchemaManager($this->db);
|
|
||||||
$manager->createDbFromStructure(__DIR__ . '/calendar_schema.xml');
|
|
||||||
|
|
||||||
$this->adapter = new CalendarAdapter($this->db);
|
|
||||||
}
|
|
||||||
|
|
||||||
public function tearDown() {
|
|
||||||
$this->db->dropTable('clndr_calendars');
|
|
||||||
$this->db->dropTable('clndr_objects');
|
|
||||||
parent::tearDown();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @expectedException DomainException
|
|
||||||
*/
|
|
||||||
public function testOldTablesDoNotExist() {
|
|
||||||
$adapter = new AddressBookAdapter(\OC::$server->getDatabaseConnection(), 'crazy_table_that_does_no_exist');
|
|
||||||
$adapter->setup();
|
|
||||||
}
|
|
||||||
|
|
||||||
public function test() {
|
|
||||||
|
|
||||||
// insert test data
|
|
||||||
$builder = $this->db->getQueryBuilder();
|
|
||||||
$builder->insert('clndr_calendars')
|
|
||||||
->values([
|
|
||||||
'userid' => $builder->createNamedParameter('test-user-666'),
|
|
||||||
'displayname' => $builder->createNamedParameter('Display Name'),
|
|
||||||
'uri' => $builder->createNamedParameter('events'),
|
|
||||||
'ctag' => $builder->createNamedParameter('112233'),
|
|
||||||
'active' => $builder->createNamedParameter('1')
|
|
||||||
])
|
|
||||||
->execute();
|
|
||||||
$builder = $this->db->getQueryBuilder();
|
|
||||||
$builder->insert('clndr_objects')
|
|
||||||
->values([
|
|
||||||
'calendarid' => $builder->createNamedParameter(6666),
|
|
||||||
'objecttype' => $builder->createNamedParameter('VEVENT'),
|
|
||||||
'startdate' => $builder->createNamedParameter(new \DateTime(), 'datetime'),
|
|
||||||
'enddate' => $builder->createNamedParameter(new \DateTime(), 'datetime'),
|
|
||||||
'repeating' => $builder->createNamedParameter(0),
|
|
||||||
'summary' => $builder->createNamedParameter('Something crazy will happen'),
|
|
||||||
'uri' => $builder->createNamedParameter('event.ics'),
|
|
||||||
'lastmodified' => $builder->createNamedParameter('112233'),
|
|
||||||
])
|
|
||||||
->execute();
|
|
||||||
$builder = $this->db->getQueryBuilder();
|
|
||||||
$builder->insert('share')
|
|
||||||
->values([
|
|
||||||
'share_type' => $builder->createNamedParameter(1),
|
|
||||||
'share_with' => $builder->createNamedParameter('user01'),
|
|
||||||
'uid_owner' => $builder->createNamedParameter('user02'),
|
|
||||||
'item_type' => $builder->createNamedParameter('calendar'),
|
|
||||||
'item_source' => $builder->createNamedParameter(6666),
|
|
||||||
'item_target' => $builder->createNamedParameter('Contacts (user02)'),
|
|
||||||
])
|
|
||||||
->execute();
|
|
||||||
|
|
||||||
// test the adapter
|
|
||||||
$this->adapter->foreachCalendar('test-user-666', function($row) {
|
|
||||||
$this->cals[] = $row;
|
|
||||||
});
|
|
||||||
$this->assertArrayHasKey('id', $this->cals[0]);
|
|
||||||
$this->assertEquals('test-user-666', $this->cals[0]['userid']);
|
|
||||||
$this->assertEquals('Display Name', $this->cals[0]['displayname']);
|
|
||||||
$this->assertEquals('events', $this->cals[0]['uri']);
|
|
||||||
$this->assertEquals('112233', $this->cals[0]['ctag']);
|
|
||||||
|
|
||||||
$this->adapter->foreachCalendarObject(6666, function($row) {
|
|
||||||
$this->calObjs[]= $row;
|
|
||||||
});
|
|
||||||
$this->assertArrayHasKey('id', $this->calObjs[0]);
|
|
||||||
$this->assertEquals(6666, $this->calObjs[0]['calendarid']);
|
|
||||||
|
|
||||||
// test getShares
|
|
||||||
$shares = $this->adapter->getShares(6666);
|
|
||||||
$this->assertEquals(1, count($shares));
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,151 +0,0 @@
|
||||||
<?xml version="1.0" encoding="ISO-8859-1" ?>
|
|
||||||
<database>
|
|
||||||
|
|
||||||
<name>*dbname*</name>
|
|
||||||
<create>true</create>
|
|
||||||
<overwrite>false</overwrite>
|
|
||||||
<charset>utf8</charset>
|
|
||||||
<table>
|
|
||||||
|
|
||||||
<name>*dbprefix*contacts_addressbooks</name>
|
|
||||||
|
|
||||||
<declaration>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>id</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default>0</default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<autoincrement>1</autoincrement>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>userid</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<length>255</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>displayname</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>255</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>uri</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>200</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>description</name>
|
|
||||||
<type>text</type>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>255</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>ctag</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default>1</default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>active</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default>1</default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<index>
|
|
||||||
<name>c_addressbook_userid_index</name>
|
|
||||||
<field>
|
|
||||||
<name>userid</name>
|
|
||||||
<sorting>ascending</sorting>
|
|
||||||
</field>
|
|
||||||
</index>
|
|
||||||
</declaration>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
<table>
|
|
||||||
|
|
||||||
<name>*dbprefix*contacts_cards</name>
|
|
||||||
|
|
||||||
<declaration>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>id</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default>0</default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<autoincrement>1</autoincrement>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>addressbookid</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>true</notnull>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>fullname</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>255</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>carddata</name>
|
|
||||||
<type>clob</type>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>uri</name>
|
|
||||||
<type>text</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<length>200</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
<field>
|
|
||||||
<name>lastmodified</name>
|
|
||||||
<type>integer</type>
|
|
||||||
<default></default>
|
|
||||||
<notnull>false</notnull>
|
|
||||||
<unsigned>true</unsigned>
|
|
||||||
<length>4</length>
|
|
||||||
</field>
|
|
||||||
|
|
||||||
|
|
||||||
<index>
|
|
||||||
<name>c_addressbookid_index</name>
|
|
||||||
<field>
|
|
||||||
<name>addressbookid</name>
|
|
||||||
<sorting>ascending</sorting>
|
|
||||||
</field>
|
|
||||||
</index>
|
|
||||||
</declaration>
|
|
||||||
|
|
||||||
</table>
|
|
||||||
|
|
||||||
</database>
|
|
|
@ -1,81 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
namespace OCA\DAV\Tests\Unit\Migration;
|
|
||||||
|
|
||||||
use OCA\DAV\CardDAV\CardDavBackend;
|
|
||||||
use OCA\Dav\Migration\AddressBookAdapter;
|
|
||||||
use OCP\ILogger;
|
|
||||||
use Test\TestCase;
|
|
||||||
|
|
||||||
class MigrateAddressbookTest extends TestCase {
|
|
||||||
|
|
||||||
public function testMigration() {
|
|
||||||
/** @var AddressBookAdapter | \PHPUnit_Framework_MockObject_MockObject $adapter */
|
|
||||||
$adapter = $this->mockAdapter([
|
|
||||||
['share_type' => '1', 'share_with' => 'users', 'permissions' => '31'],
|
|
||||||
['share_type' => '2', 'share_with' => 'adam', 'permissions' => '1'],
|
|
||||||
]);
|
|
||||||
|
|
||||||
/** @var CardDavBackend | \PHPUnit_Framework_MockObject_MockObject $cardDav */
|
|
||||||
$cardDav = $this->getMockBuilder('\OCA\Dav\CardDAV\CardDAVBackend')->disableOriginalConstructor()->getMock();
|
|
||||||
$cardDav->expects($this->any())->method('createAddressBook')->willReturn(666);
|
|
||||||
$cardDav->expects($this->any())->method('getAddressBookById')->willReturn([]);
|
|
||||||
$cardDav->expects($this->once())->method('createAddressBook')->with('principals/users/test01', 'test_contacts');
|
|
||||||
$cardDav->expects($this->once())->method('createCard')->with(666, '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.vcf', 'BEGIN:VCARD');
|
|
||||||
$cardDav->expects($this->once())->method('updateShares')->with($this->anything(), [
|
|
||||||
['href' => 'principal:principals/groups/users', 'readOnly' => false],
|
|
||||||
['href' => 'principal:principals/users/adam', 'readOnly' => true]
|
|
||||||
]);
|
|
||||||
/** @var ILogger $logger */
|
|
||||||
$logger = $this->getMockBuilder('\OCP\ILogger')->disableOriginalConstructor()->getMock();
|
|
||||||
|
|
||||||
$m = new \OCA\Dav\Migration\MigrateAddressbooks($adapter, $cardDav, $logger, null);
|
|
||||||
$m->migrateForUser('test01');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return \PHPUnit_Framework_MockObject_MockObject
|
|
||||||
*/
|
|
||||||
private function mockAdapter($shares = []) {
|
|
||||||
$adapter = $this->getMockBuilder('\OCA\Dav\Migration\AddressBookAdapter')->disableOriginalConstructor()->getMock();
|
|
||||||
$adapter->expects($this->any())->method('foreachBook')->willReturnCallback(function ($user, \Closure $callBack) {
|
|
||||||
$callBack([
|
|
||||||
'id' => 0,
|
|
||||||
'userid' => $user,
|
|
||||||
'displayname' => 'Test Contacts',
|
|
||||||
'uri' => 'test_contacts',
|
|
||||||
'description' => 'Contacts to test with',
|
|
||||||
'ctag' => 1234567890,
|
|
||||||
'active' => 1
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
$adapter->expects($this->any())->method('foreachCard')->willReturnCallback(function ($addressBookId, \Closure $callBack) {
|
|
||||||
$callBack([
|
|
||||||
'userid' => $addressBookId,
|
|
||||||
'uri' => '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.vcf',
|
|
||||||
'carddata' => 'BEGIN:VCARD'
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
$adapter->expects($this->any())->method('getShares')->willReturn($shares);
|
|
||||||
return $adapter;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
|
@ -1,85 +0,0 @@
|
||||||
<?php
|
|
||||||
/**
|
|
||||||
* @author Thomas Müller <thomas.mueller@tmit.eu>
|
|
||||||
*
|
|
||||||
* @copyright Copyright (c) 2016, ownCloud, Inc.
|
|
||||||
* @license AGPL-3.0
|
|
||||||
*
|
|
||||||
* This code is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License, version 3,
|
|
||||||
* as published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License, version 3,
|
|
||||||
* along with this program. If not, see <http://www.gnu.org/licenses/>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
namespace OCA\DAV\Tests\Unit\Migration;
|
|
||||||
|
|
||||||
use OCA\DAV\CalDAV\CalDavBackend;
|
|
||||||
use OCA\Dav\Migration\CalendarAdapter;
|
|
||||||
use OCP\ILogger;
|
|
||||||
use Test\TestCase;
|
|
||||||
|
|
||||||
class MigrateCalendarTest extends TestCase {
|
|
||||||
|
|
||||||
public function testMigration() {
|
|
||||||
/** @var CalendarAdapter | \PHPUnit_Framework_MockObject_MockObject $adapter */
|
|
||||||
$adapter = $this->mockAdapter([
|
|
||||||
['share_type' => '1', 'share_with' => 'users', 'permissions' => '31'],
|
|
||||||
['share_type' => '2', 'share_with' => 'adam', 'permissions' => '1'],
|
|
||||||
]);
|
|
||||||
|
|
||||||
/** @var CalDavBackend | \PHPUnit_Framework_MockObject_MockObject $cardDav */
|
|
||||||
$cardDav = $this->getMockBuilder('\OCA\Dav\CalDAV\CalDAVBackend')->disableOriginalConstructor()->getMock();
|
|
||||||
$cardDav->expects($this->any())->method('createCalendar')->willReturn(666);
|
|
||||||
$cardDav->expects($this->once())->method('createCalendar')->with('principals/users/test01', 'test_contacts');
|
|
||||||
$cardDav->expects($this->once())->method('createCalendarObject')->with(666, '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.ics', 'BEGIN:VCARD');
|
|
||||||
$cardDav->expects($this->once())->method('updateShares')->with($this->anything(), [
|
|
||||||
['href' => 'principal:principals/groups/users', 'readOnly' => false],
|
|
||||||
['href' => 'principal:principals/users/adam', 'readOnly' => true]
|
|
||||||
]);
|
|
||||||
/** @var ILogger $logger */
|
|
||||||
$logger = $this->getMockBuilder('\OCP\ILogger')->disableOriginalConstructor()->getMock();
|
|
||||||
|
|
||||||
$m = new \OCA\Dav\Migration\MigrateCalendars($adapter, $cardDav, $logger, null);
|
|
||||||
$m->migrateForUser('test01');
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return \PHPUnit_Framework_MockObject_MockObject
|
|
||||||
*/
|
|
||||||
private function mockAdapter($shares = [], $calData = 'BEGIN:VCARD') {
|
|
||||||
$adapter = $this->getMockBuilder('\OCA\Dav\Migration\CalendarAdapter')
|
|
||||||
->disableOriginalConstructor()
|
|
||||||
->getMock();
|
|
||||||
$adapter->expects($this->any())->method('foreachCalendar')->willReturnCallback(function ($user, \Closure $callBack) {
|
|
||||||
$callBack([
|
|
||||||
// calendarorder | calendarcolor | timezone | components
|
|
||||||
'id' => 0,
|
|
||||||
'userid' => $user,
|
|
||||||
'displayname' => 'Test Contacts',
|
|
||||||
'uri' => 'test_contacts',
|
|
||||||
'ctag' => 1234567890,
|
|
||||||
'active' => 1,
|
|
||||||
'calendarorder' => '0',
|
|
||||||
'calendarcolor' => '#b3dc6c',
|
|
||||||
'timezone' => null,
|
|
||||||
'components' => 'VEVENT,VTODO,VJOURNAL'
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
$adapter->expects($this->any())->method('foreachCalendarObject')->willReturnCallback(function ($addressBookId, \Closure $callBack) use ($calData) {
|
|
||||||
$callBack([
|
|
||||||
'userid' => $addressBookId,
|
|
||||||
'uri' => '63f0dd6c-39d5-44be-9d34-34e7a7441fc2.ics',
|
|
||||||
'calendardata' => $calData
|
|
||||||
]);
|
|
||||||
});
|
|
||||||
$adapter->expects($this->any())->method('getShares')->willReturn($shares);
|
|
||||||
return $adapter;
|
|
||||||
}
|
|
||||||
}
|
|
Loading…
Reference in New Issue