• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

systemsdk / docker-symfony-api / #74

pending completion
#74

push

DKravtsov
Php 8.2, symfony 6.2, updated RabbitMQ, updated composer dependencies, refactoring.

51 of 51 new or added lines in 44 files covered. (100.0%)

1479 of 2668 relevant lines covered (55.43%)

23.59 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

47.37
/src/General/Application/Resource/ResourceCollection.php
1
<?php
2

3
declare(strict_types=1);
4

5
namespace App\General\Application\Resource;
6

7
use App\General\Application\Collection\Traits\CollectionTrait;
8
use App\General\Application\Rest\Interfaces\RestResourceInterface;
9
use App\General\Application\Rest\Interfaces\RestSmallResourceInterface;
10
use CallbackFilterIterator;
11
use Closure;
12
use Countable;
13
use InvalidArgumentException;
14
use IteratorAggregate;
15
use IteratorIterator;
16
use Psr\Log\LoggerInterface;
17
use Throwable;
18

19
use function sprintf;
20

21
/**
22
 * Class ResourceCollection
23
 *
24
 * @package App\General
25
 *
26
 * @method IteratorAggregate<int, RestResourceInterface|RestSmallResourceInterface> getAll()
27
 */
28
class ResourceCollection implements Countable
29
{
30
    use CollectionTrait;
31

32
    /**
33
     * Constructor
34
     *
35
     * @param IteratorAggregate<int, RestResourceInterface|RestSmallResourceInterface> $items
36
     */
37
    public function __construct(
38
        private IteratorAggregate $items,
39
        private LoggerInterface $logger,
40
    ) {
41
    }
137✔
42

43
    /**
44
     * Getter method for REST resource by entity class name.
45
     * One Entity can have one or more resources services. If entity relates to one resource service you can find
46
     * by classname. Otherwise you can pass additional param $interface (f.e. RestFindOneResourceInterface).
47
     */
48
    public function getEntityResource(
49
        string $className,
50
        ?string $interface = null
51
    ): RestResourceInterface|RestSmallResourceInterface {
52
        return $this->getFilteredItemByEntity($className, $interface) ?? throw new InvalidArgumentException(
×
53
            sprintf('Resource class does not exist for entity \'%s\'', $className),
×
54
        );
×
55
    }
56

57
    /**
58
     * Method to check if specified entity class REST resource exist or not in current collection.
59
     */
60
    public function hasEntityResource(?string $className = null, ?string $interface = null): bool
61
    {
62
        return $this->getFilteredItemByEntity($className ?? '', $interface) !== null;
×
63
    }
64

65
    /**
66
     * {@inheritdoc}
67
     */
68
    public function filter(string $className, ?string $interface = null): Closure
69
    {
70
        return static fn (
25✔
71
            RestResourceInterface|RestSmallResourceInterface $restResource
25✔
72
        ): bool => $restResource instanceof $className
25✔
73
            && ($interface === null || ($interface && $restResource instanceof $interface));
25✔
74
    }
75

76
    /**
77
     * {@inheritdoc}
78
     */
79
    public function getErrorMessage(string $className): string
80
    {
81
        return sprintf('Resource \'%s\' does not exist', $className);
×
82
    }
83

84
    /**
85
     * {@inheritdoc}
86
     */
87
    public function get(string $className, ?string $interface = null): RestResourceInterface|RestSmallResourceInterface
88
    {
89
        $result = null;
25✔
90

91
        if ($interface) {
25✔
92
            $result = $this->getFilteredItem($className, $interface);
25✔
93
        }
94

95
        if (!$interface || !$result) {
25✔
96
            $result = $this->getFilteredItem($className);
×
97
        }
98

99
        return $result ?? throw new InvalidArgumentException($this->getErrorMessage($className));
25✔
100
    }
101

102
    /**
103
     * {@inheritdoc}
104
     */
105
    public function has(?string $className = null, ?string $interface = null): bool
106
    {
107
        return $this->getFilteredItem($className ?? '', $interface) !== null;
25✔
108
    }
109

110
    private function getFilteredItem(string $className, ?string $interface = null): mixed
111
    {
112
        try {
113
            $iterator = $this->items->getIterator();
25✔
114
        } catch (Throwable $throwable) {
×
115
            $this->logger->error($throwable->getMessage());
×
116

117
            return null;
×
118
        }
119

120
        $filteredIterator = new CallbackFilterIterator(
25✔
121
            new IteratorIterator($iterator),
25✔
122
            $this->filter($className, $interface)
25✔
123
        );
25✔
124
        $filteredIterator->rewind();
25✔
125

126
        return $filteredIterator->current();
25✔
127
    }
128

129
    /**
130
     * Getter method to get filtered item by given entity class.
131
     */
132
    private function getFilteredItemByEntity(
133
        string $entityName,
134
        ?string $interface = null
135
    ): RestResourceInterface|RestSmallResourceInterface|null {
136
        try {
137
            $iterator = $this->items->getIterator();
×
138
        } catch (Throwable $throwable) {
×
139
            $this->logger->error($throwable->getMessage());
×
140

141
            return null;
×
142
        }
143

144
        $callback = static fn (
×
145
            RestResourceInterface|RestSmallResourceInterface $resource
×
146
        ): bool => $resource->getEntityName() === $entityName
×
147
            && (($interface && $resource instanceof $interface) || $resource instanceof RestResourceInterface);
×
148

149
        $filteredIterator = new CallbackFilterIterator(new IteratorIterator($iterator), $callback);
×
150
        $filteredIterator->rewind();
×
151

152
        return $filteredIterator->current();
×
153
    }
154
}
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc