BannerSelectionUseCase::isRatioLimited()   A
last analyzed

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
nc 1
nop 1
dl 0
loc 2
ccs 2
cts 2
cp 1
crap 1
rs 10
c 0
b 0
f 0
1
<?php
2
3
declare( strict_types = 1 );
4
5
namespace WMDE\BannerServer\UseCase\BannerSelection;
6
7
use WMDE\BannerServer\Entity\BannerSelection\Campaign;
8
use WMDE\BannerServer\Entity\BannerSelection\CampaignCollection;
9
use WMDE\BannerServer\Entity\BannerSelection\ImpressionThreshold;
10
use WMDE\BannerServer\Entity\BannerSelection\RandomIntegerGenerator;
11
use WMDE\BannerServer\Entity\Visitor;
12
13
/**
14
 * @license GPL-2.0-or-later
15
 */
16
class BannerSelectionUseCase {
17
18 8
	public function __construct(
19
		private readonly CampaignCollection $campaignCollection,
20
		private readonly ImpressionThreshold $impressionThreshold,
21
		private readonly RandomIntegerGenerator $rng
22
	) {
23 8
	}
24
25 8
	public function selectBanner( Visitor $visitor ): BannerSelectionData {
26 8
		$remainingCampaigns = $this->campaignCollection->filter(
27 8
			function ( Campaign $campaign ) use ( $visitor ): bool {
28 8
				return (
29 8
					$campaign->isInActiveDateRange( new \DateTime() ) &&
30 8
					$campaign->isInDisplayRange( $visitor->getDisplayWidth() ) &&
31 8
					!$this->impressionThreshold->isThresholdReached( $visitor->getTotalImpressionCount() ) &&
32 8
					!$visitor->inCategory( $campaign->getCategory() ) &&
33 8
					!$this->isRatioLimited( $campaign->getDisplayPercentage() )
34 8
				);
35 8
			}
36 8
		);
37
38 8
		if ( $remainingCampaigns->isEmpty() ) {
39 4
			return new EmptyBannerSelectionData( $visitor );
40
		}
41
42 4
		$selectedCampaign = $remainingCampaigns->getFirstCampaign();
43
44 4
		$visitorBucket = $selectedCampaign->selectBucket(
45 4
			$visitor->getBucketIdentifier()
46 4
		);
47
48 4
		return new ActiveBannerSelectionData(
49 4
			new Visitor(
50 4
				$visitor->getTotalImpressionCount() + 1,
51 4
				$visitorBucket->getIdentifier(),
52 4
				$visitor->getDisplayWidth(),
53 4
				...$visitor->getCategories()
54 4
			),
55 4
			$visitorBucket->getBanner( $visitor->getTotalImpressionCount() ),
56 4
			$selectedCampaign->getEnd()
57 4
		);
58
	}
59
60 6
	private function isRatioLimited( int $campaignDisplayPercent ): bool {
61 6
		return $this->rng->getRandomInteger( 1, 100 ) > $campaignDisplayPercent;
62
	}
63
}
64