Skip to content

Commit

Permalink
update
Browse files Browse the repository at this point in the history
  • Loading branch information
asbiin committed Aug 4, 2023
1 parent 3fcf454 commit b6de98c
Show file tree
Hide file tree
Showing 7 changed files with 80 additions and 41 deletions.
2 changes: 1 addition & 1 deletion app/Domains/Contact/Dav/ImportVCardResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,5 +20,5 @@ public function can(VCard $vcard): bool;
/**
* Import Card.
*/
public function import(VCard $vcard, mixed $result): mixed;
public function import(VCard $vcard, ?VCardResource $result): ?VCardResource;
}
46 changes: 45 additions & 1 deletion app/Domains/Contact/Dav/Importer.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,10 @@

use App\Domains\Contact\Dav\Services\ImportVCard;
use App\Models\Account;
use App\Models\User;
use App\Models\Vault;
use Ramsey\Uuid\Uuid;
use Sabre\VObject\Component\VCard;

abstract class Importer implements ImportVCardResource
{
Expand All @@ -24,7 +28,23 @@ public function setContext(ImportVCard $context): ImportVCardResource
*/
protected function account(): Account
{
return $this->context->vault->account;
return $this->vault()->account;
}

/**
* Get the vault.
*/
protected function vault(): Vault
{
return $this->context->vault;
}

/**
* Get the author.
*/
protected function author(): User
{
return $this->context->author;
}

/**
Expand All @@ -34,4 +54,28 @@ protected function formatValue(?string $value): ?string
{
return ! empty($value) ? str_replace('\;', ';', trim($value)) : null;
}

/**
* Get uid of the card.
*/
protected function getUid(VCard $entry): ?string
{
if (! empty($uuid = (string) $entry->UID)) {
return $uuid;
}

return null;
}

/**
* Import UID.
*/
protected function importUid(array $data, VCard $entry): array
{
if (($uuid = $this->getUid($entry)) !== null && Uuid::isValid($uuid) && ! $this->context->external) {
$data['id'] = $uuid;
}

return $data;
}
}
2 changes: 2 additions & 0 deletions app/Domains/Contact/Dav/Services/GetEtag.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace App\Domains\Contact\Dav\Services;

