Skip to content
This repository was archived by the owner on Oct 21, 2020. It is now read-only.

Commit 2d21e0e

Browse files
author
Alex Agile
committed
Add BurndownWidget application layer
1 parent 4802e1c commit 2d21e0e

File tree

19 files changed

+427
-31
lines changed

19 files changed

+427
-31
lines changed

cli-config.php

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
__DIR__ . '/src/Werkspot/JiraDashboard/SharedKernel/Infrastructure/Persistence/Doctrine/Team/Mapping' => 'Werkspot\JiraDashboard\SharedKernel\Domain\Model\Team',
1010
__DIR__ . '/src/Werkspot/JiraDashboard/SharedKernel/Infrastructure/Persistence/Doctrine/Sprint/Mapping' => 'Werkspot\JiraDashboard\SharedKernel\Domain\Model\Sprint',
1111
__DIR__ . '/src/Werkspot/JiraDashboard/ConfidenceWidget/Infrastructure/Persistence/Doctrine/Confidence/Mapping' => 'Werkspot\JiraDashboard\ConfidenceWidget\Domain',
12+
__DIR__ . '/src/Werkspot/JiraDashboard/BurndownWidget/Infrastructure/Persistence/Doctrine/RemainingPoints/Mapping' => 'Werkspot\JiraDashboard\BurndownWidget\Domain',
1213
];
1314

