Passed
Push — main ( 0a00da...09db13 )
by
unknown
50s queued 13s
created

ChangeAddressUseCase::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 2
Code Lines 1

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 2
CRAP Score 1

Importance

Changes 0
Metric Value
cc 1
eloc 1
c 0
b 0
f 0
nc 1
nop 1
dl 0
loc 2
ccs 2
cts 2
cp 1
crap 1
rs 10
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace WMDE\Fundraising\AddressChangeContext\UseCases\ChangeAddress;
6
7
use WMDE\Fundraising\AddressChangeContext\Domain\AddressChangeRepository;
8
use WMDE\Fundraising\AddressChangeContext\Domain\Model\Address;
9
use WMDE\Fundraising\AddressChangeContext\Domain\Model\AddressChangeBuilder;
10
use WMDE\Fundraising\AddressChangeContext\Domain\Model\AddressChangeId;
11
12
class ChangeAddressUseCase {
13
14
	private AddressChangeRepository $addressChangeRepository;
15
16 5
	public function __construct( AddressChangeRepository $addressChangeRepository ) {
17 5
		$this->addressChangeRepository = $addressChangeRepository;
18
	}
19
20 5
	public function changeAddress( ChangeAddressRequest $request ): ChangeAddressResponse {
21 5
		$addressChange = $this->addressChangeRepository->getAddressChangeByUuid( $request->identifier );
22 5
		if ( $addressChange === null ) {
23 1
			return ChangeAddressResponse::newErrorResponse( [ ChangeAddressResponse::ERROR_ADDRESS_NOT_FOUND ] );
24
		}
25
26 4
		$newIdentifier = AddressChangeId::fromString( AddressChangeBuilder::generateUuid() );
27 4
		if ( $request->hasAddressChangeData() ) {
28
			try {
29 3
				$addressChange->performAddressChange( $this->buildAddress( $request ), $newIdentifier );
30 2
			} catch ( ChangeAddressValidationException $e ) {
31 2
				return ChangeAddressResponse::newErrorResponse( [ $e->getMessage() ] );
32
			}
33
		}
34
35 2
		if ( $request->isOptedOutOfDonationReceipt() ) {
36
			$addressChange->optOutOfDonationReceipt( $newIdentifier );
37
		}
38
39 2
		$this->addressChangeRepository->storeAddressChange( $addressChange );
40 2
		return ChangeAddressResponse::newSuccessResponse();
41
	}
42
43 3
	private function buildAddress( ChangeAddressRequest $request ): Address {
44 3
		if ( $request->isPersonal() ) {
45 3
			return Address::newPersonalAddress(
46 3
				$request->salutation,
47 3
				$request->title,
48 3
				$request->firstName,
49 3
				$request->lastName,
50 3
				$request->address,
51 3
				$request->postcode,
52 3
				$request->city,
53 3
				$request->country
54 3
			);
55
		} elseif ( $request->isCompany() ) {
56
			return Address::newCompanyAddress(
57
				$request->company,
58
				$request->address,
59
				$request->postcode,
60
				$request->city,
61
				$request->country
62
			);
63
		}
64
		throw new ChangeAddressValidationException( 'Address Type' );
65
	}
66
67
}
68