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

api-platform / core / 14635100171

24 Apr 2025 06:39AM UTC coverage: 8.271% (+0.02%) from 8.252%
14635100171

Pull #6904

github

web-flow
Merge c9cefd82e into a3e5e53ea
Pull Request #6904: feat(graphql): added support for graphql subscriptions to work for actions

0 of 73 new or added lines in 3 files covered. (0.0%)

1999 existing lines in 144 files now uncovered.

13129 of 158728 relevant lines covered (8.27%)

13.6 hits per line

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

94.59
/src/JsonApi/Serializer/CollectionNormalizer.php
1
<?php
2

3
/*
4
 * This file is part of the API Platform project.
5
 *
6
 * (c) Kévin Dunglas <dunglas@gmail.com>
7
 *
8
 * For the full copyright and license information, please view the LICENSE
9
 * file that was distributed with this source code.
10
 */
11

12
declare(strict_types=1);
13

14
namespace ApiPlatform\JsonApi\Serializer;
15

16
use ApiPlatform\Metadata\Resource\Factory\ResourceMetadataCollectionFactoryInterface;
17
use ApiPlatform\Metadata\ResourceClassResolverInterface;
18
use ApiPlatform\Metadata\Util\IriHelper;
19
use ApiPlatform\Serializer\AbstractCollectionNormalizer;
20
use Symfony\Component\Serializer\Exception\UnexpectedValueException;
21

22
/**
23
 * Normalizes collections in the JSON API format.
24
 *
25
 * @author Kevin Dunglas <dunglas@gmail.com>
26
 * @author Hamza Amrouche <hamza@les-tilleuls.coop>
27
 * @author Baptiste Meyer <baptiste.meyer@gmail.com>
28
 */
29
final class CollectionNormalizer extends AbstractCollectionNormalizer
30
{
31
    public const FORMAT = 'jsonapi';
32

33
    public function __construct(ResourceClassResolverInterface $resourceClassResolver, string $pageParameterName, ResourceMetadataCollectionFactoryInterface $resourceMetadataFactory)
34
    {
35
        parent::__construct($resourceClassResolver, $pageParameterName, $resourceMetadataFactory);
1,160✔
36
    }
37

38
    /**
39
     * {@inheritdoc}
40
     */
41
    protected function getPaginationData($object, array $context = []): array
42
    {
43
        [$paginator, $paginated, $currentPage, $itemsPerPage, $lastPage, $pageTotalItems, $totalItems] = $this->getPaginationConfig($object, $context);
35✔
44
        $parsed = IriHelper::parseIri($context['uri'] ?? '/', $this->pageParameterName);
35✔
45

46
        $operation = $context['operation'] ?? $this->getOperation($context);
35✔
47
        $urlGenerationStrategy = $operation->getUrlGenerationStrategy();
35✔
48

49
        $data = [
35✔
50
            'links' => [
35✔
51
                'self' => IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $paginated ? $currentPage : null, $urlGenerationStrategy),
35✔
52
            ],
35✔
53
        ];
35✔
54

55
        if ($paginated) {
35✔
UNCOV
56
            if (null !== $lastPage) {
6✔
UNCOV
57
                $data['links']['first'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, 1., $urlGenerationStrategy);
6✔
UNCOV
58
                $data['links']['last'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $lastPage, $urlGenerationStrategy);
6✔
59
            }
60

UNCOV
61
            if (1. !== $currentPage) {
6✔
UNCOV
62
                $data['links']['prev'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $currentPage - 1., $urlGenerationStrategy);
1✔
63
            }
64

UNCOV
65
            if (null !== $lastPage && $currentPage !== $lastPage || null === $lastPage && $pageTotalItems >= $itemsPerPage) {
6✔
UNCOV
66
                $data['links']['next'] = IriHelper::createIri($parsed['parts'], $parsed['parameters'], $this->pageParameterName, $currentPage + 1., $urlGenerationStrategy);
5✔
67
            }
68
        }
69

70
        if (null !== $totalItems) {
35✔
71
            $data['meta']['totalItems'] = $totalItems;
33✔
72
        }
73

74
        if ($paginator) {
35✔
75
            $data['meta']['itemsPerPage'] = (int) $itemsPerPage;
27✔
76
            $data['meta']['currentPage'] = (int) $currentPage;
27✔
77
        }
78

79
        return $data;
35✔
80
    }
81

82
    /**
83
     * {@inheritdoc}
84
     *
85
     * @throws UnexpectedValueException
86
     */
87
    protected function getItemsData($object, ?string $format = null, array $context = []): array
88
    {
89
        $data = [
35✔
90
            'data' => [],
35✔
91
        ];
35✔
92

93
        foreach ($object as $obj) {
35✔
94
            $item = $this->normalizer->normalize($obj, $format, $context);
32✔
95
            if (!\is_array($item)) {
32✔
96
                throw new UnexpectedValueException('Expected item to be an array');
×
97
            }
98

99
            if (!isset($item['data'])) {
32✔
100
                throw new UnexpectedValueException('The JSON API document must contain a "data" key.');
×
101
            }
102

103
            $data['data'][] = $item['data'];
32✔
104

105
            if (isset($item['included'])) {
32✔
UNCOV
106
                $data['included'] = array_values(array_unique(array_merge($data['included'] ?? [], $item['included']), \SORT_REGULAR));
4✔
107
            }
108
        }
109

110
        return $data;
35✔
111
    }
112
}
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