<?xml version="1.0" ?>

<container xmlns="http://symfony.com/schema/dic/services"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="http://symfony.com/schema/dic/services http://symfony.com/schema/dic/services/services-1.0.xsd">

    <services>
        <service id="api_platform.jsonapi.encoder" class="ApiPlatform\Serializer\JsonEncoder" public="false">
            <argument>jsonapi</argument>

            <tag name="serializer.encoder" />
        </service>

        <service id="api_platform.jsonapi.name_converter.reserved_attribute_name" class="ApiPlatform\JsonApi\Serializer\ReservedAttributeNameConverter" public="false">
            <argument type="service" id="api_platform.name_converter" on-invalid="ignore" />
        </service>

        <service id="api_platform.jsonapi.normalizer.entrypoint" class="ApiPlatform\JsonApi\Serializer\EntrypointNormalizer" public="false">
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory.retro_compatible" />
            <argument type="service" id="api_platform.iri_converter" />
            <argument type="service" id="api_platform.router" />

            <tag name="serializer.normalizer" priority="-800" />
        </service>

        <service id="api_platform.jsonapi.normalizer.collection" class="ApiPlatform\JsonApi\Serializer\CollectionNormalizer" public="false">
            <argument type="service" id="api_platform.resource_class_resolver" />
            <argument>%api_platform.collection.pagination.page_parameter_name%</argument>
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory.retro_compatible" />

            <!-- Run after api_platform.jsonapi.normalizer.object but before serializer.normalizer.object and serializer.denormalizer.array -->
            <tag name="serializer.normalizer" priority="-985" />
        </service>

        <service id="api_platform.jsonapi.normalizer.item" class="ApiPlatform\JsonApi\Serializer\ItemNormalizer" public="false">
            <argument type="service" id="api_platform.metadata.property.name_collection_factory" />
            <argument type="service" id="api_platform.metadata.property.metadata_factory" />
            <argument type="service" id="api_platform.iri_converter" />
            <argument type="service" id="api_platform.resource_class_resolver" />
            <argument type="service" id="api_platform.property_accessor" />
            <argument type="service" id="api_platform.jsonapi.name_converter.reserved_attribute_name" />
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory.retro_compatible" />
            <argument type="collection" />
            <argument type="tagged" tag="api_platform.data_transformer" on-invalid="ignore" />
            <argument type="service" id="api_platform.security.resource_access_checker" on-invalid="ignore" />

            <!-- Run before serializer.normalizer.json_serializable -->
            <tag name="serializer.normalizer" priority="-890" />
        </service>

        <service id="api_platform.jsonapi.normalizer.object" class="ApiPlatform\JsonApi\Serializer\ObjectNormalizer" public="false">
            <argument type="service" id="serializer.normalizer.object" />
            <argument type="service" id="api_platform.iri_converter" />
            <argument type="service" id="api_platform.resource_class_resolver" />
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory.retro_compatible" />

            <!-- Run after serializer.denormalizer.array but before serializer.normalizer.object -->
            <tag name="serializer.normalizer" priority="-995" />
        </service>

        <service id="api_platform.jsonapi.normalizer.constraint_violation_list" class="ApiPlatform\JsonApi\Serializer\ConstraintViolationListNormalizer" public="false">
            <argument type="service" id="api_platform.metadata.property.metadata_factory" />
            <argument type="service" id="api_platform.jsonapi.name_converter.reserved_attribute_name" />

            <tag name="serializer.normalizer" priority="-780" />
        </service>

        <service id="api_platform.jsonapi.normalizer.error" class="ApiPlatform\JsonApi\Serializer\ErrorNormalizer" public="false">
            <argument>%kernel.debug%</argument>

            <tag name="serializer.normalizer" priority="-790"/>
        </service>

        <!-- Event listener -->

        <service id="api_platform.jsonapi.listener.request.transform_pagination_parameters" class="ApiPlatform\Symfony\EventListener\JsonApi\TransformPaginationParametersListener">
            <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="5" />
        </service>

        <service id="api_platform.jsonapi.listener.request.transform_sorting_parameters" class="ApiPlatform\Symfony\EventListener\JsonApi\TransformSortingParametersListener">
            <argument>%api_platform.collection.order_parameter_name%</argument>
            <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="5" />
        </service>

        <service id="api_platform.jsonapi.listener.request.transform_fieldsets_parameters" class="ApiPlatform\Symfony\EventListener\JsonApi\TransformFieldsetsParametersListener">
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory.retro_compatible" />

            <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="5" />
        </service>

        <service id="api_platform.jsonapi.listener.request.transform_filtering_parameters" class="ApiPlatform\Symfony\EventListener\JsonApi\TransformFilteringParametersListener">
            <tag name="kernel.event_listener" event="kernel.request" method="onKernelRequest" priority="5" />
        </service>
    </services>

</container>