use App\Domains\Contact\Dav\VCardResource;
use App\Interfaces\ServiceInterface;
use App\Services\BaseService;
use Illuminate\Database\Eloquent\ModelNotFoundException;
Expand Down Expand Up @@ -40,6 +41,7 @@ public function execute(array $data): string
{
$this->validateRules($data);

/** @var VCardResource */
$entry = $data['entry'];

if ($entry->vault_id !== $this->vault->id) {
Expand Down
5 changes: 4 additions & 1 deletion app/Domains/Contact/Dav/Services/ImportVCard.php
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,13 @@

use App\Domains\Contact\Dav\ImportVCardResource;
use App\Domains\Contact\Dav\Order;
use App\Domains\Contact\Dav\VCardResource;
use App\Interfaces\ServiceInterface;
use App\Services\BaseService;
use App\Traits\DAVFormat;
use Closure;
use Illuminate\Contracts\Foundation\Application;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Support\Arr;
use Illuminate\Support\Collection;
use Illuminate\Support\Str;
Expand Down Expand Up @@ -194,6 +196,7 @@ private function processEntry(VCard $entry, string $vcard): array
*/
private function processEntryContact(VCard $entry, string $vcard): array
{
/** @var Model|VCardResource */
$result = $this->importEntry($entry);

if ($result === null) {
Expand Down Expand Up @@ -234,7 +237,7 @@ private function canImportCurrentEntry(VCard $entry): bool
/**
* Create the object matching the current entry.
*/
private function importEntry(VCard $entry): mixed
private function importEntry(VCard $entry): ?VCardResource
{
$result = null;

Expand Down
13 changes: 13 additions & 0 deletions app/Domains/Contact/Dav/VCardResource.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<?php

namespace App\Domains\Contact\Dav;

/**
* @property string $id
* @property string $vault_id
* @property string $distant_etag
* @property string $vcard
*/
interface VCardResource
{
}
50 changes: 13 additions & 37 deletions app/Domains/Contact/ManageContact/Dav/ImportContact.php
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
use App\Domains\Contact\Dav\Importer;
use App\Domains\Contact\Dav\ImportVCardResource;
use App\Domains\Contact\Dav\Order;
use App\Domains\Contact\Dav\VCardResource;
use App\Domains\Contact\Dav\Web\Backend\CardDAV\CardDAVBackend;
use App\Domains\Contact\ManageContact\Services\CreateContact;
use App\Domains\Contact\ManageContact\Services\UpdateContact;
Expand All @@ -13,7 +14,6 @@
use Illuminate\Database\Eloquent\ModelNotFoundException;
use Illuminate\Support\Arr;
use Illuminate\Support\Str;
use Ramsey\Uuid\Uuid;
use Sabre\VObject\Component\VCard;

#[Order(1)]
Expand Down Expand Up @@ -46,7 +46,7 @@ public function can(VCard $vcard): bool
/**
* Import Contact.
*/
public function import(VCard $vcard, mixed $result): mixed
public function import(VCard $vcard, ?VCardResource $result): ?VCardResource
{
$contact = $this->getExistingContact($vcard);

Expand All @@ -57,11 +57,11 @@ public function import(VCard $vcard, mixed $result): mixed
$contactData = $this->importNames($contactData, $vcard);
$contactData = $this->importGender($contactData, $vcard);

if ($contact !== null && $contactData !== $original) {
$contact = app(UpdateContact::class)->execute($contactData);
} else {
if ($contact === null) {
$contactData['listed'] = true;
$contact = app(CreateContact::class)->execute($contactData);
} elseif ($contactData !== $original) {
$contact = app(UpdateContact::class)->execute($contactData);
}

if ($this->context->external && $contact->distant_uuid === null) {
Expand All @@ -88,11 +88,11 @@ private function getExistingContact(VCard $vcard): ?Contact
$contact = null;

if (($uri = Arr::get($this->context->data, 'uri')) !== null) {
$contact = $backend->getObject($this->context->vault->id, $uri);
$contact = $backend->getObject($this->vault()->id, $uri);

if ($contact === null) {
$contact = Contact::firstWhere([
'vault_id' => $this->context->vault->id,
'vault_id' => $this->vault()->id,
'distant_uri' => $uri,
]);
}
Expand All @@ -102,13 +102,13 @@ private function getExistingContact(VCard $vcard): ?Contact
$contactId = $this->getUid($vcard);
if ($contactId !== null) {
$contact = Contact::firstWhere([
'vault_id' => $this->context->vault->id,
'vault_id' => $this->vault()->id,
'id' => $contactId,
]);
}
}

if ($contact !== null && $contact->vault_id !== $this->context->vault->id) {
if ($contact !== null && $contact->vault_id !== $this->vault()->id) {
throw new ModelNotFoundException();
}

Expand All @@ -122,8 +122,8 @@ private function getContactData(?Contact $contact): array
{
$result = [
'account_id' => $this->account()->id,
'vault_id' => $this->context->vault->id,
'author_id' => $this->context->author->id,
'vault_id' => $this->vault()->id,
'author_id' => $this->author()->id,
'first_name' => $contact ? $contact->first_name : null,
'last_name' => $contact ? $contact->last_name : null,
'middle_name' => $contact ? $contact->middle_name : null,
Expand Down Expand Up @@ -199,12 +199,12 @@ private function importNameFromFN(array $contactData, VCard $entry): array
{
$fullnameParts = preg_split('/\s+/', $entry->FN, 2);

if (Str::of($this->context->author->name_order)->startsWith('%first_name% %last_name%')) {
if (Str::of($this->author()->name_order)->startsWith('%first_name% %last_name%')) {
$contactData['first_name'] = $this->formatValue($fullnameParts[0]);
if (count($fullnameParts) > 1) {
$contactData['last_name'] = $this->formatValue($fullnameParts[1]);
}
} elseif (Str::of($this->context->author->name_order)->startsWith('%last_name% %first_name%')) {
} elseif (Str::of($this->author()->name_order)->startsWith('%last_name% %first_name%')) {
$contactData['last_name'] = $this->formatValue($fullnameParts[0]);
if (count($fullnameParts) > 1) {
$contactData['first_name'] = $this->formatValue($fullnameParts[1]);
Expand All @@ -220,30 +220,6 @@ private function importNameFromFN(array $contactData, VCard $entry): array
return $contactData;
}

/**
* Import uid of the contact.
*/
private function importUid(array $contactData, VCard $entry): array
{
if (($uuid = $this->getUid($entry)) !== null && Uuid::isValid($uuid) && ! $this->context->external) {
$contactData['id'] = $uuid;
}

return $contactData;
}

/**
* Import uid of the contact.
*/
private function getUid(VCard $entry): ?string
{
if (! empty($uuid = (string) $entry->UID)) {
return $uuid;
}

return null;
}

/**
* Import gender of the contact.
*/
Expand Down
3 changes: 2 additions & 1 deletion app/Models/Contact.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

namespace App\Models;

use App\Domains\Contact\Dav\VCardResource;
use App\Helpers\AvatarHelper;
use App\Helpers\ContactImportantDateHelper;
use App\Helpers\ImportantDateHelper;
Expand All @@ -23,7 +24,7 @@
use Laravel\Scout\Attributes\SearchUsingPrefix;
use Laravel\Scout\Searchable;

class Contact extends Model
class Contact extends Model implements VCardResource
{
use HasFactory, SoftDeletes, HasUuids;
use Searchable;
Expand Down

0 comments on commit b6de98c

Please sign in to comment.