Skip to content

Commit cf79dee

Browse files
committed
Subscriber history service
1 parent cba3828 commit cf79dee

File tree

4 files changed

+174
-0
lines changed

4 files changed

+174
-0
lines changed
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Subscription\Model\Filter;
6+
7+
use DateTimeImmutable;
8+
use PhpList\Core\Domain\Common\Model\Filter\FilterRequestInterface;
9+
use PhpList\Core\Domain\Subscription\Model\Subscriber;
10+
11+
class SubscriptionHistoryFilter implements FilterRequestInterface
12+
{
13+
private ?Subscriber $subscriber;
14+
private ?string $ip;
15+
private ?DateTimeImmutable $dateFrom;
16+
private ?string $summery;
17+
18+
public function __construct(
19+
?Subscriber $subscriber = null,
20+
?string $ip = null,
21+
?DateTimeImmutable $dateFrom = null,
22+
?string $summery = null,
23+
) {
24+
$this->subscriber = $subscriber;
25+
$this->ip = $ip;
26+
$this->dateFrom = $dateFrom;
27+
$this->summery = $summery;
28+
}
29+
30+
public function getSubscriber(): ?Subscriber
31+
{
32+
return $this->subscriber;
33+
}
34+
35+
public function getIp(): ?string
36+
{
37+
return $this->ip;
38+
}
39+
40+
public function getDateFrom(): ?DateTimeImmutable
41+
{
42+
return $this->dateFrom;
43+
}
44+
45+
public function getSummery(): ?string
46+
{
47+
return $this->summery;
48+
}
49+
}

src/Domain/Subscription/Repository/SubscriberHistoryRepository.php

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,11 +4,50 @@
44

55
namespace PhpList\Core\Domain\Subscription\Repository;
66

7+
use InvalidArgumentException;
8+
use PhpList\Core\Domain\Common\Model\Filter\FilterRequestInterface;
79
use PhpList\Core\Domain\Common\Repository\AbstractRepository;
810
use PhpList\Core\Domain\Common\Repository\CursorPaginationTrait;
911
use PhpList\Core\Domain\Common\Repository\Interfaces\PaginatableRepositoryInterface;
12+
use PhpList\Core\Domain\Subscription\Model\Filter\SubscriptionHistoryFilter;
13+
use PhpList\Core\Domain\Subscription\Model\SubscriberHistory;
1014

1115
class SubscriberHistoryRepository extends AbstractRepository implements PaginatableRepositoryInterface
1216
{
1317
use CursorPaginationTrait;
18+
19+
/**
20+
* @return SubscriberHistory[]
21+
* @throws InvalidArgumentException
22+
*/
23+
public function getFilteredAfterId(int $lastId, int $limit, ?FilterRequestInterface $filter = null): array
24+
{
25+
$queryBuilder = $this->createQueryBuilder('sh');
26+
27+
if (!$filter instanceof SubscriptionHistoryFilter) {
28+
throw new InvalidArgumentException('Expected SubscriptionHistoryFilter.');
29+
}
30+
31+
if ($filter->getSubscriber() !== null) {
32+
$queryBuilder->andWhere('sh.subscriber = :subscriber')
33+
->setParameter('subscriber', $filter->getSubscriber());
34+
}
35+
36+
if ($filter->getDateFrom() !== null) {
37+
$queryBuilder->andWhere('sh.date >= :date')
38+
->setParameter('date', $filter->getDateFrom());
39+
}
40+
41+
if ($filter->getIp() !== null) {
42+
$queryBuilder->andWhere('sh.ip = :ip')
43+
->setParameter('ip', $filter->getIp());
44+
}
45+
46+
if ($filter->getSummery() !== null) {
47+
$queryBuilder->andWhere('sh.summery = :summery')
48+
->setParameter('summery', $filter->getSummery());
49+
}
50+
51+
return $queryBuilder->getQuery()->getResult();
52+
}
1453
}
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Subscription\Service;
6+
7+
use PhpList\Core\Domain\Subscription\Model\Filter\SubscriptionHistoryFilter;
8+
use PhpList\Core\Domain\Subscription\Repository\SubscriberHistoryRepository;
9+
10+
class SubscriptionHistoryService
11+
{
12+
private SubscriberHistoryRepository $repository;
13+
14+
public function __construct(SubscriberHistoryRepository $repository)
15+
{
16+
$this->repository = $repository;
17+
}
18+
19+
public function getHistory(int $lastId, int $limit, SubscriptionHistoryFilter $filter): array
20+
{
21+
return $this->repository->getFilteredAfterId($lastId, $limit, $filter);
22+
}
23+
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Tests\Unit\Domain\Subscription\Service;
6+
7+
use PhpList\Core\Domain\Subscription\Model\Filter\SubscriptionHistoryFilter;
8+
use PhpList\Core\Domain\Subscription\Model\SubscriberHistory;
9+
use PhpList\Core\Domain\Subscription\Repository\SubscriberHistoryRepository;
10+
use PhpList\Core\Domain\Subscription\Service\SubscriptionHistoryService;
11+
use PHPUnit\Framework\MockObject\MockObject;
12+
use PHPUnit\Framework\TestCase;
13+
14+
class SubscriptionHistoryServiceTest extends TestCase
15+
{
16+
private SubscriberHistoryRepository|MockObject $subscriberHistoryRepository;
17+
private SubscriptionHistoryService $subscriptionHistoryService;
18+
19+
protected function setUp(): void
20+
{
21+
$this->subscriberHistoryRepository = $this->createMock(SubscriberHistoryRepository::class);
22+
$this->subscriptionHistoryService = new SubscriptionHistoryService(
23+
repository: $this->subscriberHistoryRepository
24+
);
25+
}
26+
27+
public function testGetHistoryCallsRepositoryWithCorrectParameters(): void
28+
{
29+
$lastId = 10;
30+
$limit = 20;
31+
$filter = $this->createMock(SubscriptionHistoryFilter::class);
32+
$expectedResult = [$this->createMock(SubscriberHistory::class)];
33+
34+
$this->subscriberHistoryRepository
35+
->expects($this->once())
36+
->method('getFilteredAfterId')
37+
->with($lastId, $limit, $filter)
38+
->willReturn($expectedResult);
39+
40+
$result = $this->subscriptionHistoryService->getHistory($lastId, $limit, $filter);
41+
42+
$this->assertSame($expectedResult, $result);
43+
}
44+
45+
public function testGetHistoryReturnsEmptyArrayWhenRepositoryReturnsEmptyArray(): void
46+
{
47+
$lastId = 10;
48+
$limit = 20;
49+
$filter = $this->createMock(SubscriptionHistoryFilter::class);
50+
$expectedResult = [];
51+
52+
$this->subscriberHistoryRepository
53+
->expects($this->once())
54+
->method('getFilteredAfterId')
55+
->with($lastId, $limit, $filter)
56+
->willReturn($expectedResult);
57+
58+
$result = $this->subscriptionHistoryService->getHistory($lastId, $limit, $filter);
59+
60+
$this->assertSame($expectedResult, $result);
61+
$this->assertEmpty($result);
62+
}
63+
}

0 commit comments

Comments
 (0)