migrateaddressbooks.php 2.3 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  1. <?php
  2. namespace OCA\Dav\Migration;
  3. use OCA\DAV\CardDAV\AddressBook;
  4. use OCA\DAV\CardDAV\CardDavBackend;
  5. use Sabre\CardDAV\Plugin;
  6. use Symfony\Component\Console\Command\Command;
  7. use Symfony\Component\Console\Input\InputArgument;
  8. use Symfony\Component\Console\Input\InputInterface;
  9. use Symfony\Component\Console\Output\OutputInterface;
  10. class MigrateAddressbooks {
  11. /** @var AddressBookAdapter */
  12. protected $adapter;
  13. /** @var CardDavBackend */
  14. private $backend;
  15. /**
  16. * @param AddressBookAdapter $adapter
  17. * @param CardDavBackend $backend
  18. */
  19. function __construct(AddressBookAdapter $adapter,
  20. CardDavBackend $backend
  21. ) {
  22. $this->adapter = $adapter;
  23. $this->backend = $backend;
  24. }
  25. /**
  26. * @param string $user
  27. */
  28. public function migrateForUser($user) {
  29. $this->adapter->foreachBook($user, function($book) use ($user) {
  30. $principal = "principals/users/$user";
  31. $knownBooks = $this->backend->getAddressBooksByUri($principal, $book['uri']);
  32. if (!is_null($knownBooks)) {
  33. return;
  34. }
  35. $newId = $this->backend->createAddressBook($principal, $book['uri'], [
  36. '{DAV:}displayname' => $book['displayname'],
  37. '{' . Plugin::NS_CARDDAV . '}addressbook-description' => $book['description']
  38. ]);
  39. $this->migrateBook($book['id'], $newId);
  40. $this->migrateShares($book['id'], $newId);
  41. });
  42. }
  43. public function setup() {
  44. $this->adapter->setup();
  45. }
  46. /**
  47. * @param int $addressBookId
  48. * @param int $newAddressBookId
  49. */
  50. private function migrateBook($addressBookId, $newAddressBookId) {
  51. $this->adapter->foreachCard($addressBookId, function($card) use ($newAddressBookId) {
  52. $this->backend->createCard($newAddressBookId, $card['uri'], $card['carddata']);
  53. });
  54. }
  55. /**
  56. * @param int $addressBookId
  57. * @param int $newAddressBookId
  58. */
  59. private function migrateShares($addressBookId, $newAddressBookId) {
  60. $shares =$this->adapter->getShares($addressBookId);
  61. if (empty($shares)) {
  62. return;
  63. }
  64. $add = array_map(function($s) {
  65. $prefix = 'principal:principals/users/';
  66. if ($s['share_type'] === 1) {
  67. $prefix = 'principal:principals/groups/';
  68. }
  69. return [
  70. 'href' => $prefix . $s['share_with']
  71. ];
  72. }, $shares);
  73. $newAddressBook = $this->backend->getAddressBookById($newAddressBookId);
  74. $book = new AddressBook($this->backend, $newAddressBook);
  75. $this->backend->updateShares($book, $add, []);
  76. }
  77. }