mirror of
				https://github.com/kevinveenbirkenbach/infinito.git
				synced 2025-10-31 01:09:41 +00:00 
			
		
		
		
	Implemened class attribut in requested entity
This commit is contained in:
		| @@ -1,5 +1,4 @@ | ||||
| <?php | ||||
|  | ||||
| namespace App\Domain\RequestManagement\Entity; | ||||
|  | ||||
| use App\Entity\AbstractEntity; | ||||
| @@ -15,86 +14,100 @@ use App\Exception\NotSetException; | ||||
| use App\Repository\RepositoryInterface; | ||||
| use App\Entity\Source\SourceInterface; | ||||
| use Symfony\Component\HttpKernel\Exception\NotFoundHttpException; | ||||
| use App\Attribut\ClassAttribut; | ||||
| use App\Exception\AllreadyDefinedException; | ||||
| use App\Domain\RequestManagement\Right\RequestedRightInterface; | ||||
| use App\Exception\NotDefinedException; | ||||
|  | ||||
| /** | ||||
|  * | ||||
|  * @author kevinfrantz | ||||
|  */ | ||||
| class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
| { | ||||
|     use SlugAttribut, RequestedRightAttribut; | ||||
|     use SlugAttribut,  | ||||
|     RequestedRightAttribut, | ||||
|     ClassAttribut{ setClass as private setClassTrait; getClass as private getClassTrait;} | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @var LayerRepositoryFactoryServiceInterface | ||||
|      */ | ||||
|     private $layerRepositoryFactoryService; | ||||
|  | ||||
|     /** | ||||
|      * @param EntityManagerInterface $entityManager | ||||
|      */ | ||||
|     public function __construct(LayerRepositoryFactoryServiceInterface $layerRepositoryFactoryService) | ||||
|     { | ||||
|         $this->layerRepositoryFactoryService = $layerRepositoryFactoryService; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \App\Domain\RequestManagement\Entity\RequestedEntityInterface::setIdentity() | ||||
|      * @return bool True if an identity attribut is defined | ||||
|      */ | ||||
|     public function setIdentity($identity): void | ||||
|     private function hasIdentity(): bool | ||||
|     { | ||||
|         if (is_numeric($identity)) { | ||||
|             $this->setId($identity); | ||||
|             $this->slug = null; | ||||
|  | ||||
|             return; | ||||
|         } | ||||
|         $this->setSlug($identity); | ||||
|         $this->id = null; | ||||
|         return $this->hasId() || $this->hasSlug(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @throws NotSetException | ||||
|      */ | ||||
|     private function validateHasIdentity(): void | ||||
|     { | ||||
|         if (!($this->hasId() || $this->hasSlug())) { | ||||
|         if (! ($this->hasId() || $this->hasSlug())) { | ||||
|             throw new NotSetException('No identity attribut like id or slug was set!'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @param EntityInterface|null $entity | ||||
|      * | ||||
|      * @throws NotFoundHttpException | ||||
|      */ | ||||
|     private function validateLoadedEntity(?EntityInterface $entity): void | ||||
|     { | ||||
|         if (!$entity) { | ||||
|             throw new NotFoundHttpException('Entity with {id:"'.$this->id.'",slug:"'.$this->slug.'"} not found'); | ||||
|         if (! $entity) { | ||||
|             throw new NotFoundHttpException('Entity with {id:"' . $this->id . '",slug:"' . $this->slug . '"} not found'); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Sorry for the messed function, but should work ;) | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \App\Domain\RequestManagement\Entity\RequestedEntityInterface::getEntity() | ||||
|      * @return EntityInterface|SourceInterface|null | ||||
|      */ | ||||
|     public function getEntity(): EntityInterface | ||||
|     private function loadEntityBySlugOrId(): ?EntityInterface | ||||
|     { | ||||
|         $this->validateHasIdentity(); | ||||
|         if ($this->hasSlug()) { | ||||
|             $entity = $this->loadBySlug(); | ||||
|         } elseif ($this->hasId()) { | ||||
|             $entity = $this->loadById(); | ||||
|             return $this->loadBySlug(); | ||||
|         } | ||||
|         $this->validateLoadedEntity($entity); | ||||
|  | ||||
|         return $entity; | ||||
|         return $this->loadById(); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @throws NotCorrectInstanceException | ||||
|      * | ||||
|      * @return SourceInterface|null | ||||
|      */ | ||||
|     private function loadBySlug(): ?SourceInterface | ||||
|     { | ||||
|         $repository = $this->getEntityRepository(); | ||||
|         if ($repository instanceof SourceRepositoryInterface) { | ||||
|             return $repository->findOneBySlug($this->slug); | ||||
|         } | ||||
|         throw new NotCorrectInstanceException('To read an entity by slug is just allowed for entitys of type ' . AbstractSource::class); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return EntityInterface|null | ||||
|      */ | ||||
|     private function loadById(): ?EntityInterface | ||||
|     { | ||||
|         $repository = $this->getEntityRepository(); | ||||
|  | ||||
|         return $repository->find($this->id); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * @return RepositoryInterface | ||||
|      */ | ||||
|     private function getEntityRepository(): RepositoryInterface | ||||
| @@ -106,40 +119,91 @@ class RequestedEntity extends AbstractEntity implements RequestedEntityInterface | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @throws NotCorrectInstanceException | ||||
|      * | ||||
|      * @return SourceInterface|null | ||||
|      * @param EntityManagerInterface $entityManager | ||||
|      */ | ||||
|     private function loadBySlug(): ?SourceInterface | ||||
|     public function __construct(LayerRepositoryFactoryServiceInterface $layerRepositoryFactoryService) | ||||
|     { | ||||
|         $repository = $this->getEntityRepository(); | ||||
|         if ($repository instanceof SourceRepositoryInterface) { | ||||
|             return $repository->findOneBySlug($this->slug); | ||||
|         } | ||||
|         throw new NotCorrectInstanceException('To read an entity by slug is just allowed for entitys of type '.AbstractSource::class); | ||||
|         $this->layerRepositoryFactoryService = $layerRepositoryFactoryService; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * @return EntityInterface|null | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \App\Domain\RequestManagement\Entity\RequestedEntityInterface::setIdentity() | ||||
|      */ | ||||
|     private function loadById(): ?EntityInterface | ||||
|     public function setIdentity($identity): void | ||||
|     { | ||||
|         $repository = $this->getEntityRepository(); | ||||
|         if ($this->hasClass()) { | ||||
|             throw new AllreadyDefinedException('A identity can\'t be set if a class is allready defined!'); | ||||
|         } | ||||
|         if (is_numeric($identity)) { | ||||
|             $this->setId($identity); | ||||
|             $this->slug = null; | ||||
|  | ||||
|         return $repository->find($this->id); | ||||
|             return; | ||||
|         } | ||||
|         $this->setSlug($identity); | ||||
|         $this->id = null; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \App\Attribut\ClassAttributInterface::setClass() | ||||
|      */ | ||||
|     public function setClass(string $class): void | ||||
|     { | ||||
|         if ($this->hasIdentity()) { | ||||
|             throw new AllreadyDefinedException('A class can\'t be manual defined, if an identity is allready set!'); | ||||
|         } | ||||
|         $this->setClassTrait($class); | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \App\Domain\RequestManagement\Entity\RequestedEntityInterface::getEntity() | ||||
|      */ | ||||
|     public function getEntity(): EntityInterface | ||||
|     { | ||||
|         $this->validateHasIdentity(); | ||||
|         $entity = $this->loadEntityBySlugOrId(); | ||||
|         $this->validateLoadedEntity($entity); | ||||
|  | ||||
|         return $entity; | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * Overriding is neccessary to declare the correct relation | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \App\Attribut\RequestedRightAttributInterface::setRequestedRight() | ||||
|      */ | ||||
|     public function setRequestedRight($requestedRight): void | ||||
|     public function setRequestedRight(RequestedRightInterface $requestedRight): void | ||||
|     { | ||||
|         $this->requestedRight = $requestedRight; | ||||
|         if (!$this->requestedRight->hasRequestedEntity()) { | ||||
|         if (! $this->requestedRight->hasRequestedEntity()) { | ||||
|             $this->requestedRight->setRequestedEntity($this); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     /** | ||||
|      * | ||||
|      * {@inheritdoc} | ||||
|      * | ||||
|      * @see \App\Attribut\ClassAttributInterface::getClass() | ||||
|      */ | ||||
|     public function getClass(): string | ||||
|     { | ||||
|         if ($this->hasClass()) { | ||||
|             return $this->getClassTrait(); | ||||
|         } | ||||
|  | ||||
|         return get_class($this->getEntity()); | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -5,13 +5,14 @@ namespace App\Domain\RequestManagement\Entity; | ||||
| use App\Entity\EntityInterface; | ||||
| use App\Attribut\SlugAttributInterface; | ||||
| use App\Attribut\RequestedRightAttributInterface; | ||||
| use App\Attribut\ClassAttributInterface; | ||||
|  | ||||
| /** | ||||
|  * A requested entity containes the stumb attributes to load an entity. | ||||
|  * | ||||
|  * @author kevinfrantz | ||||
|  */ | ||||
| interface RequestedEntityInterface extends EntityInterface, SlugAttributInterface, RequestedRightAttributInterface | ||||
| interface RequestedEntityInterface extends EntityInterface, SlugAttributInterface, RequestedRightAttributInterface, ClassAttributInterface | ||||
| { | ||||
|     /** | ||||
|      * Sets the slug or the id. | ||||
|   | ||||
| @@ -11,6 +11,8 @@ use App\Domain\RequestManagement\Right\RequestedRightInterface; | ||||
| use App\DBAL\Types\Meta\Right\LayerType; | ||||
| use App\Repository\RepositoryInterface; | ||||
| use App\Entity\EntityInterface; | ||||
| use App\Entity\Source\AbstractSource; | ||||
| use App\Exception\AllreadyDefinedException; | ||||
|  | ||||
| /** | ||||
|  * @author kevinfrantz | ||||
| @@ -66,5 +68,24 @@ class RequestedEntityTest extends TestCase | ||||
|         $requestedEntity->setRequestedRight($requestedRight); | ||||
|         $entityResult = $requestedEntity->getEntity(); | ||||
|         $this->assertEquals($entityMock, $entityResult); | ||||
|         $this->assertEquals(get_class($entityMock), $requestedEntity->getClass()); | ||||
|         $this->expectException(AllreadyDefinedException::class); | ||||
|         $requestedEntity->setClass(AbstractSource::class); | ||||
|     } | ||||
|      | ||||
|     public function testSetClass():void{ | ||||
|         $class = AbstractSource::class; | ||||
|         $entityMock = $this->createMock(EntityInterface::class); | ||||
|         $repository = $this->createMock(RepositoryInterface::class); | ||||
|         $repository->method('find')->willReturn($entityMock); | ||||
|         $layerRepositoryFactoryService = $this->createMock(LayerRepositoryFactoryServiceInterface::class); | ||||
|         $layerRepositoryFactoryService->method('getRepository')->willReturn($repository); | ||||
|         $requestedEntity = new RequestedEntity($layerRepositoryFactoryService); | ||||
|         $this->assertFalse($requestedEntity->hasClass()); | ||||
|         $this->assertNull($requestedEntity->setClass($class)); | ||||
|         $this->assertTrue($requestedEntity->hasClass()); | ||||
|         $this->assertEquals($class, $requestedEntity->getClass()); | ||||
|         $this->expectException(AllreadyDefinedException::class); | ||||
|         $requestedEntity->setIdentity('123343'); | ||||
|     } | ||||
| } | ||||
|   | ||||
		Reference in New Issue
	
	Block a user