Skip to content
This repository has been archived by the owner on Jun 8, 2023. It is now read-only.

refactor: manage address vault wide #410

Merged
merged 13 commits into from
Jan 18, 2023
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
<?php

namespace App\Domains\Contact\ManageContactAddresses\Services;

use App\Helpers\MapHelper;
use App\Interfaces\ServiceInterface;
use App\Models\Address;
use App\Models\ContactFeedItem;
use App\Services\BaseService;
use Carbon\Carbon;

class AssociateAddressToContact extends BaseService implements ServiceInterface
{
private Address $address;

private array $data;

/**
* Get the validation rules that apply to the service.
*
* @return array
*/
public function rules(): array
{
return [
'account_id' => 'required|integer|exists:accounts,id',
'vault_id' => 'required|integer|exists:vaults,id',
'author_id' => 'required|integer|exists:users,id',
'contact_id' => 'required|integer|exists:contacts,id',
'address_id' => 'required|integer|exists:addresses,id',
'is_past_address' => 'required|boolean',
];
}

/**
* Get the permissions that apply to the user calling the service.
*
* @return array
*/
public function permissions(): array
{
return [
'author_must_belong_to_account',
'vault_must_belong_to_account',
'author_must_be_vault_editor',
'contact_must_belong_to_vault',
];
}

/**
* Associate an address to a contact.
*
* @param array $data
* @return Address
*/
public function execute(array $data): Address
{
$this->data = $data;
$this->validate();
$this->match();
$this->createFeedItem();

return $this->address;
}

private function validate(): void
{
$this->validateRules($this->data);

$this->address = $this->vault->addresses()->findOrFail($this->data['address_id']);
}

private function match(): void
{
$this->contact->addresses()->attach($this->address,
['is_past_address' => $this->data['is_past_address']]
);
}

private function createFeedItem(): void
{
$this->contact->last_updated_at = Carbon::now();
$this->contact->save();

$feedItem = ContactFeedItem::create([
'author_id' => $this->author->id,
'contact_id' => $this->contact->id,
'action' => ContactFeedItem::ACTION_CONTACT_ADDRESS_CREATED,
'description' => MapHelper::getAddressAsString($this->address),
]);

$this->address->feedItem()->save($feedItem);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,12 @@
use App\Services\BaseService;
use Carbon\Carbon;

class DestroyContactAddress extends BaseService implements ServiceInterface
class RemoveAddressFromContact extends BaseService implements ServiceInterface
{
private Address $address;

private array $data;

/**
* Get the validation rules that apply to the service.
*
Expand All @@ -39,38 +41,51 @@ public function permissions(): array
return [
'author_must_belong_to_account',
'vault_must_belong_to_account',
'contact_must_belong_to_vault',
'author_must_be_vault_editor',
'contact_must_belong_to_vault',
];
}

/**
* Delete a contact address.
* Remove an address from a contact.
*
* @param array $data
* @return Address
*/
public function execute(array $data): void
public function execute(array $data): Address
{
$this->validateRules($data);
$this->data = $data;
$this->validate();
$this->remove();
$this->createFeedItem();

$this->address = $this->contact->addresses()
->findOrFail($data['address_id']);
return $this->address;
}

$this->address->delete();
private function validate(): void
{
$this->validateRules($this->data);

$this->createFeedItem();
$this->address = $this->vault->addresses()->findOrFail($this->data['address_id']);
}

$this->contact->last_updated_at = Carbon::now();
$this->contact->save();
private function remove(): void
{
$this->contact->addresses()->detach($this->address);
}

private function createFeedItem(): void
{
ContactFeedItem::create([
$this->contact->last_updated_at = Carbon::now();
$this->contact->save();

$feedItem = ContactFeedItem::create([
'author_id' => $this->author->id,
'contact_id' => $this->contact->id,
'action' => ContactFeedItem::ACTION_CONTACT_ADDRESS_DESTROYED,
'description' => MapHelper::getAddressAsString($this->address),
]);

$this->address->feedItem()->save($feedItem);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,11 @@

namespace App\Domains\Contact\ManageContactAddresses\Web\Controllers;

use App\Domains\Contact\ManageContactAddresses\Services\CreateContactAddress;
use App\Domains\Contact\ManageContactAddresses\Services\DestroyContactAddress;
use App\Domains\Contact\ManageContactAddresses\Services\UpdateContactAddress;
use App\Domains\Contact\ManageContactAddresses\Services\AssociateAddressToContact;
use App\Domains\Contact\ManageContactAddresses\Services\RemoveAddressFromContact;
use App\Domains\Contact\ManageContactAddresses\Web\ViewHelpers\ModuleContactAddressesViewHelper;
use App\Domains\Vault\ManageAddresses\Services\CreateAddress;
use App\Domains\Vault\ManageAddresses\Services\UpdateAddress;
use App\Http\Controllers\Controller;
use App\Models\Contact;
use Illuminate\Http\Request;
Expand All @@ -19,22 +20,28 @@ public function store(Request $request, int $vaultId, int $contactId)
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'vault_id' => $vaultId,
'contact_id' => $contactId,
'address_type_id' => $request->input('address_type_id') == 0 ? null : $request->input('address_type_id'),
'line_1' => $request->input('line_1'),
'line_2' => $request->input('line_2'),
'city' => $request->input('city'),
'province' => $request->input('province'),
'postal_code' => $request->input('postal_code'),
'country' => $request->input('country'),
'is_past_address' => $request->input('is_past_address'),
'latitude' => null,
'longitude' => null,
'lived_from_at' => null,
'lived_until_at' => null,
];

$address = (new CreateContactAddress())->execute($data);
$address = (new CreateAddress())->execute($data);

(new AssociateAddressToContact())->execute([
'account_id' => Auth::user()->account_id,
'vault_id' => $vaultId,
'author_id' => Auth::id(),
'contact_id' => $contactId,
'address_id' => $address->id,
'is_past_address' => $request->input('is_past_address'),
]);

$contact = Contact::find($contactId);

return response()->json([
Expand All @@ -48,7 +55,6 @@ public function update(Request $request, int $vaultId, int $contactId, int $addr
'account_id' => Auth::user()->account_id,
'author_id' => Auth::id(),
'vault_id' => $vaultId,
'contact_id' => $contactId,
'address_id' => $addressId,
'address_type_id' => $request->input('address_type_id') == 0 ? null : $request->input('address_type_id'),
'line_1' => $request->input('line_1'),
Expand All @@ -57,16 +63,21 @@ public function update(Request $request, int $vaultId, int $contactId, int $addr
'province' => $request->input('province'),
'postal_code' => $request->input('postal_code'),
'country' => $request->input('country'),
'is_past_address' => $request->input('is_past_address'),
'latitude' => null,
'longitude' => null,
'lived_from_at' => null,
'lived_until_at' => null,
];

$address = (new UpdateContactAddress())->execute($data);
(new UpdateAddress())->execute($data);
$contact = Contact::find($contactId);

// update pivot table
$contact->addresses()->where('address_id', $addressId)->update([
'is_past_address' => $request->input('is_past_address'),
]);

// get the address with pivot information
$address = $contact->addresses()->where('address_id', $addressId)->first();

return response()->json([
'data' => ModuleContactAddressesViewHelper::dto($contact, $address, Auth::user()),
], 200);
Expand All @@ -82,7 +93,7 @@ public function destroy(Request $request, int $vaultId, int $contactId, int $add
'address_id' => $addressId,
];

(new DestroyContactAddress())->execute($data);
(new RemoveAddressFromContact())->execute($data);

return response()->json([
'data' => true,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,36 +4,32 @@

use App\Helpers\MapHelper;
use App\Models\Address;
use App\Models\AddressType;
use App\Models\Contact;
use App\Models\User;

class ModuleContactAddressesViewHelper
{
public static function data(Contact $contact, User $user): array
{
$activeAddressesCollection = $contact->addresses()->where('is_past_address', false)->get();
$inactiveAddressesCollection = $contact->addresses()->where('is_past_address', true)->get();
$activeAddressesCollection = $contact->addresses()
->wherePivot('is_past_address', false)
->get()
->map(fn (Address $address) => self::dto($contact, $address, $user));

// get collections
$activeAddressesCollection = $activeAddressesCollection->map(function ($address) use ($contact, $user) {
return self::dto($contact, $address, $user);
});
$inactiveAddressesCollection = $inactiveAddressesCollection->map(function ($address) use ($contact, $user) {
return self::dto($contact, $address, $user);
});
$inactiveAddressesCollection = $contact->addresses()
->wherePivot('is_past_address', true)
->get()
->map(fn (Address $address) => self::dto($contact, $address, $user));

$addressTypes = $contact->vault->account
$addressTypesCollection = $contact->vault->account
->addressTypes()
->get();

$addressTypesCollection = collect();
foreach ($addressTypes as $addressType) {
$addressTypesCollection->push([
->get()
->map(fn (AddressType $addressType) => [
'id' => $addressType->id,
'name' => $addressType->name,
'selected' => false,
]);
}

return [
'active_addresses' => $activeAddressesCollection,
Expand All @@ -52,7 +48,7 @@ public static function dto(Contact $contact, Address $address, User $user): arra
{
return [
'id' => $address->id,
'is_past_address' => $address->is_past_address,
'is_past_address' => (bool) $address->pivot->is_past_address,
'line_1' => $address->line_1,
'line_2' => $address->line_2,
'city' => $address->city,
Expand Down
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
<?php

namespace App\Domains\Contact\ManageContactAddresses\Jobs;
namespace App\Domains\Vault\ManageAddresses\Jobs;

use App\Domains\Contact\ManageContactAddresses\Services\GetGPSCoordinate;
use App\Domains\Vault\ManageAddresses\Services\GetGPSCoordinate;
use App\Models\Address;
use Illuminate\Bus\Queueable;
use Illuminate\Contracts\Queue\ShouldQueue;
Expand Down
Loading