Passed
Push — 2.x ( 5e81a5...d097d1 )
by Aleksei
14:17
created

TransactionException   A

Complexity

Total Complexity 6

Size/Duplication

Total Lines 29
Duplicated Lines 0 %

Test Coverage

Coverage 80%

Importance

Changes 0
Metric Value
eloc 20
dl 0
loc 29
ccs 16
cts 20
cp 0.8
rs 10
c 0
b 0
f 0
wmc 6

1 Method

Rating   Name   Duplication   Size   Complexity  
A unresolvedRelations() 0 27 6
1
<?php
2
3
declare(strict_types=1);
4
5
namespace Cycle\ORM\Exception;
6
7
use Cycle\ORM\Heap\Node;
8
use Cycle\ORM\Service\RelationProviderInterface;
9
use Cycle\ORM\Relation\RelationInterface;
10
use Cycle\ORM\Transaction\Tuple;
11
12
class TransactionException extends ORMException
13
{
14 24
    public static function unresolvedRelations(iterable $tuples, RelationProviderInterface $relProvider): self
15
    {
16 24
        $messages = [];
17 24
        foreach ($tuples as $tuple) {
18 24
            $role = $tuple->node->getRole();
19 24
            $map = $relProvider->getRelationMap($role);
20
21 24
            $status = $tuple->task === Tuple::TASK_STORE && $tuple->node->getStatus() === Node::NEW
22 24
                ? 'Create new'
23
                : match ($tuple->task) {
24
                    Tuple::TASK_STORE => 'Update',
25
                    default => 'Delete',
26
                };
27 24
            $message = "$status `$role`";
28 24
            foreach ($map->getMasters() as $name => $relation) {
29 24
                $relationStatus = $tuple->state->getRelationStatus($relation->getName());
30 24
                if ($relationStatus === RelationInterface::STATUS_RESOLVED) {
31
                    continue;
32
                }
33 24
                $message .= sprintf("\n - %s (%s)", $name, $relation::class);
34
            }
35 24
            $messages[] = $message;
36
        }
37 24
        $messages = \array_unique($messages);
38 24
        $message = "Transaction can't be finished. Some relations can't be resolved:\n" . implode("\n", $messages);
39
40 24
        return new self($message);
41
    }
42
}
43