diff --git a/migrations/Version20221031195841.php b/migrations/Version20221031195841.php new file mode 100644 index 00000000..da6e71ad --- /dev/null +++ b/migrations/Version20221031195841.php @@ -0,0 +1,33 @@ +addSql('ALTER TABLE groups ADD permissions_data LONGTEXT NOT NULL COMMENT \'(DC2Type:json)\''); + $this->addSql('ALTER TABLE users ADD permissions_data LONGTEXT NOT NULL COMMENT \'(DC2Type:json)\''); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE `groups` DROP permissions_data'); + $this->addSql('ALTER TABLE `users` DROP permissions_data'); + } +} diff --git a/src/Doctrine/Types/PermissionDataType.php b/src/Doctrine/Types/PermissionDataType.php deleted file mode 100644 index b33e4545..00000000 --- a/src/Doctrine/Types/PermissionDataType.php +++ /dev/null @@ -1,34 +0,0 @@ -getName(), $e); - } - } - - public function getName(): string - { - return 'permission_data'; - } -} \ No newline at end of file diff --git a/src/Entity/UserSystem/Group.php b/src/Entity/UserSystem/Group.php index ce22396e..c07e876a 100644 --- a/src/Entity/UserSystem/Group.php +++ b/src/Entity/UserSystem/Group.php @@ -97,13 +97,14 @@ class Group extends AbstractStructuralDBElement implements HasPermissionsInterfa /** * @var PermissionData - * @ORM\Column(type="permission_data", nullable=false, name="permissions") + * @ValidPermission() + * @ORM\Embedded(class="PermissionData", columnPrefix="permissions_") */ protected PermissionData $permissions; + /** @var PermissionsEmbed * @ORM\Embedded(class="PermissionsEmbed", columnPrefix="perms_") - * @ValidPermission() */ protected $permissions_old; @@ -146,10 +147,6 @@ class Group extends AbstractStructuralDBElement implements HasPermissionsInterfa public function getPermissions(): PermissionData { - if (!isset($this->permissions)) { - $this->permissions = new PermissionData(); - } - return $this->permissions; } diff --git a/src/Entity/UserSystem/PermissionData.php b/src/Entity/UserSystem/PermissionData.php index 06afd3ac..91611dc9 100644 --- a/src/Entity/UserSystem/PermissionData.php +++ b/src/Entity/UserSystem/PermissionData.php @@ -2,6 +2,14 @@ namespace App\Entity\UserSystem; +use Doctrine\ORM\Mapping as ORM; + +/** + * This class is used to store the permissions of a user. + * This has to be an embeddable or otherwise doctrine could not track the changes of the underlying data array (which is serialized to JSON in the database) + * + * @ORM\Embeddable() + */ final class PermissionData implements \JsonSerializable { /** @@ -17,8 +25,9 @@ final class PermissionData implements \JsonSerializable * permission => [ * operation => value, * ] + * @ORM\Column(type="json", name="data") */ - protected array $data = []; + protected ?array $data = []; /** * Creates a new Permission Data Instance using the given data. @@ -91,6 +100,11 @@ final class PermissionData implements \JsonSerializable return new self($data); } + public function __clone() + { + $this->data = $this->data; + } + /** * Returns an JSON encodable representation of this object. * @return array|mixed diff --git a/src/Entity/UserSystem/User.php b/src/Entity/UserSystem/User.php index 869bce89..09a83641 100644 --- a/src/Entity/UserSystem/User.php +++ b/src/Entity/UserSystem/User.php @@ -267,13 +267,13 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe /** * @var PermissionData - * @ORM\Column(type="permission_data", nullable=false, name="permissions") + * @ValidPermission() + * @ORM\Embedded(class="PermissionData", columnPrefix="permissions_") */ protected PermissionData $permissions; /** @var PermissionsEmbed * @ORM\Embedded(class="PermissionsEmbed", columnPrefix="perms_") - * @ValidPermission() */ protected $permissions_old; @@ -435,10 +435,6 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe public function getPermissions(): PermissionData { - if (!isset($this->permissions)) { - $this->permissions = new PermissionData(); - } - return $this->permissions; }