Code Coverage
 
Lines
Functions and Methods
Classes and Traits
Total
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
2 / 2
CRAP
100.00% covered (success)
100.00%
1 / 1
GetExpenseHandler
100.00% covered (success)
100.00%
7 / 7
100.00% covered (success)
100.00%
2 / 2
3
100.00% covered (success)
100.00%
1 / 1
 __construct
100.00% covered (success)
100.00%
1 / 1
100.00% covered (success)
100.00%
1 / 1
1
 handle
100.00% covered (success)
100.00%
6 / 6
100.00% covered (success)
100.00%
1 / 1
2
1<?php
2
3declare(strict_types=1);
4
5namespace App\Expense\Application\Query;
6
7use App\Expense\Application\OwnedExpenseFinder;
8use App\Expense\Domain\ValueObject\ExpenseId;
9use App\Shared\Domain\ValueObject\Currency;
10use App\Trip\Domain\ValueObject\TripId;
11
12final readonly class GetExpenseHandler
13{
14    public function __construct(
15        private OwnedExpenseFinder $finder,
16        private ExpenseViewFactory $views,
17    ) {
18    }
19
20    public function handle(GetExpenseQuery $query): ?ExpenseView
21    {
22        $expense = $this->finder->findReadable(
23            new TripId($query->tripId),
24            $query->userId,
25            new ExpenseId($query->expenseId),
26        );
27
28        return $expense === null ? null : $this->views->create($expense, new Currency($query->preferredCurrency));
29    }
30}