<?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>
        <!-- Should be done by DoctrineMongoDBExtension. -->
        <service id="api_platform.doctrine_mongodb.odm.default_document_manager.property_info_extractor" class="ApiPlatform\Doctrine\Odm\PropertyInfo\DoctrineExtractor">
            <argument type="service" id="doctrine_mongodb.odm.default_document_manager" />
            <tag name="property_info.list_extractor" priority="-1001" />
            <tag name="property_info.type_extractor" priority="-999" />
            <tag name="property_info.access_extractor" priority="-999" />
        </service>

        <service id="api_platform.doctrine.metadata_factory" class="Doctrine\Persistence\Mapping\ClassMetadataFactory" public="false">
            <factory service="doctrine_mongodb.odm.default_document_manager" method="getMetadataFactory"/>
        </service>

        <service id="api_platform.doctrine_mongodb.odm.state.remove_processor" class="ApiPlatform\Doctrine\Common\State\RemoveProcessor">
            <argument type="service" id="doctrine_mongodb" />

            <tag name="api_platform.state_processor" priority="-100" key="api_platform.doctrine_mongodb.odm.state.remove_processor" />
            <tag name="api_platform.state_processor" priority="-100" key="ApiPlatform\Doctrine\Common\State\RemoveProcessor" />
        </service>
        <service id="ApiPlatform\Doctrine\Common\State\RemoveProcessor" alias="api_platform.doctrine_mongodb.odm.state.remove_processor" />

        <service id="api_platform.doctrine_mongodb.odm.state.persist_processor" class="ApiPlatform\Doctrine\Common\State\PersistProcessor">
            <argument type="service" id="doctrine_mongodb" />

            <tag name="api_platform.state_processor" priority="-100" key="api_platform.doctrine_mongodb.odm.state.persist_processor" />
            <tag name="api_platform.state_processor" priority="-100" key="ApiPlatform\Doctrine\Common\State\PersistProcessor" />
        </service>
        <service id="ApiPlatform\Doctrine\Common\State\PersistProcessor" alias="api_platform.doctrine_mongodb.odm.state.persist_processor" />

        <!-- Filter -->
        <service id="api_platform.doctrine_mongodb.odm.search_filter" class="ApiPlatform\Doctrine\Odm\Filter\SearchFilter" public="false" abstract="true">
            <argument type="service" id="doctrine_mongodb" />
            <argument type="service" id="api_platform.iri_converter" />
            <argument type="service" id="api_platform.identifiers_extractor" on-invalid="ignore" />
            <argument type="service" id="api_platform.property_accessor" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore"/>
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Filter\SearchFilter" alias="api_platform.doctrine_mongodb.odm.search_filter" />
        <service id="api_platform.doctrine_mongodb.odm.search_filter.instance" parent="api_platform.doctrine_mongodb.odm.search_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine_mongodb.odm.boolean_filter" class="ApiPlatform\Doctrine\Odm\Filter\BooleanFilter" public="false" abstract="true">
            <argument type="service" id="doctrine_mongodb" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore"/>
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Filter\BooleanFilter" alias="api_platform.doctrine_mongodb.odm.boolean_filter" />
        <service id="api_platform.doctrine_mongodb.odm.boolean_filter.instance" parent="api_platform.doctrine_mongodb.odm.boolean_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine_mongodb.odm.date_filter" class="ApiPlatform\Doctrine\Odm\Filter\DateFilter" public="false" abstract="true">
            <argument type="service" id="doctrine_mongodb" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore"/>
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Filter\DateFilter" alias="api_platform.doctrine_mongodb.odm.date_filter" />
        <service id="api_platform.doctrine_mongodb.odm.date_filter.instance" parent="api_platform.doctrine_mongodb.odm.date_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine_mongodb.odm.exists_filter" class="ApiPlatform\Doctrine\Odm\Filter\ExistsFilter" public="false" abstract="true">
            <argument type="service" id="doctrine_mongodb" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$existsParameterName">%api_platform.collection.exists_parameter_name%</argument>
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore"/>
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Filter\ExistsFilter" alias="api_platform.doctrine_mongodb.odm.exists_filter" />
        <service id="api_platform.doctrine_mongodb.odm.exists_filter.instance" parent="api_platform.doctrine_mongodb.odm.exists_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine_mongodb.odm.numeric_filter" class="ApiPlatform\Doctrine\Odm\Filter\NumericFilter" public="false" abstract="true">
            <argument type="service" id="doctrine_mongodb" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore"/>
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Filter\NumericFilter" alias="api_platform.doctrine_mongodb.odm.numeric_filter" />
        <service id="api_platform.doctrine_mongodb.odm.numeric_filter.instance" parent="api_platform.doctrine_mongodb.odm.numeric_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine_mongodb.odm.order_filter" class="ApiPlatform\Doctrine\Odm\Filter\OrderFilter" public="false" abstract="true">
            <argument type="service" id="doctrine_mongodb" />
            <argument>%api_platform.collection.order_parameter_name%</argument>
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore"/>
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Filter\OrderFilter" alias="api_platform.doctrine_mongodb.odm.order_filter" />
        <service id="api_platform.doctrine_mongodb.odm.order_filter.instance" parent="api_platform.doctrine_mongodb.odm.order_filter">
            <argument type="collection"></argument>
        </service>

        <service id="api_platform.doctrine_mongodb.odm.range_filter" class="ApiPlatform\Doctrine\Odm\Filter\RangeFilter" public="false" abstract="true">
            <argument type="service" id="doctrine_mongodb" />
            <argument type="service" id="logger" on-invalid="ignore" />
            <argument key="$nameConverter" type="service" id="api_platform.name_converter" on-invalid="ignore"/>
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Filter\RangeFilter" alias="api_platform.doctrine_mongodb.odm.range_filter" />
        <service id="api_platform.doctrine_mongodb.odm.range_filter.instance" parent="api_platform.doctrine_mongodb.odm.range_filter">
            <argument type="collection"></argument>
        </service>

        <!-- Doctrine Aggregation extensions -->

        <service id="api_platform.doctrine_mongodb.odm.aggregation_extension.filter" class="ApiPlatform\Doctrine\Odm\Extension\FilterExtension" public="false">
            <argument type="service" id="api_platform.filter_locator" />

            <tag name="api_platform.doctrine_mongodb.odm.aggregation_extension.collection" priority="32" />
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Extension\FilterExtension" alias="api_platform.doctrine_mongodb.odm.aggregation_extension.filter" />

        <service id="api_platform.doctrine_mongodb.odm.aggregation_extension.pagination"
                 class="ApiPlatform\Doctrine\Odm\Extension\PaginationExtension" public="false">
            <argument type="service" id="doctrine_mongodb"/>
            <argument type="service" id="api_platform.pagination" />

            <tag name="api_platform.doctrine_mongodb.odm.aggregation_extension.collection"/>
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Extension\PaginationExtension" alias="api_platform.doctrine_mongodb.odm.aggregation_extension.pagination" />

        <service id="api_platform.doctrine_mongodb.odm.aggregation_extension.order" class="ApiPlatform\Doctrine\Odm\Extension\OrderExtension" public="false">
            <argument>%api_platform.collection.order%</argument>
            <argument type="service" id="doctrine_mongodb" />

            <tag name="api_platform.doctrine_mongodb.odm.aggregation_extension.collection" priority="16" />
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Extension\OrderExtension" alias="api_platform.doctrine_mongodb.odm.aggregation_extension.order" />

        <service id="api_platform.doctrine_mongodb.odm.extension.parameter_extension" class="ApiPlatform\Doctrine\Odm\Extension\ParameterExtension" public="false">
            <argument type="service" id="api_platform.filter_locator" />

            <tag name="api_platform.doctrine_mongodb.odm.aggregation_extension.collection" priority="32" />
            <tag name="api_platform.doctrine_mongodb.odm.aggregation_extension.item"/>
        </service>
        <service id="ApiPlatform\Doctrine\Odm\Extension\ParameterExtension" alias="api_platform.doctrine_mongodb.odm.extension.parameter_extension" />

        <!-- Metadata loader -->
        <service id="api_platform.doctrine_mongodb.odm.metadata.property.metadata_factory"
                 class="ApiPlatform\Doctrine\Odm\Metadata\Property\DoctrineMongoDbOdmPropertyMetadataFactory"
                 decorates="api_platform.metadata.property.metadata_factory" decoration-priority="40" public="false">
            <argument type="service" id="doctrine_mongodb"/>
            <argument type="service" id="api_platform.doctrine_mongodb.odm.metadata.property.metadata_factory.inner"/>
        </service>

        <service id="api_platform.doctrine_mongodb.odm.state.collection_provider" class="ApiPlatform\Doctrine\Odm\State\CollectionProvider" public="false">
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory" />
            <argument type="service" id="doctrine_mongodb" />
            <argument type="tagged_iterator" tag="api_platform.doctrine_mongodb.odm.aggregation_extension.collection" />
            <argument type="tagged_locator" tag="api_platform.doctrine.odm.links_handler" index-by="key" />

            <tag name="api_platform.state_provider" priority="-100" key="ApiPlatform\Doctrine\Odm\State\CollectionProvider" />
            <tag name="api_platform.state_provider" priority="-100" key="api_platform.doctrine_mongodb.odm.state.collection_provider" />
        </service>
        <service id="ApiPlatform\Doctrine\Odm\State\CollectionProvider" alias="api_platform.doctrine_mongodb.odm.state.collection_provider" />

        <service id="api_platform.doctrine_mongodb.odm.state.item_provider" class="ApiPlatform\Doctrine\Odm\State\ItemProvider" public="false">
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory" />
            <argument type="service" id="doctrine_mongodb" />
            <argument type="tagged_iterator" tag="api_platform.doctrine_mongodb.odm.aggregation_extension.item" />
            <argument type="tagged_locator" tag="api_platform.doctrine.odm.links_handler" index-by="key" />

            <tag name="api_platform.state_provider" priority="-100" key="ApiPlatform\Doctrine\Odm\State\ItemProvider" />
            <tag name="api_platform.state_provider" priority="-100" key="api_platform.doctrine_mongodb.odm.state.item_provider" />
        </service>
        <service id="ApiPlatform\Doctrine\Odm\State\ItemProvider" alias="api_platform.doctrine_mongodb.odm.state.item_provider" />
        <service id="api_platform.state.item_provider" alias="ApiPlatform\Doctrine\Odm\State\ItemProvider" />

        <service id="api_platform.doctrine.odm.metadata.resource.metadata_collection_factory" class="ApiPlatform\Doctrine\Odm\Metadata\Resource\DoctrineMongoDbOdmResourceCollectionMetadataFactory" decorates="api_platform.metadata.resource.metadata_collection_factory" decoration-priority="40">
            <argument type="service" id="doctrine_mongodb" />
            <argument type="service" id="api_platform.doctrine.odm.metadata.resource.metadata_collection_factory.inner" />
        </service>

        <service id="api_platform.doctrine.odm.links_handler" class="ApiPlatform\Doctrine\Odm\State\LinksHandler">
            <argument type="service" id="api_platform.metadata.resource.metadata_collection_factory" />
            <argument type="service" id="doctrine_mongodb" />

            <tag name="api_platform.doctrine.odm.links_handler" key="api_platform.doctrine.odm.links_handler" />
        </service>
    </services>

</container>
