Completed
Push — master ( 7e5191...be23d1 )
by Tonina
32:29
created

UpdateAddressController::isOptOutOnly()   A

Complexity

Conditions 4
Paths 6

Size

Total Lines 13
Code Lines 10

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 9
CRAP Score 4.0961

Importance

Changes 0
Metric Value
cc 4
eloc 10
nc 6
nop 1
dl 0
loc 13
ccs 9
cts 11
cp 0.8182
crap 4.0961
rs 9.9332
c 0
b 0
f 0
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace WMDE\Fundraising\Frontend\App\Controllers;
6
7
use Symfony\Component\HttpFoundation\ParameterBag;
8
use Symfony\Component\HttpFoundation\Request;
9
use Symfony\Component\HttpFoundation\Response;
10
use WMDE\Fundraising\AddressChange\UseCases\ChangeAddress\ChangeAddressRequest;
11
use WMDE\Fundraising\Frontend\Factories\FunFunFactory;
12
13
/**
14
 * @license GNU GPL v2+
15
 */
16
class UpdateAddressController {
17
18 3
	public function updateAddress( string $addressToken, Request $request, FunFunFactory $ffFactory ): Response {
19
20 3
		$addressChangeRequest = $this->newAddressChangeRequestFromParams( $addressToken, $request->request );
21
22 3
		$useCase = $ffFactory->newChangeAddressUseCase();
23 3
		$response = $useCase->changeAddress( $addressChangeRequest );
24
25 3
		if ( !$response->isSuccess() ) {
26 1
			$ffFactory->getLogger()->error( 'Address change failed', [ 'domain_errors' => $response->getErrors() ] );
27 1
			return new Response( $ffFactory->newErrorPageHtmlPresenter()->present( implode( "\n", $response->getErrors() ) ) );
28
		}
29
30 2
		return new Response( $ffFactory->getLayoutTemplate( 'AddressUpdateSuccess.html.twig' )->render( $request->request->all() ) );
31
	}
32
33 3
	private function newAddressChangeRequestFromParams( string $addressToken, ParameterBag $params ): ChangeAddressRequest {
34 3
		$request = new ChangeAddressRequest();
35 3
		$request->setIdentifier( $addressToken );
36
37 3
		if ( $params->get( 'addressType', '' ) === 'person' ) {
38 1
			$request->setAddressType( 'person' );
39 1
			$this->addPersonNameParams( $request, $params );
40
		} else {
41 2
			$request->setAddressType( 'company' );
42 2
			$this->addCompanyNameParams( $request, $params );
43
		}
44
45 3
		$this->addPostalParams( $request, $params );
46 3
		$this->addReceiptParams( $request, $params );
47
48 3
		$request->assertNoNullFields()->freeze();
49 3
		return $request;
50
	}
51
52 1
	private function addPersonNameParams( ChangeAddressRequest $request, ParameterBag $params ): void {
53 1
		$request->setFirstName( $params->get( 'firstName', '' ) )
54 1
			->setLastName( $params->get( 'lastName', '' ) )
55 1
			->setSalutation( $params->get( 'salutation', '' ) )
56 1
			->setTitle( $params->get( 'title', '' ) )
57 1
			->setCompany( '' );
58 1
	}
59
60 2
	private function addCompanyNameParams( ChangeAddressRequest $request, ParameterBag $params ): void {
61 2
		$request->setFirstName( '' )
62 2
			->setLastName( '' )
63 2
			->setSalutation( '' )
64 2
			->setTitle( '' )
65 2
			->setCompany( $params->get( 'company', '' ) );
66 2
	}
67
68 3
	private function addPostalParams( ChangeAddressRequest $request, ParameterBag $params ): void {
69 3
		$request->setAddress( $params->get( 'street', '' ) )
70 3
			->setPostcode( $params->get( 'postcode', '' ) )
71 3
			->setCity( $params->get( 'city', '' ) )
72 3
			->setCountry( $params->get( 'country', 'DE' ) );
73 3
	}
74
75 3
	private function addReceiptParams( ChangeAddressRequest $request, ParameterBag $params ) {
76 3
		if ( ! $params->get( 'receiptOptOut', '' ) ) {
77 2
			$request->setIsOptOutOnly( false );
78 2
			$request->setDonationReceipt( false );
79 2
			return;
80
		}
81 1
		$request->setDonationReceipt( false );
82 1
		$request->setIsOptOutOnly( $this->isOptOutOnly( $params ) );
83 1
	}
84
85 1
	private function isOptOutOnly( ParameterBag $params ): bool {
86 1
		$requirePostalFields = [ 'street', 'postcode', 'city' ];
87 1
		$requiredNameFiels = $params->get( 'addressType', '' ) == 'person' ?
88 1
			[ 'firstName', 'lastName' ] : [ 'company' ];
89 1
		$requiredFields = array_merge( $requiredNameFiels, $requirePostalFields );
90 1
		$allFieldsAreEmpty = true;
91 1
		foreach( $requiredFields as $field ) {
92 1
			if ( $params->get( $field, '' ) !== '' ) {
93
				$allFieldsAreEmpty = false;
94
				break;
95
			}
96
		}
97 1
		return $allFieldsAreEmpty;
98
	}
99
100
}