Files
monica/app/Services/DavClient/Utils/AddressBookContactsPushMissed.php
T
2022-07-31 10:37:15 +02:00

79 lines
2.7 KiB
PHP

<?php
namespace App\Services\DavClient\Utils;
use App\Jobs\Dav\PushVCard;
use Illuminate\Support\Arr;
use App\Models\Contact\Contact;
use Illuminate\Support\Collection;
use App\Services\DavClient\Utils\Model\SyncDto;
use App\Services\DavClient\Utils\Model\ContactDto;
use App\Services\DavClient\Utils\Traits\WithSyncDto;
use App\Services\DavClient\Utils\Model\ContactPushDto;
class AddressBookContactsPushMissed
{
use WithSyncDto;
/**
* Push contacts to the distant server.
*
* @param SyncDto $sync
* @param array<array-key, string>|null $localChanges
* @param Collection<array-key, ContactDto> $distContacts
* @param Collection<array-key, Contact> $localContacts
* @return Collection
*/
public function execute(SyncDto $sync, ?array $localChanges, Collection $distContacts, Collection $localContacts): Collection
{
$this->sync = $sync;
$missings = $this->preparePushMissedContacts(Arr::get($localChanges, 'added', []), $distContacts, $localContacts);
return app(AddressBookContactsPush::class)
->execute($sync, collect(), $localChanges)
->union($missings);
}
/**
* Get list of requests of missed contacts.
*
* @param array<array-key, string> $added
* @param Collection<array-key, ContactDto> $distContacts
* @param Collection<array-key, Contact> $localContacts
* @return Collection
*/
private function preparePushMissedContacts(array $added, Collection $distContacts, Collection $localContacts): Collection
{
$backend = $this->backend();
/** @var Collection<array-key, string> */
$distUuids = $distContacts->map(function (ContactDto $contact) use ($backend) {
return $backend->getUuid($contact->uri);
});
/** @var Collection<array-key, string> */
$addedUuids = collect($added)->map(function ($uri) use ($backend) {
return $backend->getUuid($uri);
});
return collect($localContacts)
->filter(function (Contact $contact) use ($distUuids, $addedUuids) {
return ! $distUuids->contains($contact->uuid)
&& ! $addedUuids->contains($contact->uuid);
})->map(function (Contact $contact) use ($backend): PushVCard {
$card = $backend->prepareCard($contact);
return new PushVCard($this->sync->subscription,
new ContactPushDto(
$card['uri'],
$contact->distant_etag,
$card['carddata'],
$contact->id,
ContactPushDto::MODE_MATCH_ANY
)
);
});
}
}