0

I get my data into Vue Js app with API platform mechanism called - “properties[]”. My URL look like “http://address/resource?properties[subresources]=id. I have custom doctrine extension to checking isEnabled field in entity. Extension checking if interface is implements to entity. The problem is when I have subresources with isEnabled and extension not working with it. I try writing subscriber or listener or custom normalizer for it, but unsuccessfully, because this request is serialize only one time.

Do you have any solution for it? I'd rather not rewrite my vue app again.

Extension code:

<?php

namespace App\Doctrine;

use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryCollectionExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Extension\QueryItemExtensionInterface;
use ApiPlatform\Core\Bridge\Doctrine\Orm\Util\QueryNameGeneratorInterface;
use App\Entity\Users\Admin;
use App\Entity\Users\AdminWorker;
use App\Entity\Interfaces\IsEnabledAwareInterface;
use Doctrine\ORM\QueryBuilder;
use Symfony\Component\Security\Core\Security;

final class IsEnabledAwareExtension implements QueryCollectionExtensionInterface, QueryItemExtensionInterface
{
    private $security;

    public function __construct(Security $security)
    {
        $this->security = $security;
    }

    public function applyToCollection(
        QueryBuilder $queryBuilder,
        QueryNameGeneratorInterface $queryNameGenerator,
        string $resourceClass,
        string $operationName = null
    ) {
        $this->addWhere($queryBuilder, $resourceClass);
    }

    public function applyToItem(
        QueryBuilder $queryBuilder,
        QueryNameGeneratorInterface $queryNameGenerator,
        string $resourceClass,
        array $identifiers,
        string $operationName = null,
        array $context = []
    ) {
        $this->addWhere($queryBuilder, $resourceClass);
    }

    private function addWhere(QueryBuilder $queryBuilder, string $resourceClass): void
    {
        $class = new \ReflectionClass($resourceClass);

        // skip if entity has not isEnabled field
        if (false === $class->implementsInterface(IsEnabledAwareInterface::class)) {
            return;
        }
        // skip for admin users (they should see not enabled also)
        $user = $this->security->getUser();
        if ($user instanceof Admin || $user instanceof AdminWorker) {
            return;
        }

        $rootAlias = $queryBuilder->getRootAliases()[0];
        $queryBuilder->andWhere(sprintf('%s.isEnabled = true', $rootAlias));
    }
}

Thanks for you time.

Solution or code for solution it.

0 Answers0