public function setUp()
 {
     parent::setUp();
     $resource = new ApiResource('posts', ['entity' => Post::class, 'filter' => PostFilter::class, 'pagination' => ['enabled' => true, 'limit' => 10], 'form_type' => DynamicFormType::class, 'identifier' => 'id']);
     $resource->setConfigName('posts');
     $this->router = $this->client->getContainer()->get('router');
     $resource->addAction(new Index($this->router));
     $resource->addAction(new Create($this->router));
     $this->manager = new ApiManager();
     $this->manager->addResource($resource);
 }
 /**
  * @param ApiResource $apiResource
  * @return string
  */
 protected function getFormType(ApiResource $apiResource)
 {
     if (Kernel::MAJOR_VERSION == 2 && Kernel::MINOR_VERSION == 7 && class_exists($apiResource->getFormTypeClass())) {
         $formClass = $apiResource->getFormTypeClass();
         $refl = new \ReflectionClass($formClass);
         $formInstance = $refl->newInstanceWithoutConstructor();
         $formType = $formInstance->getName();
     } else {
         $formType = $apiResource->getFormTypeClass();
     }
     return $formType;
 }
 /**
  * @param ApiResource $apiResource
  * @param Request $request
  * @return ApiResource[]
  */
 protected function getParentResources(ApiResource $apiResource, Request $request)
 {
     $parents = [];
     if ($parentResource = $apiResource->getParentResource()) {
         $id = $request->attributes->get($parentResource->getRoutePlaceholder());
         $parentResource->setIdentifierValue($id);
         $parents[] = $parentResource;
         foreach ($this->getParentResources($parentResource, $request) as $parentsParent) {
             $id = $request->attributes->get($parentsParent->getRoutePlaceholder());
             $parentsParent->setIdentifierValue($id);
             $parents[] = $parentsParent;
         }
     }
     return $parents;
 }
 /** @test */
 public function it_adds_filters_to_query_on_the_parent_resources()
 {
     $qb = $this->em->createQueryBuilder()->select('x')->from(Post::class, 'x');
     $manager = $this->getMockBuilder(ApiManager::class)->disableOriginalConstructor()->setMethods(['getBundlePrefix'])->getMock();
     $manager->method('getBundlePrefix')->willReturn('some.prefix');
     $categoryResource = new ApiResource('categories', ['entity' => Category::class, 'filter' => null, 'pagination' => ['enabled' => true, 'limit' => 10], 'form_type' => DynamicFormType::class, 'identifier' => 'id']);
     $categoryResource->setManager($manager);
     $postResource = new ApiResource('posts', ['entity' => Post::class, 'filter' => null, 'pagination' => ['enabled' => true, 'limit' => 10], 'form_type' => DynamicFormType::class, 'identifier' => 'id']);
     $postResource->setParentResource($categoryResource);
     $filter = new FilterDecorator($postResource);
     $builder = new FilterBuilder();
     $builder->setQueryBuilder($qb);
     $filter->buildFilter($builder);
     $filters = $builder->getFilters();
     $this->assertCount(1, $filters);
     $this->assertTrue(isset($filters[FilterDecorator::getFilterName($categoryResource)]));
     $filter = $filters[FilterDecorator::getFilterName($categoryResource)];
     $this->assertEquals(['category.id'], $filter->getFields());
 }
 /**
  * @param ApiResource $subResource
  */
 public function addSubResource(ApiResource $subResource)
 {
     $this->subResources[$subResource->getConfigName()] = $subResource;
 }
 /**
  * @param ApiResource $apiResource
  * @param array $searchParams
  * @param bool $public
  * @return array
  */
 private function getParams(ApiResource $apiResource, $searchParams = [], $public = false)
 {
     if ($parentResource = $apiResource->getParentResource()) {
         $key = $public ? $apiResource->getAssocParent() : FilterDecorator::getFilterName($parentResource);
         $searchParams[$key] = $parentResource->getIdentifierValue();
         $searchParams = array_merge($searchParams, $this->getParams($parentResource, $searchParams, $public));
     }
     return $searchParams;
 }
 /**
  * @param FilterBuilder $builder
  * @param $entity
  * @param EntityManager $em
  * @param ApiResource $parentResource
  * @param string $prefix
  */
 protected function addFilterForParent(FilterBuilder $builder, $entity, EntityManager $em, ApiResource $parentResource, $prefix = '')
 {
     $meta = $em->getClassMetadata($entity);
     $mappings = $this->getAssociationMappings($meta, $parentResource->getEntityClass());
     $builder->add(self::getFilterName($parentResource), EqualFilterType::class, ['fields' => $this->getFields($prefix, $mappings)]);
     if ($parentsParent = $parentResource->getParentResource()) {
         $this->addFilterForParent($builder, $parentResource->getEntityClass(), $em, $parentsParent, $parentResource->getAssocSubResource() . '.');
     }
 }
 /**
  * @return string
  */
 public function getControllerAction()
 {
     return $this->apiResource->getControllerServiceName() . ':' . $this->action . 'Action';
 }
 /**
  * @param $routeName
  * @param ApiResource $resource
  * @return string
  */
 private function getSection($routeName, ApiResource $resource)
 {
     $prefixPos = strlen($resource->getBundlePrefix() . '.');
     $nextDot = strpos($routeName, '.', $prefixPos);
     $resourceName = substr($routeName, $prefixPos, $nextDot - $prefixPos);
     $parentResource = $this->manager->getResource($resourceName);
     return ucwords($parentResource->getName());
 }
 /** @test */
 public function it_returns_the_form_handler_service_name()
 {
     $this->assertEquals($this->bundlePrefix . '.form_handler.posts', $this->config->getFormHandlerServiceName());
 }
 /**
  * @param ApiResource $apiResource
  * @return Definition
  */
 protected function getDefinitionForApiResource(ApiResource $apiResource)
 {
     return $this->container->getDefinition($apiResource->getResourceServiceName());
 }
 /**
  * @param Action $action
  * @param ApiResource $parentResource
  * @return mixed
  */
 private function getUrl(Action $action, ApiResource $parentResource = null)
 {
     $parent = $parentResource ? $parentResource->getResourceSingleElementUrl() : '';
     return $parent . $action->getUrlSchema();
 }