1: <?php
2:
3: use Afterlogic\DAV\Backend;
4: use Aurora\Modules\Contacts\Enums\StorageType;
5: use Aurora\Modules\Contacts\Models\ContactCard;
6: use Illuminate\Database\Migrations\Migration;
7: use Illuminate\Database\Capsule\Manager as Capsule;
8: use Sabre\DAV\UUIDUtil;
9:
10: class MigrateTeamContacts extends Migration
11: {
12: protected function getTeamAddressBook($tenantId, $createIfNotExists = true)
13: {
14: $sPrincipalUri = \Afterlogic\DAV\Constants::PRINCIPALS_PREFIX . $tenantId . '_' . \Afterlogic\DAV\Constants::DAV_TENANT_PRINCIPAL;
15: $addressbook = Backend::Carddav()->getAddressBookForUser($sPrincipalUri, 'gab');
16: if (!$addressbook && $createIfNotExists) {
17: if (Backend::Carddav()->createAddressBook($sPrincipalUri, 'gab', ['{DAV:}displayname' => \Afterlogic\DAV\Constants::ADDRESSBOOK_TEAM_DISPLAY_NAME])) {
18: $addressbook = Backend::Carddav()->getAddressBookForUser($sPrincipalUri, 'gab');
19: }
20: }
21:
22: return $addressbook;
23: }
24:
25: /**
26: * Run the migrations.
27: *
28: * @return void
29: */
30: public function up()
31: {
32: Capsule::connection()->table('core_tenants')->orderBy('Id')->chunk(100000, function ($tenants) {
33: foreach ($tenants as $tenant) {
34:
35: $addressbook = $this->getTeamAddressBook($tenant->Id);
36:
37: if ($addressbook) {
38: Capsule::connection()->table('contacts')->where('Storage', StorageType::Team)
39: ->where('IdTenant', $tenant->Id)
40: ->orderBy('Id')->chunk(100000, function ($rows) use ($addressbook) {
41: foreach ($rows as $row) {
42: try {
43: $conactCard = ContactCard::where('AddressBookId', $addressbook['id'])->where('ViewEmail', $row->ViewEmail)->first();
44: if (!$conactCard) {
45: $uid = UUIDUtil::getUUID();
46: $vcard = new \Sabre\VObject\Component\VCard(['UID' => $uid]);
47: $vcard->add(
48: 'EMAIL',
49: $row->ViewEmail,
50: [
51: 'type' => ['work'],
52: 'pref' => 1,
53: ]
54: );
55: Backend::Carddav()->createCard($addressbook['id'], $uid . '.vcf', $vcard->serialize());
56: } else {
57: \Aurora\System\Api::Log('Team contact already exists: ' . $row->ViewEmail, \Aurora\System\Enums\LogLevel::Error, 'contacts-migration-');
58: }
59: } catch (\Exception $e) {
60: \Aurora\System\Api::Log('Contact migration exception', \Aurora\System\Enums\LogLevel::Error, 'contacts-migration-');
61: \Aurora\System\Api::LogObject($row, \Aurora\System\Enums\LogLevel::Error, 'contacts-migration-');
62: \Aurora\System\Api::Log($e->getMessage(), \Aurora\System\Enums\LogLevel::Error, 'contacts-migration-');
63: }
64: }
65: });
66: }
67: }
68: });
69: }
70:
71: /**
72: * Reverse the migrations.
73: *
74: * @return void
75: */
76: public function down()
77: {
78: Capsule::connection()->table('core_tenants')->orderBy('Id')->chunk(100000, function ($tenants) {
79: foreach ($tenants as $tenant) {
80: $addressbook = $this->getTeamAddressBook($tenant->Id);
81: if ($addressbook) {
82: Backend::Carddav()->deleteAddressBook($addressbook['id']);
83: }
84: }
85: });
86: }
87: }
88: