Implemented new law draft

This commit is contained in:
Kevin Frantz 2018-09-21 15:48:23 +02:00
parent a4fdb07cb6
commit 54615a458e
24 changed files with 369 additions and 155 deletions

View File

@ -17,7 +17,7 @@ final class LayerType extends AbstractEnumType
protected static $choices = [
self::NODE => 'node',
self::LAW =>'law',
self::LAW => 'law',
self::SOURCE => 'source',
];
}

View File

@ -15,9 +15,12 @@ final class RecieverType extends AbstractEnumType
public const CHILDREN = 'children';
public const SIBLINGS = 'siblings';
protected static $choices = [
self::NODE => 'node',
self::PARENTS => 'parents',
self::CHILDREN => 'children',
self::SIBLINGS => 'siblings',
];
}

View File

@ -1,21 +1,26 @@
<?php
namespace App\Entity;
use App\Logic\Result\ResultInterface;
use App\Logic\Operation\OperationInterface;
use App\Logic\Operation\OperandInterface;
use Doctrine\Common\Collections\ArrayCollection;
use Doctrine\ORM\Mapping as ORM;
/**
*
* @author kevinfrantz
*
* @ORM\Entity
* @ORM\Table(name="source_operation")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"and" = "AndOperation"})
*/
abstract class AbstractOperation extends AbstractSource implements OperationInterface
{
/**
* The result MUST NOT be saved via Doctrine!
*
* @var ResultInterface
*/
protected $result;
@ -35,4 +40,3 @@ abstract class AbstractOperation extends AbstractSource implements OperationInte
$this->operands = $operands;
}
}

View File

@ -11,6 +11,7 @@ use JMS\Serializer\Annotation\Exclude;
*
* @see https://www.doctrine-project.org/projects/doctrine-orm/en/2.6/reference/inheritance-mapping.html
* @ORM\Entity
* @ORM\Table(name="source")
* @ORM\InheritanceType("JOINED")
* @ORM\DiscriminatorColumn(name="discr", type="string")
* @ORM\DiscriminatorMap({"user" = "UserSource","name" = "NameSource"})

View File

@ -1,32 +1,34 @@
<?php
namespace App\Entity;
use App\Logic\Operation\OperandInterface;
use App\Logic\Result\Result;
use Doctrine\ORM\Mapping as ORM;
/**
*
* @author kevinfrantz
*
* @ORM\Table(name="source_operation_user")
* @ORM\Entity()
*/
class AndOperation extends AbstractOperation
{
public function process(): void
{
if($this->operands->isEmpty()){
throw new \Exception("Operands must be defined!");
if ($this->operands->isEmpty()) {
throw new \Exception('Operands must be defined!');
}
$this->result = new Result();
/**
* @var OperandInterface $operand
* @var OperandInterface
*/
foreach ($this->operands->toArray() as $operand){
if(!$operand->getResult()->getBool()){
foreach ($this->operands->toArray() as $operand) {
if (!$operand->getResult()->getBool()) {
$this->result->setAll(false);
return;
}
}
$this->result->setAll(true);
}
}

View File

@ -0,0 +1,31 @@
<?php
namespace App\Entity\Attribut;
use App\Logic\Operation\OperationInterface;
/**
* @author kevinfrantz
*/
trait ConditionAttribut
{
/**
* @var OperationInterface
*/
protected $condition;
public function getCondition(): OperationInterface
{
return $this->condition;
}
public function setCondition(OperationInterface $condition): void
{
$this->condition = $condition;
}
public function hasCondition(): bool
{
return $this->condition;
}
}

View File

@ -0,0 +1,17 @@
<?php
namespace App\Entity\Attribut;
use App\Logic\Operation\OperationInterface;
/**
* @author kevinfrantz
*/
interface ConditionAttributInterface
{
public function getCondition(): OperationInterface;
public function setCondition(OperationInterface $operation): void;
public function hasCondition(): bool;
}

View File

@ -0,0 +1,24 @@
<?php
namespace App\Entity\Attribut;
/**
* @author kevinfrantz
*/
trait LayerAttribut
{
/**
* @var string
*/
protected $layer;
public function setLayer(string $layer): void
{
$this->layer = $layer;
}
public function getLayer(): string
{
return $this->layer;
}
}

View File

@ -0,0 +1,13 @@
<?php
namespace App\Entity\Attribut;
/**
* @author kevinfrantz
*/
interface LayerAttributInterface
{
public function setLayer(string $layer): void;
public function getLayer(): string;
}

View File

@ -0,0 +1,26 @@
<?php
namespace App\Entity\Attribut;
use App\Entity\RecieverGroupInterface;
/**
* @author kevinfrantz
*/
trait RecieverGroupAttribut
{
/**
* @var RecieverGroupInterface
*/
protected $recieverGroup;
public function setRecieverGroup(RecieverGroupInterface $recieverGroup): void
{
$this->recieverGroup = $recieverGroup;
}
public function getRecieverGroup(): RecieverGroupInterface
{
return $this->recieverGroup;
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Entity\Attribut;
use App\Entity\RecieverGroupInterface;
/**
* @author kevinfrantz
*/
interface RecieverGroupAttributInterface
{
public function setRecieverGroup(RecieverGroupInterface $recieverGroup): void;
public function getRecieverGroup(): RecieverGroupInterface;
}

View File

@ -7,6 +7,7 @@ use App\Entity\Attribut\RightsAttribute;
use Doctrine\Common\Collections\ArrayCollection;
use App\DBAL\Types\RightType;
use App\Entity\Attribut\NodeAttribut;
use App\DBAL\Types\LayerType;
/**
* @author kevinfrantz
@ -20,7 +21,7 @@ class Law extends AbstractEntity implements LawInterface
/**
* @ORM\OneToMany(targetEntity="Right", mappedBy="law", cascade={"persist", "remove"})
*
* @var ArrayCollection
* @var ArrayCollection | Right[]
*/
protected $rights;
@ -40,11 +41,28 @@ class Law extends AbstractEntity implements LawInterface
private function initAllRights(): void
{
$this->rights = new ArrayCollection();
foreach (RightType::getChoices() as $key => $value) {
$right = new Right();
$right->setType($value);
$right->setLaw($this);
$this->rights->set($key, $right);
foreach (LayerType::getChoices() as $layerKey => $layerValue) {
foreach (RightType::getChoices() as $rightKey => $rightValue) {
$right = new Right();
$right->setType($rightKey);
$right->setLaw($this);
$right->setLayer($layerKey);
$this->rights->add($right);
}
}
}
public function isGranted(NodeInterface $node, string $layer, string $right): bool
{
/**
* @var RightInterface
*/
foreach ($this->rights->toArray() as $right) {
if ($right->isGranted($node, $layer, $right)) {
return true;
}
}
return false;
}
}

View File

@ -3,10 +3,11 @@
namespace App\Entity;
use App\Entity\Attribut\RightsAttributInterface;
use App\Entity\Method\NodeGrantedInterface;
/**
* @author kevinfrantz
*/
interface LawInterface extends RightsAttributInterface
interface LawInterface extends RightsAttributInterface, NodeGrantedInterface
{
}

View File

@ -0,0 +1,13 @@
<?php
namespace App\Entity\Method;
use App\Entity\NodeInterface;
/**
* @author kevinfrantz
*/
interface NodeGrantedInterface
{
public function isGranted(NodeInterface $node, string $layer, string $right): bool;
}

View File

@ -1,58 +0,0 @@
<?php
namespace App\Entity;
use Doctrine\ORM\Mapping as ORM;
use App\Entity\Attribut\NodeAttribut;
use App\Entity\Attribut\RightAttribut;
use App\Entity\Attribut\RecieverAttribut;
use App\DBAL\Types\RecieverType;
use Fresh\DoctrineEnumBundle\Validator\Constraints as DoctrineAssert;
use App\Entity\Attribut\GrantAttribut;
/**
* @author kevinfrantz
* @ORM\Table(name="permission")
* @ORM\Entity(repositoryClass="App\Repository\PermissionRepository")
*/
class Permission extends AbstractEntity implements PermissionInterface
{
use NodeAttribut,RightAttribut,RecieverAttribut,GrantAttribut;
/**
* @ORM\Column(name="reciever", type="RecieverType", nullable=false)
* @DoctrineAssert\Enum(entity="App\DBAL\Types\RecieverType")
*
* @var string
*/
protected $reciever;
/**
* @ORM\Column(type="boolean",name="`grant`")
*
* @var bool
*/
protected $grant;
/**
* @ORM\ManyToOne(targetEntity="Node")
* @ORM\JoinColumn(name="node_id", referencedColumnName="id")
*
* @var NodeInterface
*/
protected $node;
/**
* @ORM\ManyToOne(targetEntity="Right",inversedBy="permissions")
* @ORM\JoinColumn(name="right_id", referencedColumnName="id")
*
* @var RightInterface
*/
protected $right;
public function __construct()
{
$this->reciever = RecieverType::NODE;
$this->grant = true;
}
}

View File

@ -1,15 +0,0 @@
<?php
namespace App\Entity;
use App\Entity\Attribut\NodeAttributInterface;
use App\Entity\Attribut\RightAttributInterface;
use App\Entity\Attribut\RecieverAttributInterface;
use App\Entity\Attribut\GrantAttributInterface;
/**
* @author kevinfrantz
*/
interface PermissionInterface extends NodeAttributInterface, RightAttributInterface, RecieverAttributInterface, GrantAttributInterface
{
}

View File

@ -0,0 +1,48 @@
<?php
namespace App\Entity;
use App\Entity\Attribut\NodeAttribut;
use App\Entity\Attribut\RecieverAttribut;
use Doctrine\Common\Collections\ArrayCollection;
use App\DBAL\Types\RecieverType;
use Symfony\Component\Intl\Exception\NotImplementedException;
/**
* @author kevinfrantz
*/
class RecieverGroup extends AbstractEntity implements RecieverGroupInterface
{
use NodeAttribut,RecieverAttribut;
/**
* @ORM\Column(name="reciever", type="RecieverType", nullable=false)
* @DoctrineAssert\Enum(entity="App\DBAL\Types\RecieverType")
*
* @var string
*/
protected $reciever;
/**
* The node for which the right exists.
*
* @ORM\ManyToOne(targetEntity="Node")
* @ORM\JoinColumn(name="node_id", referencedColumnName="id")
*
* @var NodeInterface
*/
protected $node;
public function getAllRecievers(): ArrayCollection
{
switch ($this->reciever) {
case RecieverType::PARENTS:
return $this->node->getParents();
case RecieverType::NODE:
return new ArrayCollection([$this->node]);
case RecieverType::CHILDREN:
return $this->node->getChilds();
}
throw new NotImplementedException('Reciever '.$this->reciever.' not implemented.');
}
}

View File

@ -0,0 +1,15 @@
<?php
namespace App\Entity;
use App\Entity\Attribut\NodeAttributInterface;
use App\Entity\Attribut\RecieverAttributInterface;
use Doctrine\Common\Collections\ArrayCollection;
/**
* @author kevinfrantz
*/
interface RecieverGroupInterface extends NodeAttributInterface, RecieverAttributInterface
{
public function getAllRecievers(): ArrayCollection;
}

View File

@ -2,14 +2,20 @@
namespace App\Entity;
use Doctrine\Common\Collections\ArrayCollection;
use App\Entity\Attribut\TypeAttribut;
use App\DBAL\Types\RightType;
use Doctrine\ORM\Mapping as ORM;
use Fresh\DoctrineEnumBundle\Validator\Constraints as DoctrineAssert;
use App\Entity\Attribut\LawAttribut;
use App\DBAL\Types\LayerType;
use App\DBAL\Types\RightType;
use App\Entity\Attribut\PermissionsAttribut;
use Doctrine\Common\Collections\Collection;
use App\Entity\Attribut\NodeAttribut;
use App\Entity\Attribut\RecieverAttribut;
use App\Entity\Attribut\GrantAttribut;
use App\Logic\Operation\OperationInterface;
use App\Entity\Attribut\ConditionAttribut;
use App\Entity\Attribut\RecieverGroupAttribut;
use App\Entity\Attribut\LayerAttribut;
/**
* @author kevinfrantz
@ -18,7 +24,7 @@ use Doctrine\Common\Collections\Collection;
*/
class Right extends AbstractEntity implements RightInterface
{
use TypeAttribut,LawAttribut,PermissionsAttribut;
use TypeAttribut,LawAttribut,PermissionsAttribut, NodeAttribut, RecieverAttribut,GrantAttribut,ConditionAttribut,RecieverGroupAttribut,LayerAttribut;
/**
* @ORM\ManyToOne(targetEntity="Law", inversedBy="rights")
@ -28,6 +34,37 @@ class Right extends AbstractEntity implements RightInterface
*/
protected $law;
/**
* @ORM\Column(name="type", type="LayerType", nullable=false)
* @DoctrineAssert\Enum(entity="App\DBAL\Types\LayerType")
*
* @var string
*/
protected $layer;
/**
* @ORM\OneToOne(targetEntity="RecieverGroup",cascade={"persist", "remove"})
* @ORM\JoinColumn(name="reciever_id", referencedColumnName="id")
*
* @var RecieverGroupInterface
*/
protected $recieverGroup;
/**
* @ORM\Column(type="boolean",name="`grant`")
*
* @var bool
*/
protected $grant;
/**
* @ORM\ManyToOne(targetEntity="Node")
* @ORM\JoinColumn(name="node_id", referencedColumnName="id")
*
* @var NodeInterface
*/
protected $node;
/**
* @ORM\Column(name="type", type="RightType", nullable=false)
* @DoctrineAssert\Enum(entity="App\DBAL\Types\RightType")
@ -37,19 +74,38 @@ class Right extends AbstractEntity implements RightInterface
protected $type;
/**
* @ORM\OneToMany(targetEntity="Permission", mappedBy="right", cascade={"persist", "remove"})
* @ORM\OneToOne(targetEntity="AbstractOperation",cascade={"persist"},nullable=true)
*
* @var Collection
* @var OperationInterface
*/
protected $permissions;
public function isGranted(NodeInterface $node): bool
{
}
protected $condition;
public function __construct()
{
parent::__construct();
$this->permissions = new ArrayCollection();
$this->grant = true;
}
public function isGranted(NodeInterface $node, string $layer, string $right): bool
{
if ($this->layer == $layer && $this->type == $right && $this->checkIfNodeIsReciever($node) && $this->getConditionBoolOrTrue()) {
return $this->grant;
}
return !($this->grant);
}
private function getConditionBoolOrTrue(): bool
{
if ($this->hasCondition()) {
return $this->condition->getResult()->getBool();
}
return true;
}
private function checkIfNodeIsReciever(NodeInterface $node): bool
{
return $this->recieverGroup->getAllRecievers()->contains($node);
}
}

View File

@ -4,12 +4,16 @@ namespace App\Entity;
use App\Entity\Attribut\TypeAttributInterface;
use App\Entity\Attribut\LawAttributInterface;
use App\Entity\Attribut\PermissionsAttributInterface;
use App\Entity\Method\NodeGrantedInterface;
use App\Entity\Attribut\RecieverGroupAttributInterface;
use App\Entity\Attribut\GrantAttributInterface;
use App\Entity\Attribut\NodeAttributInterface;
use App\Entity\Attribut\ConditionAttributInterface;
use App\Entity\Attribut\LayerAttributInterface;
/**
* @author kevinfrantz
*/
interface RightInterface extends TypeAttributInterface, LawAttributInterface, PermissionsAttributInterface
interface RightInterface extends TypeAttributInterface, LawAttributInterface, NodeGrantedInterface, GrantAttributInterface, RecieverGroupAttributInterface, NodeAttributInterface, ConditionAttributInterface, LayerAttributInterface
{
public function isGranted(NodeInterface $node): bool;
}

View File

@ -1,19 +1,18 @@
<?php
namespace App\Logic\Operation;
use App\Logic\Result\ResultInterface;
/**
*
* @author kevinfrantz
*
*/
interface OperandInterface
{
/**
* Returns the result of the Operation
* Returns the result of the Operation.
*
* @return ResultInterface
*/
public function getResult():ResultInterface;
public function getResult(): ResultInterface;
}

View File

@ -1,26 +1,23 @@
<?php
namespace App\Logic\Operation;
use App\Logic\Result\ResultInterface;
use Doctrine\Common\Collections\ArrayCollection;
/**
*
* @author kevinfrantz
*
*/
interface OperationInterface extends OperandInterface
{
/**
* Sets the Operators the operation has to deal with
* Sets the Operators the operation has to deal with.
*
* @param ArrayCollection $operands | OperandInterface[]
*/
public function setOperators(ArrayCollection $operands):void;
public function setOperators(ArrayCollection $operands): void;
/**
* Process the logic
* Process the logic.
*/
public function process():void;
public function process(): void;
}

View File

@ -1,10 +1,9 @@
<?php
namespace App\Logic\Result;
/**
*
* @author kevinfrantz
*
*/
class Result implements ResultInterface
{
@ -14,7 +13,8 @@ class Result implements ResultInterface
protected $bool;
/**
* The concrete result value
* The concrete result value.
*
* @var mixed
*/
protected $value;
@ -41,9 +41,7 @@ class Result implements ResultInterface
public function setAll($value): void
{
$this->bool = (bool)$value;
$this->bool = (bool) $value;
$this->value = $value;
}
}

View File

@ -1,39 +1,41 @@
<?php
namespace App\Logic\Result;
/**
*
* @author kevinfrantz
*
*/
interface ResultInterface
{
/**
* Returns the Result as a string
* Returns the Result as a string.
*
* @return string
*/
//public function __toString():string;
/**
* Returns if the result is true
* Returns if the result is true.
*
* @return bool
*/
public function getBool():bool;
public function getBool(): bool;
public function setBool(bool $bool):void;
public function setBool(bool $bool): void;
/**
* Returns the concrete result value
* Returns the concrete result value.
*
* @var mixed
*/
public function getValue();
public function setValue($value):void;
public function setValue($value): void;
/**
* Sets bool and value attribut
* Sets bool and value attribut.
*
* @param mixed $value
*/
public function setAll($value):void;
public function setAll($value): void;
}