Completed
Pull Request — master (#10)
by Gabriel
60:20
created

ChangeAddressUseCase::buildAddress()   A

Complexity

Conditions 3
Paths 3

Size

Total Lines 22
Code Lines 18

Duplication

Lines 0
Ratio 0 %

Importance

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