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

TransactionException::unresolvedRelations()   A

Complexity

Conditions 6
Paths 13

Size

Total Lines 27
Code Lines 19

Duplication

Lines 0
Ratio 0 %

Code Coverage

Tests 16
CRAP Score 6.288

Importance

Changes 0
Metric Value
cc 6
eloc 19
nc 13
nop 2
dl 0
loc 27
ccs 16
cts 20
cp 0.8
crap 6.288
rs 9.0111
c 0
b 0
f 0
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