Completed
Pull Request — master (#1742)
by Gabriel
229:44 queued 164:40
created

CreateAddressChangeHandler::__construct()   A

Complexity

Conditions 1
Paths 1

Size

Total Lines 4
Code Lines 3

Duplication

Lines 0
Ratio 0 %

Importance

Changes 1
Bugs 0 Features 0
Metric Value
cc 1
eloc 3
c 1
b 0
f 0
nc 1
nop 2
dl 0
loc 4
rs 10
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace WMDE\Fundraising\Frontend\Infrastructure;
6
7
use Doctrine\ORM\EntityManager;
8
use WMDE\Fundraising\AddressChangeContext\Domain\Model\AddressChangeBuilder;
9
use WMDE\Fundraising\AddressChangeContext\Domain\Model\AddressChange;
10
use WMDE\Fundraising\DonationContext\Domain\Event\DonationCreatedEvent;
11
use WMDE\Fundraising\Frontend\Infrastructure\EventHandling\EventDispatcher;
12
use WMDE\Fundraising\MembershipContext\Domain\Event\MembershipCreatedEvent;
13
14
class CreateAddressChangeHandler {
15
16
	private EntityManager $entityManager;
17
18
	public function __construct( EntityManager $entityManager, EventDispatcher $dispatcher ) {
19
		$this->entityManager = $entityManager;
20
		$dispatcher->addEventListener( DonationCreatedEvent::class, [$this, 'onDonationCreated'] )
21
			->addEventListener( MembershipCreatedEvent::class, [$this, 'onMembershipCreated'] );
22
	}
23
24
	public function onDonationCreated( DonationCreatedEvent $event ): void {
25
		if ( $event->getDonor() === null ) {
26
			return;
27
		}
28
		$addressChangeBuilder = AddressChangeBuilder::create();
29
		$addressChangeBuilder->forDonation( $event->getDonationId() );
30
31
		if ( $event->getDonor()->getName()->isPrivatePerson() ) {
32
			$addressChangeBuilder->forPerson();
33
		} elseif ( $event->getDonor()->getName()->isCompany() ) {
34
			$addressChangeBuilder->forCompany();
35
		} else {
36
			// Preparation for https://phabricator.wikimedia.org/T220367
37
			return;
38
		}
39
40
		$this->persistIfNeeded( $addressChangeBuilder->build() );
41
	}
42
43
	public function onMembershipCreated( MembershipCreatedEvent $event ): void {
44
		$addressChangeBuilder = AddressChangeBuilder::create();
45
		$addressChangeBuilder->forMembership( $event->getMembershipId() );
46
47
		if ( $event->getApplicant()->isPrivatePerson() ) {
48
			$addressChangeBuilder->forPerson();
49
		} else {
50
			$addressChangeBuilder->forCompany();
51
		}
52
		$this->persistIfNeeded( $addressChangeBuilder->build() );
53
	}
54
55
	private function persistIfNeeded( AddressChange $addressChange ) {
56
		$countCriteria = [ 'externalId' => $addressChange->getExternalId(), 'externalIdType' => $addressChange->getExternalIdType()];
57
		if ( $this->entityManager->getRepository( AddressChange::class )->count( $countCriteria ) > 0 ) {
0 ignored issues
show
Bug introduced by
The method count() does not exist on Doctrine\Persistence\ObjectRepository. It seems like you code against a sub-type of Doctrine\Persistence\ObjectRepository such as Doctrine\ORM\EntityRepository. ( Ignorable by Annotation )

If this is a false-positive, you can also ignore this issue in your code via the ignore-call  annotation

57
		if ( $this->entityManager->getRepository( AddressChange::class )->/** @scrutinizer ignore-call */ count( $countCriteria ) > 0 ) {
Loading history...
58
			// New donations/memberships should never have address change records, but if they do, let's do nothing
59
			// Belt-and-suspenders approach for https://phabricator.wikimedia.org/T253658
60
			return;
61
		}
62
		$this->entityManager->persist( $addressChange );
63
		$this->entityManager->flush();
64
	}
65
}
66