Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
56.52% covered (warning)
56.52%
13 / 23
0.00% covered (danger)
0.00%
0 / 2
CRAP
0.00% covered (danger)
0.00%
0 / 1
AddressUpdateService
56.52% covered (warning)
56.52%
13 / 23
0.00% covered (danger)
0.00%
0 / 2
20.94
0.00% covered (danger)
0.00%
0 / 1
 update
66.67% covered (warning)
66.67%
12 / 18
0.00% covered (danger)
0.00%
0 / 1
10.37
 updateSectorChildren
20.00% covered (danger)
20.00%
1 / 5
0.00% covered (danger)
0.00%
0 / 1
7.61
1<?php
2
3namespace Domain\Address\Services;
4
5use App\Events\ServiceProcessed;
6use App\Models\Address\Address;
7use App\Models\User;
8use Domain\Address\DTOs\AddressDTO;
9use Domain\Shared\Enums\SectorEnum;
10use Exception;
11use Illuminate\Support\Facades\DB;
12
13readonly class AddressUpdateService
14{
15    /**
16     * @param AddressDTO $addressDTO
17     * @param Address $address
18     * @param User $user
19     * @return Address
20     * @throws Exception
21     */
22    public function update(AddressDTO $addressDTO, Address $address, User $user): Address
23    {
24        try {
25            DB::beginTransaction();
26
27            $address->fill($addressDTO->toArray());
28            $address->setAttribute('parent_id', $addressDTO->parent?->getKey());
29
30            if ($addressDTO->parent) {
31                $address->setAttribute('sector', $address->firstParent()->getAttribute('sector')->value);
32
33                if($address->children){
34                    $this->updateSectorChildren($address, $address->firstParent()->getAttribute('sector'));
35                }
36            }
37
38            if (($addressDTO->addressSectorEnum) && ($address->children) && (!$addressDTO->parent)) {
39                $this->updateSectorChildren($address, $addressDTO->addressSectorEnum);
40            }
41
42            if ($address->isDirty()) {
43                (new AddressUpdateOrderService)->updateOrder($address, $user);
44                $address->save();
45            }
46
47            DB::commit();
48        } catch (Exception $exception) {
49            DB::rollBack();
50            throw $exception;
51        }
52
53        ServiceProcessed::dispatch(self::class, $user);
54        return $address;
55    }
56
57    /**
58     * @param AddressDTO $addressDTO
59     * @param SectorEnum $sector
60     */
61    private function updateSectorChildren(Address $address, SectorEnum $sector)
62    {
63        foreach ($address->children as $child) {
64            $child->setAttribute('sector', $sector->value);
65            $child->save();
66
67            if($child->children){
68                $this->updateSectorChildren($child, $sector);
69            }
70        }
71    }
72}