1415
$dbParams = [

config/packages/doctrine.yaml

Lines changed: 14 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,27 @@ doctrine:
3434
naming_strategy: doctrine.orm.naming_strategy.default
3535
auto_mapping: true
3636
mappings:
37-
Confidence:
37+
Team:
3838
is_bundle: false
3939
type: xml
40-
dir: '%kernel.project_dir%/src/Werkspot/JiraDashboard/ConfidenceWidget/Infrastructure/Persistence/Doctrine/Confidence/Mapping'
41-
prefix: 'Werkspot\JiraDashboard\ConfidenceWidget\Domain'
42-
alias: Confidence
40+
dir: '%kernel.project_dir%/src/Werkspot/JiraDashboard/SharedKernel/Infrastructure/Persistence/Doctrine/Team/Mapping'
41+
prefix: 'Werkspot\JiraDashboard\SharedKernel\Domain\Model\Team'
42+
alias: Team
4343
Sprint:
4444
is_bundle: false
4545
type: xml
4646
dir: '%kernel.project_dir%/src/Werkspot/JiraDashboard/SharedKernel/Infrastructure/Persistence/Doctrine/Sprint/Mapping'
4747
prefix: 'Werkspot\JiraDashboard\SharedKernel\Domain\Model\Sprint'
4848
alias: Sprint
49-
Team:
49+
Confidence:
5050
is_bundle: false
5151
type: xml
52-
dir: '%kernel.project_dir%/src/Werkspot/JiraDashboard/SharedKernel/Infrastructure/Persistence/Doctrine/Team/Mapping'
53-
prefix: 'Werkspot\JiraDashboard\SharedKernel\Domain\Model\Team'
54-
alias: Team
52+
dir: '%kernel.project_dir%/src/Werkspot/JiraDashboard/ConfidenceWidget/Infrastructure/Persistence/Doctrine/Confidence/Mapping'
53+
prefix: 'Werkspot\JiraDashboard\ConfidenceWidget\Domain'
54+
alias: Confidence
55+
RemainingPoints:
56+
is_bundle: false
57+
type: xml
58+
dir: '%kernel.project_dir%/src/Werkspot/JiraDashboard/BurndownWidget/Infrastructure/Persistence/Doctrine/RemainingPoints/Mapping'
59+
prefix: 'Werkspot\JiraDashboard\BurndownWidget\Domain'
60+
alias: RemainingPoints

config/services.yaml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,9 @@ services:
1717
Werkspot\JiraDashboard\ConfidenceWidget\:
1818
resource: '../src/Werkspot/JiraDashboard/ConfidenceWidget/'
1919
exclude: ''
20+
Werkspot\JiraDashboard\BurndownWidget\:
21+
resource: '../src/Werkspot/JiraDashboard/BurndownWidget/'
22+
exclude: ''
2023
Werkspot\JiraDashboard\SprintWidget\:
2124
resource: '../src/Werkspot/JiraDashboard/SprintWidget/'
2225
exclude: ''
@@ -46,6 +49,7 @@ services:
4649
Werkspot\JiraDashboard\SharedKernel\Domain\Model\Sprint\SprintRepositoryInterface: '@Werkspot\JiraDashboard\SharedKernel\Infrastructure\Persistence\Doctrine\Sprint\SprintRepositoryDoctrineAdapter'
4750
Werkspot\JiraDashboard\SharedKernel\Domain\Model\Team\TeamRepositoryInterface: '@Werkspot\JiraDashboard\SharedKernel\Infrastructure\Persistence\Doctrine\Team\TeamRepositoryDoctrineAdapter'
4851
Werkspot\JiraDashboard\ConfidenceWidget\Domain\ConfidenceRepositoryInterface: '@Werkspot\JiraDashboard\ConfidenceWidget\Infrastructure\Persistence\Doctrine\Confidence\ConfidenceRepositoryDoctrineAdapter'
52+
Werkspot\JiraDashboard\BurndownWidget\Domain\RemainingPointsRepositoryInterface: '@Werkspot\JiraDashboard\BurndownWidget\Infrastructure\Persistence\Doctrine\RemainingPoints\RemainingPointsRepositoryDoctrineAdapter'
4953

5054
# service factories
5155
League\Tactician\CommandBus:
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Werkspot\JiraDashboard\BurndownWidget\Application\RemainingPoints;
5+
6+
use Werkspot\JiraDashboard\BurndownWidget\Domain\BurndownWidget;
7+
use Werkspot\JiraDashboard\BurndownWidget\Domain\GetRemainingPointsBySprintQuery;
8+
use Werkspot\JiraDashboard\BurndownWidget\Domain\RemainingPointsRepositoryInterface;
9+
use Werkspot\JiraDashboard\SharedKernel\Domain\Exception\EntityNotFoundException;
10+
use Werkspot\JiraDashboard\SharedKernel\Domain\Model\Sprint\SprintRepositoryInterface;
11+
use Werkspot\JiraDashboard\SharedKernel\Domain\ValueObject\Id;
12+
13+
class GetRemainingPointsBySprintQueryHandler
14+
{
15+
/**
16+
* @var SprintRepositoryInterface
17+
*/
18+
private $sprintRepository;
19+
20+
/**
21+
* @var RemainingPointsRepositoryInterface
22+
*/
23+
private $remainingPointsRepository;
24+
25+
public function __construct(SprintRepositoryInterface $sprintRepository, RemainingPointsRepositoryInterface $remainingPointsRepository)
26+
{
27+
$this->sprintRepository = $sprintRepository;
28+
$this->remainingPointsRepository = $remainingPointsRepository;
29+
}
30+
31+
/**
32+
* @throws EntityNotFoundException
33+
*/
34+
public function handle(GetRemainingPointsBySprintQuery $remainingPointsBySprintQuery): ?array
35+
{
36+
$sprint = $this->sprintRepository->find(Id::create($remainingPointsBySprintQuery->sprintId()));
37+
38+
$remainingPointsWidget = new BurndownWidget($this->sprintRepository, $this->remainingPointsRepository);
39+
40+
return $remainingPointsWidget->getRemainingPointsBySprint($sprint);
41+
}
42+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Werkspot\JiraDashboard\BurndownWidget\Application\RemainingPoints;
5+
6+
use Werkspot\JiraDashboard\BurndownWidget\Domain\BurndownWidget;
7+
use Werkspot\JiraDashboard\BurndownWidget\Domain\RemainingPoints;
8+
use Werkspot\JiraDashboard\BurndownWidget\Domain\RemainingPointsRepositoryInterface;
9+
use Werkspot\JiraDashboard\BurndownWidget\Domain\SaveRemainingPointsCommand;
10+
use Werkspot\JiraDashboard\SharedKernel\Domain\Model\Sprint\SprintRepositoryInterface;
11+
use Werkspot\JiraDashboard\SharedKernel\Domain\ValueObject\Id;
12+
use Werkspot\JiraDashboard\SharedKernel\Domain\ValueObject\PositiveNumber;
13+
14+
class SaveRemainingPointsCommandHandler
15+
{
16+
/**
17+
* @var SprintRepositoryInterface
18+
*/
19+
private $sprintRepository;
20+
21+
/**
22+
* @var RemainingPointsRepositoryInterface
23+
*/
24+
private $remainingPointsRepository;
25+
26+
public function __construct(SprintRepositoryInterface $sprintRepository, RemainingPointsRepositoryInterface $remainingPointsRepository)
27+
{
28+
$this->remainingPointsRepository = $remainingPointsRepository;
29+
$this->sprintRepository = $sprintRepository;
30+
}
31+
32+
public function handle(SaveRemainingPointsCommand $command): void
33+
{
34+
$sprint = $this->sprintRepository->find(Id::create($command->sprintId()));
35+
36+
if (!$remainingPoints = $this->remainingPointsRepository->findByDate($command->date())) {
37+
$remainingPoints = new RemainingPoints(
38+
$sprint,
39+
$command->date(),
40+
PositiveNumber::create($command->value())
41+
);
42+
}
43+
$remainingPoints->setValue(PositiveNumber::create($command->value()));
44+
45+
$remainingPointsWidget = new BurndownWidget($this->sprintRepository, $this->remainingPointsRepository);
46+
$remainingPointsWidget->saveRemainingPoints($remainingPoints);
47+
}
48+
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Werkspot\JiraDashboard\BurndownWidget\Domain;
5+
6+
class GetRemainingPointsBySprintQuery
7+
{
8+
/**
9+
* @var string
10+
*/
11+
private $sprintId;
12+
13+
public function __construct(string $sprintId)
14+
{
15+
$this->sprintId = $sprintId;
16+
}
17+
18+
public function sprintId(): string
19+
{
20+
return $this->sprintId;
21+
}
22+
}

src/Werkspot/JiraDashboard/BurndownWidget/Domain/RemainingPointsRepositoryInterface.php

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,16 +3,17 @@
33

44
namespace Werkspot\JiraDashboard\BurndownWidget\Domain;
55

6-
use Werkspot\JiraDashboard\SharedKernel\Domain\Exception\EntityNotFoundException;
6+
use DateTimeImmutable;
77
use Werkspot\JiraDashboard\SharedKernel\Domain\Model\Sprint\Sprint;
88

99
interface RemainingPointsRepositoryInterface
1010
{
1111
/**
12-
* @throws EntityNotFoundException
1312
* @return RemainingPoints[]
1413
*/
15-
public function findBySprint(Sprint $sprint): array;
14+
public function findBySprint(Sprint $sprint): ?array;
15+
16+
public function findByDate(DateTimeImmutable $date): ?RemainingPoints;
1617

1718
public function upsert(RemainingPoints $confidence): void;
1819
}
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Werkspot\JiraDashboard\BurndownWidget\Domain;
5+
6+
use DateTimeImmutable;
7+
8+
class SaveRemainingPointsCommand
9+
{
10+
/** @var string */
11+
private $sprintId;
12+
13+
/** @var DateTimeImmutable */
14+
private $date;
15+
16+
/** @var int */
17+
private $value;
18+
19+
public function __construct(string $sprintId, DateTimeImmutable $date, int $value)
20+
{
21+
$this->sprintId = $sprintId;
22+
$this->date = $date;
23+
$this->value = $value;
24+
}
25+
26+
public function sprintId(): string
27+
{
28+
return $this->sprintId;
29+
}
30+
31+
public function date(): DateTimeImmutable
32+
{
33+
return $this->date;
34+
}
35+
36+
public function value(): int
37+
{
38+
return $this->value;
39+
}
40+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
<?xml version="1.0" encoding="UTF-8"?>
2+
<doctrine-mapping
3+
xmlns="http://doctrine-project.org/schemas/orm/doctrine-mapping"
4+
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
5+
xsi:schemaLocation="http://doctrine-project.org/schemas/orm/doctrine-mapping
6+
https://raw.github.com/doctrine/doctrine2/master/doctrine-mapping.xsd">
7+
<entity name="Werkspot\JiraDashboard\BurndownWidget\Domain\RemainingPoints" table="remaining_points">
8+
<id
9+
name="id"
10+
column="id"
11+
type="Id"
12+
/>
13+
<field
14+
name="date"
15+
type="datetime_immutable"
16+
/>
17+
<field
18+
name="value"
19+
type="PositiveNumber"
20+
/>
21+
22+
<many-to-one
23+
field="sprint"
24+
target-entity="Werkspot\JiraDashboard\SharedKernel\Domain\Model\Sprint\Sprint">
25+
<cascade>
26+
<cascade-persist/>
27+
<cascade-remove/>
28+
</cascade>
29+
<join-column name="sprintId" referenced-column-name="id"/>
30+
</many-to-one>
31+
</entity>
32+
</doctrine-mapping>
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
<?php
2+
declare(strict_types=1);
3+
4+
namespace Werkspot\JiraDashboard\BurndownWidget\Infrastructure\Persistence\Doctrine\RemainingPoints;
5+
6+
use DateTimeImmutable;
7+
use Doctrine\ORM\EntityManagerInterface;
8+
use Doctrine\ORM\Query;
9+
use Werkspot\JiraDashboard\BurndownWidget\Domain\RemainingPoints;
10+
use Werkspot\JiraDashboard\BurndownWidget\Domain\RemainingPointsRepositoryInterface;
11+
use Werkspot\JiraDashboard\SharedKernel\Domain\Exception\EntityNotFoundException;
12+
use Werkspot\JiraDashboard\SharedKernel\Domain\Model\Sprint\Sprint;
13+
14+
final class RemainingPointsRepositoryDoctrineAdapter implements RemainingPointsRepositoryInterface
15+
{
16+
/** @var EntityManagerInterface */
17+
private $em;
18+
19+
public function __construct(EntityManagerInterface $em)
20+
{
21+
$this->em = $em;
22+
}
23+
24+
/**
25+
* RemainingPoints[]
26+
*/
27+
public function findBySprint(Sprint $sprint): array
28+
{
29+
$queryBuilder = $this->em->createQueryBuilder()
30+
->select('r')
31+
->from(RemainingPoints::class, 'r')
32+
->join('r.sprint', 's')
33+
->where('s.id = :sprintId')
34+
->setParameter('sprintId', $sprint->getId()->id())
35+
->orderBy('r.date', 'ASC')
36+
->getQuery();
37+
38+
$remainingPointsCollection = $queryBuilder->execute(null, Query::HYDRATE_ARRAY);
39+
40+
if (empty($remainingPointsCollection)) {
41+
throw new EntityNotFoundException();
42+
}
43+
44+
return $remainingPointsCollection;
45+
}
46+
47+
public function findByDate(DateTimeImmutable $date): ?RemainingPoints
48+
{
49+
return $this->em->getRepository(RemainingPoints::class)->findOneByDate($date);
50+
}
51+
52+
public function upsert(RemainingPoints $remainingPoints): void
53+
{
54+
$this->em->persist($remainingPoints);
55+
$this->em->flush();
56+
}
57+
}

src/Werkspot/JiraDashboard/BurndownWidget/Infrastructure/Persistence/InMemory/RemainingPoints/RemainingPointsRepositoryInMemoryAdapter.php

Lines changed: 11 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33

44
namespace Werkspot\JiraDashboard\BurndownWidget\Infrastructure\Persistence\InMemory\RemainingPoints;
55

6+
use DateTimeImmutable;
67
use Werkspot\JiraDashboard\BurndownWidget\Domain\RemainingPoints;
78
use Werkspot\JiraDashboard\BurndownWidget\Domain\RemainingPointsRepositoryInterface;
89
use Werkspot\JiraDashboard\SharedKernel\Domain\Exception\EntityNotFoundException;
@@ -26,7 +27,6 @@ public function __construct(array $data = null)
2627
}
2728

2829
/**
29-
* @throws EntityNotFoundException
3030
* @return RemainingPoints[]
3131
*/
3232
public function findBySprint(Sprint $sprint): array
@@ -43,11 +43,18 @@ public function findBySprint(Sprint $sprint): array
4343
)
4444
);
4545

46-
if (empty($remainingPointsCollection)) {
47-
throw new EntityNotFoundException();
46+
return $remainingPointsCollection;
47+
}
48+
49+
public function findByDate(DateTimeImmutable $date): ?RemainingPoints
50+
{
51+
$confidenceKey = $date->format('Ymd');
52+
53+
if (!array_key_exists($confidenceKey, $this->inMemoryData)) {
54+
return null;
4855
}
4956

50-
return $remainingPointsCollection;
57+
return $this->inMemoryData[$confidenceKey];
5158
}
5259

5360
public function upsert(RemainingPoints $remainingPoints): void

src/Werkspot/JiraDashboard/ConfidenceWidget/Domain/ConfidenceRepositoryInterface.php

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,11 @@
1010
interface ConfidenceRepositoryInterface
1111
{
1212
/**
13-
* @throws EntityNotFoundException
1413
* @return Confidence[]
1514
*/
1615
public function findBySprint(Sprint $sprint): array;
1716

18-
/**
19-
* @throws EntityNotFoundException
20-
*/
21-
public function findByDate(DateTimeImmutable $date): Confidence;
17+
public function findByDate(DateTimeImmutable $date): ?Confidence;
2218

2319
public function upsert(Confidence $confidence): void;
2420
}

0 commit comments

Comments
 (0)