mirror of
https://github.com/Part-DB/Part-DB-server.git
synced 2025-06-21 09:35:49 +02:00
Moved custom validators from annotations to attributes
This commit is contained in:
parent
e5a14557a2
commit
930adaf439
27 changed files with 50 additions and 148 deletions
|
@ -104,19 +104,13 @@ abstract class Attachment extends AbstractNamedDBElement
|
||||||
*/
|
*/
|
||||||
protected ?AttachmentContainingDBElement $element = null;
|
protected ?AttachmentContainingDBElement $element = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var bool
|
|
||||||
*/
|
|
||||||
#[ORM\Column(type: Types::BOOLEAN)]
|
#[ORM\Column(type: Types::BOOLEAN)]
|
||||||
protected bool $show_in_table = false;
|
protected bool $show_in_table = false;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var AttachmentType|null
|
|
||||||
* @Selectable()
|
|
||||||
*/
|
|
||||||
#[Assert\NotNull(message: 'validator.attachment.must_not_be_null')]
|
#[Assert\NotNull(message: 'validator.attachment.must_not_be_null')]
|
||||||
#[ORM\ManyToOne(targetEntity: 'AttachmentType', inversedBy: 'attachments_with_type')]
|
#[ORM\ManyToOne(targetEntity: 'AttachmentType', inversedBy: 'attachments_with_type')]
|
||||||
#[ORM\JoinColumn(name: 'type_id', nullable: false)]
|
#[ORM\JoinColumn(name: 'type_id', nullable: false)]
|
||||||
|
#[Selectable()]
|
||||||
protected ?AttachmentType $attachment_type = null;
|
protected ?AttachmentType $attachment_type = null;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
|
|
|
@ -50,12 +50,10 @@ class AttachmentType extends AbstractStructuralDBElement
|
||||||
#[ORM\JoinColumn(name: 'parent_id')]
|
#[ORM\JoinColumn(name: 'parent_id')]
|
||||||
protected ?AbstractStructuralDBElement $parent = null;
|
protected ?AbstractStructuralDBElement $parent = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var string
|
|
||||||
* @ValidFileFilter
|
|
||||||
*/
|
|
||||||
#[ORM\Column(type: Types::TEXT)]
|
#[ORM\Column(type: Types::TEXT)]
|
||||||
|
#[ValidFileFilter]
|
||||||
protected string $filetype_filter = '';
|
protected string $filetype_filter = '';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Collection<int, AttachmentTypeAttachment>
|
* @var Collection<int, AttachmentTypeAttachment>
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -87,16 +87,13 @@ abstract class AbstractStructuralDBElement extends AttachmentContainingDBElement
|
||||||
* We can not define the mapping here, or we will get an exception. Unfortunately we have to do the mapping in the
|
* We can not define the mapping here, or we will get an exception. Unfortunately we have to do the mapping in the
|
||||||
* subclasses.
|
* subclasses.
|
||||||
*
|
*
|
||||||
* @var AbstractStructuralDBElement[]|Collection
|
* @var Collection<AbstractStructuralDBElement>
|
||||||
*/
|
*/
|
||||||
#[Groups(['include_children'])]
|
#[Groups(['include_children'])]
|
||||||
protected Collection $children;
|
protected Collection $children;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var AbstractStructuralDBElement
|
|
||||||
* @NoneOfItsChildren()
|
|
||||||
*/
|
|
||||||
#[Groups(['include_parents', 'import'])]
|
#[Groups(['include_parents', 'import'])]
|
||||||
|
#[NoneOfItsChildren]
|
||||||
protected ?AbstractStructuralDBElement $parent = null;
|
protected ?AbstractStructuralDBElement $parent = null;
|
||||||
|
|
||||||
/** @var string[] all names of all parent elements as an array of strings,
|
/** @var string[] all names of all parent elements as an array of strings,
|
||||||
|
|
|
@ -41,7 +41,6 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
* This entity describes a lot where parts can be stored.
|
* This entity describes a lot where parts can be stored.
|
||||||
* It is the connection between a part and its store locations.
|
* It is the connection between a part and its store locations.
|
||||||
*
|
*
|
||||||
* @ValidPartLot()
|
|
||||||
* @see \App\Tests\Entity\Parts\PartLotTest
|
* @see \App\Tests\Entity\Parts\PartLotTest
|
||||||
*/
|
*/
|
||||||
#[ORM\Entity]
|
#[ORM\Entity]
|
||||||
|
@ -49,6 +48,7 @@ use Symfony\Component\Validator\Context\ExecutionContextInterface;
|
||||||
#[ORM\Table(name: 'part_lots')]
|
#[ORM\Table(name: 'part_lots')]
|
||||||
#[ORM\Index(name: 'part_lots_idx_instock_un_expiration_id_part', columns: ['instock_unknown', 'expiration_date', 'id_part'])]
|
#[ORM\Index(name: 'part_lots_idx_instock_un_expiration_id_part', columns: ['instock_unknown', 'expiration_date', 'id_part'])]
|
||||||
#[ORM\Index(name: 'part_lots_idx_needs_refill', columns: ['needs_refill'])]
|
#[ORM\Index(name: 'part_lots_idx_needs_refill', columns: ['needs_refill'])]
|
||||||
|
#[ValidPartLot]
|
||||||
class PartLot extends AbstractDBElement implements TimeStampableInterface, NamedElementInterface
|
class PartLot extends AbstractDBElement implements TimeStampableInterface, NamedElementInterface
|
||||||
{
|
{
|
||||||
use TimestampTrait;
|
use TimestampTrait;
|
||||||
|
@ -77,11 +77,11 @@ class PartLot extends AbstractDBElement implements TimeStampableInterface, Named
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Storelocation|null The storelocation of this lot
|
* @var Storelocation|null The storelocation of this lot
|
||||||
* @Selectable()
|
|
||||||
*/
|
*/
|
||||||
#[Groups(['simple', 'extended', 'full', 'import'])]
|
#[Groups(['simple', 'extended', 'full', 'import'])]
|
||||||
#[ORM\ManyToOne(targetEntity: 'Storelocation')]
|
#[ORM\ManyToOne(targetEntity: 'Storelocation')]
|
||||||
#[ORM\JoinColumn(name: 'id_store_location')]
|
#[ORM\JoinColumn(name: 'id_store_location')]
|
||||||
|
#[Selectable()]
|
||||||
protected ?Storelocation $storage_location = null;
|
protected ?Storelocation $storage_location = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -62,9 +62,9 @@ trait BasicPropertyTrait
|
||||||
/**
|
/**
|
||||||
* @var Category|null The category this part belongs too (e.g. Resistors). Use tags, for more complex grouping.
|
* @var Category|null The category this part belongs too (e.g. Resistors). Use tags, for more complex grouping.
|
||||||
* Every part must have a category.
|
* Every part must have a category.
|
||||||
* @Selectable()
|
|
||||||
*/
|
*/
|
||||||
#[Assert\NotNull(message: 'validator.select_valid_category')]
|
#[Assert\NotNull(message: 'validator.select_valid_category')]
|
||||||
|
#[Selectable()]
|
||||||
#[Groups(['simple', 'extended', 'full', 'import'])]
|
#[Groups(['simple', 'extended', 'full', 'import'])]
|
||||||
#[ORM\ManyToOne(targetEntity: 'Category')]
|
#[ORM\ManyToOne(targetEntity: 'Category')]
|
||||||
#[ORM\JoinColumn(name: 'id_category', nullable: false)]
|
#[ORM\JoinColumn(name: 'id_category', nullable: false)]
|
||||||
|
@ -72,11 +72,11 @@ trait BasicPropertyTrait
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Footprint|null The footprint of this part (e.g. DIP8)
|
* @var Footprint|null The footprint of this part (e.g. DIP8)
|
||||||
* @Selectable()
|
|
||||||
*/
|
*/
|
||||||
#[Groups(['simple', 'extended', 'full', 'import'])]
|
#[Groups(['simple', 'extended', 'full', 'import'])]
|
||||||
#[ORM\ManyToOne(targetEntity: 'Footprint')]
|
#[ORM\ManyToOne(targetEntity: 'Footprint')]
|
||||||
#[ORM\JoinColumn(name: 'id_footprint')]
|
#[ORM\JoinColumn(name: 'id_footprint')]
|
||||||
|
#[Selectable()]
|
||||||
protected ?Footprint $footprint = null;
|
protected ?Footprint $footprint = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -37,11 +37,11 @@ trait ManufacturerTrait
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
* @var Manufacturer|null The manufacturer of this part
|
* @var Manufacturer|null The manufacturer of this part
|
||||||
* @Selectable()
|
|
||||||
*/
|
*/
|
||||||
#[Groups(['simple', 'extended', 'full', 'import'])]
|
#[Groups(['simple', 'extended', 'full', 'import'])]
|
||||||
#[ORM\ManyToOne(targetEntity: 'Manufacturer')]
|
#[ORM\ManyToOne(targetEntity: 'Manufacturer')]
|
||||||
#[ORM\JoinColumn(name: 'id_manufacturer')]
|
#[ORM\JoinColumn(name: 'id_manufacturer')]
|
||||||
|
#[Selectable()]
|
||||||
protected ?Manufacturer $manufacturer = null;
|
protected ?Manufacturer $manufacturer = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -70,18 +70,18 @@ class Supplier extends AbstractCompany
|
||||||
/**
|
/**
|
||||||
* @var Currency|null The currency that should be used by default for order informations with this supplier.
|
* @var Currency|null The currency that should be used by default for order informations with this supplier.
|
||||||
* Set to null, to use global base currency.
|
* Set to null, to use global base currency.
|
||||||
* @Selectable()
|
|
||||||
*/
|
*/
|
||||||
#[ORM\ManyToOne(targetEntity: Currency::class)]
|
#[ORM\ManyToOne(targetEntity: Currency::class)]
|
||||||
#[ORM\JoinColumn(name: 'default_currency_id')]
|
#[ORM\JoinColumn(name: 'default_currency_id')]
|
||||||
|
#[Selectable()]
|
||||||
protected ?Currency $default_currency = null;
|
protected ?Currency $default_currency = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var BigDecimal|null the shipping costs that have to be paid, when ordering via this supplier
|
* @var BigDecimal|null the shipping costs that have to be paid, when ordering via this supplier
|
||||||
* @BigDecimalPositiveOrZero()
|
|
||||||
*/
|
*/
|
||||||
#[Groups(['extended', 'full', 'import'])]
|
#[Groups(['extended', 'full', 'import'])]
|
||||||
#[ORM\Column(name: 'shipping_costs', nullable: true, type: 'big_decimal', precision: 11, scale: 5)]
|
#[ORM\Column(name: 'shipping_costs', nullable: true, type: 'big_decimal', precision: 11, scale: 5)]
|
||||||
|
#[BigDecimalPositiveOrZero()]
|
||||||
protected ?BigDecimal $shipping_costs = null;
|
protected ?BigDecimal $shipping_costs = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -51,9 +51,9 @@ class Currency extends AbstractStructuralDBElement
|
||||||
/**
|
/**
|
||||||
* @var BigDecimal|null The exchange rate between this currency and the base currency
|
* @var BigDecimal|null The exchange rate between this currency and the base currency
|
||||||
* (how many base units the current currency is worth)
|
* (how many base units the current currency is worth)
|
||||||
* @BigDecimalPositive()
|
|
||||||
*/
|
*/
|
||||||
#[ORM\Column(type: 'big_decimal', precision: 11, scale: 5, nullable: true)]
|
#[ORM\Column(type: 'big_decimal', precision: 11, scale: 5, nullable: true)]
|
||||||
|
#[BigDecimalPositive()]
|
||||||
protected ?BigDecimal $exchange_rate = null;
|
protected ?BigDecimal $exchange_rate = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -53,20 +53,20 @@ class Pricedetail extends AbstractDBElement implements TimeStampableInterface
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var BigDecimal The price related to the detail. (Given in the selected currency)
|
* @var BigDecimal The price related to the detail. (Given in the selected currency)
|
||||||
* @BigDecimalPositive()
|
|
||||||
*/
|
*/
|
||||||
#[Groups(['extended', 'full'])]
|
#[Groups(['extended', 'full'])]
|
||||||
#[ORM\Column(type: 'big_decimal', precision: 11, scale: 5)]
|
#[ORM\Column(type: 'big_decimal', precision: 11, scale: 5)]
|
||||||
|
#[BigDecimalPositive()]
|
||||||
protected BigDecimal $price;
|
protected BigDecimal $price;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var ?Currency The currency used for the current price information.
|
* @var ?Currency The currency used for the current price information.
|
||||||
* If this is null, the global base unit is assumed.
|
* If this is null, the global base unit is assumed
|
||||||
* @Selectable()
|
|
||||||
*/
|
*/
|
||||||
#[Groups(['extended', 'full', 'import'])]
|
#[Groups(['extended', 'full', 'import'])]
|
||||||
#[ORM\ManyToOne(targetEntity: 'Currency', inversedBy: 'pricedetails')]
|
#[ORM\ManyToOne(targetEntity: 'Currency', inversedBy: 'pricedetails')]
|
||||||
#[ORM\JoinColumn(name: 'id_currency')]
|
#[ORM\JoinColumn(name: 'id_currency')]
|
||||||
|
#[Selectable()]
|
||||||
protected ?Currency $currency = null;
|
protected ?Currency $currency = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -96,10 +96,10 @@ class ProjectBOMEntry extends AbstractDBElement
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var ?Currency The currency for the price of this non-part BOM entry
|
* @var ?Currency The currency for the price of this non-part BOM entry
|
||||||
* @Selectable()
|
|
||||||
*/
|
*/
|
||||||
#[ORM\ManyToOne(targetEntity: Currency::class)]
|
#[ORM\ManyToOne(targetEntity: Currency::class)]
|
||||||
#[ORM\JoinColumn]
|
#[ORM\JoinColumn]
|
||||||
|
#[Selectable]
|
||||||
protected ?Currency $price_currency = null;
|
protected ?Currency $price_currency = null;
|
||||||
|
|
||||||
public function __construct()
|
public function __construct()
|
||||||
|
|
|
@ -22,6 +22,7 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace App\Entity\UserSystem;
|
namespace App\Entity\UserSystem;
|
||||||
|
|
||||||
|
use App\Validator\Constraints\NoLockout;
|
||||||
use Doctrine\DBAL\Types\Types;
|
use Doctrine\DBAL\Types\Types;
|
||||||
use App\Entity\Attachments\GroupAttachment;
|
use App\Entity\Attachments\GroupAttachment;
|
||||||
use App\Entity\Base\AbstractStructuralDBElement;
|
use App\Entity\Base\AbstractStructuralDBElement;
|
||||||
|
@ -41,6 +42,7 @@ use Symfony\Component\Validator\Constraints as Assert;
|
||||||
#[ORM\Table('`groups`')]
|
#[ORM\Table('`groups`')]
|
||||||
#[ORM\Index(name: 'group_idx_name', columns: ['name'])]
|
#[ORM\Index(name: 'group_idx_name', columns: ['name'])]
|
||||||
#[ORM\Index(name: 'group_idx_parent_name', columns: ['parent_id', 'name'])]
|
#[ORM\Index(name: 'group_idx_parent_name', columns: ['parent_id', 'name'])]
|
||||||
|
#[NoLockout()]
|
||||||
class Group extends AbstractStructuralDBElement implements HasPermissionsInterface
|
class Group extends AbstractStructuralDBElement implements HasPermissionsInterface
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
@ -66,6 +68,7 @@ class Group extends AbstractStructuralDBElement implements HasPermissionsInterfa
|
||||||
#[Groups(['extended', 'full', 'import'])]
|
#[Groups(['extended', 'full', 'import'])]
|
||||||
#[ORM\Column(type: Types::BOOLEAN, name: 'enforce_2fa')]
|
#[ORM\Column(type: Types::BOOLEAN, name: 'enforce_2fa')]
|
||||||
protected bool $enforce2FA = false;
|
protected bool $enforce2FA = false;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var Collection<int, GroupAttachment>
|
* @var Collection<int, GroupAttachment>
|
||||||
*/
|
*/
|
||||||
|
@ -74,15 +77,13 @@ class Group extends AbstractStructuralDBElement implements HasPermissionsInterfa
|
||||||
#[ORM\OrderBy(['name' => 'ASC'])]
|
#[ORM\OrderBy(['name' => 'ASC'])]
|
||||||
protected Collection $attachments;
|
protected Collection $attachments;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var PermissionData|null
|
|
||||||
* @ValidPermission()
|
|
||||||
*/
|
|
||||||
#[Groups(['full'])]
|
#[Groups(['full'])]
|
||||||
#[ORM\Embedded(class: 'PermissionData', columnPrefix: 'permissions_')]
|
#[ORM\Embedded(class: 'PermissionData', columnPrefix: 'permissions_')]
|
||||||
|
#[ValidPermission()]
|
||||||
protected ?PermissionData $permissions = null;
|
protected ?PermissionData $permissions = null;
|
||||||
|
|
||||||
/** @var Collection<int, GroupParameter>
|
/**
|
||||||
|
* @var Collection<int, GroupParameter>
|
||||||
*/
|
*/
|
||||||
#[Assert\Valid]
|
#[Assert\Valid]
|
||||||
#[ORM\OneToMany(targetEntity: GroupParameter::class, mappedBy: 'element', cascade: ['persist', 'remove'], orphanRemoval: true)]
|
#[ORM\OneToMany(targetEntity: GroupParameter::class, mappedBy: 'element', cascade: ['persist', 'remove'], orphanRemoval: true)]
|
||||||
|
|
|
@ -24,6 +24,7 @@ namespace App\Entity\UserSystem;
|
||||||
|
|
||||||
use App\Repository\UserRepository;
|
use App\Repository\UserRepository;
|
||||||
use App\EntityListeners\TreeCacheInvalidationListener;
|
use App\EntityListeners\TreeCacheInvalidationListener;
|
||||||
|
use App\Validator\Constraints\NoLockout;
|
||||||
use Doctrine\DBAL\Types\Types;
|
use Doctrine\DBAL\Types\Types;
|
||||||
use App\Entity\Attachments\AttachmentContainingDBElement;
|
use App\Entity\Attachments\AttachmentContainingDBElement;
|
||||||
use App\Entity\Attachments\UserAttachment;
|
use App\Entity\Attachments\UserAttachment;
|
||||||
|
@ -64,6 +65,7 @@ use Jbtronics\TFAWebauthn\Model\TwoFactorInterface as WebauthnTwoFactorInterface
|
||||||
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
#[ORM\EntityListeners([TreeCacheInvalidationListener::class])]
|
||||||
#[ORM\Table('`users`')]
|
#[ORM\Table('`users`')]
|
||||||
#[ORM\Index(name: 'user_idx_username', columns: ['name'])]
|
#[ORM\Index(name: 'user_idx_username', columns: ['name'])]
|
||||||
|
#[NoLockout()]
|
||||||
class User extends AttachmentContainingDBElement implements UserInterface, HasPermissionsInterface, TwoFactorInterface,
|
class User extends AttachmentContainingDBElement implements UserInterface, HasPermissionsInterface, TwoFactorInterface,
|
||||||
BackupCodeInterface, TrustedDeviceInterface, WebauthnTwoFactorInterface, PreferredProviderInterface, PasswordAuthenticatedUserInterface, SamlUserInterface
|
BackupCodeInterface, TrustedDeviceInterface, WebauthnTwoFactorInterface, PreferredProviderInterface, PasswordAuthenticatedUserInterface, SamlUserInterface
|
||||||
{
|
{
|
||||||
|
@ -83,10 +85,10 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @var string|null The theme
|
* @var string|null The theme
|
||||||
* @ValidTheme()
|
|
||||||
*/
|
*/
|
||||||
#[Groups(['full', 'import'])]
|
#[Groups(['full', 'import'])]
|
||||||
#[ORM\Column(type: Types::STRING, name: 'config_theme', nullable: true)]
|
#[ORM\Column(type: Types::STRING, name: 'config_theme', nullable: true)]
|
||||||
|
#[ValidTheme()]
|
||||||
protected ?string $theme = null;
|
protected ?string $theme = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -127,11 +129,11 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe
|
||||||
/**
|
/**
|
||||||
* @var Group|null the group this user belongs to
|
* @var Group|null the group this user belongs to
|
||||||
* DO NOT PUT A fetch eager here! Otherwise, you can not unset the group of a user! This seems to be some kind of bug in doctrine. Maybe this is fixed in future versions.
|
* DO NOT PUT A fetch eager here! Otherwise, you can not unset the group of a user! This seems to be some kind of bug in doctrine. Maybe this is fixed in future versions.
|
||||||
* @Selectable()
|
|
||||||
*/
|
*/
|
||||||
#[Groups(['extended', 'full', 'import'])]
|
#[Groups(['extended', 'full', 'import'])]
|
||||||
#[ORM\ManyToOne(targetEntity: 'Group', inversedBy: 'users')]
|
#[ORM\ManyToOne(targetEntity: 'Group', inversedBy: 'users')]
|
||||||
#[ORM\JoinColumn(name: 'group_id')]
|
#[ORM\JoinColumn(name: 'group_id')]
|
||||||
|
#[Selectable]
|
||||||
protected ?Group $group = null;
|
protected ?Group $group = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -244,19 +246,16 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe
|
||||||
* Dont use fetch=EAGER here, this will cause problems with setting the currency setting.
|
* Dont use fetch=EAGER here, this will cause problems with setting the currency setting.
|
||||||
* TODO: This is most likely a bug in doctrine/symfony related to the UniqueEntity constraint (it makes a db call).
|
* TODO: This is most likely a bug in doctrine/symfony related to the UniqueEntity constraint (it makes a db call).
|
||||||
* TODO: Find a way to use fetch EAGER (this improves performance a bit)
|
* TODO: Find a way to use fetch EAGER (this improves performance a bit)
|
||||||
* @Selectable()
|
|
||||||
*/
|
*/
|
||||||
#[Groups(['extended', 'full', 'import'])]
|
#[Groups(['extended', 'full', 'import'])]
|
||||||
#[ORM\ManyToOne(targetEntity: Currency::class)]
|
#[ORM\ManyToOne(targetEntity: Currency::class)]
|
||||||
#[ORM\JoinColumn(name: 'currency_id')]
|
#[ORM\JoinColumn(name: 'currency_id')]
|
||||||
|
#[Selectable]
|
||||||
protected ?Currency $currency = null;
|
protected ?Currency $currency = null;
|
||||||
|
|
||||||
/**
|
|
||||||
* @var PermissionData|null
|
|
||||||
* @ValidPermission()
|
|
||||||
*/
|
|
||||||
#[Groups(['simple', 'extended', 'full', 'import'])]
|
#[Groups(['simple', 'extended', 'full', 'import'])]
|
||||||
#[ORM\Embedded(class: 'PermissionData', columnPrefix: 'permissions_')]
|
#[ORM\Embedded(class: 'PermissionData', columnPrefix: 'permissions_')]
|
||||||
|
#[ValidPermission()]
|
||||||
protected ?PermissionData $permissions = null;
|
protected ?PermissionData $permissions = null;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -287,7 +286,7 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe
|
||||||
*
|
*
|
||||||
* @return string
|
* @return string
|
||||||
*/
|
*/
|
||||||
public function __toString()
|
public function __toString(): string
|
||||||
{
|
{
|
||||||
$tmp = $this->isDisabled() ? ' [DISABLED]' : '';
|
$tmp = $this->isDisabled() ? ' [DISABLED]' : '';
|
||||||
|
|
||||||
|
|
|
@ -29,9 +29,9 @@ use App\Entity\ProjectSystem\ProjectBOMEntry;
|
||||||
use App\Validator\Constraints\ProjectSystem\ValidProjectBuildRequest;
|
use App\Validator\Constraints\ProjectSystem\ValidProjectBuildRequest;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @ValidProjectBuildRequest()
|
|
||||||
* @see \App\Tests\Helpers\Projects\ProjectBuildRequestTest
|
* @see \App\Tests\Helpers\Projects\ProjectBuildRequestTest
|
||||||
*/
|
*/
|
||||||
|
#[ValidProjectBuildRequest]
|
||||||
final class ProjectBuildRequest
|
final class ProjectBuildRequest
|
||||||
{
|
{
|
||||||
private readonly int $number_of_builds;
|
private readonly int $number_of_builds;
|
||||||
|
|
|
@ -22,25 +22,11 @@ declare(strict_types=1);
|
||||||
*/
|
*/
|
||||||
namespace App\Validator\Constraints\BigDecimal;
|
namespace App\Validator\Constraints\BigDecimal;
|
||||||
|
|
||||||
use Symfony\Component\Validator\Constraints\GreaterThan;
|
use Symfony\Component\Validator\Constraints\Positive;
|
||||||
|
|
||||||
/**
|
#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
|
||||||
* @Annotation
|
class BigDecimalPositive extends Positive
|
||||||
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
|
|
||||||
*
|
|
||||||
* @author Jan Schädlich <jan.schaedlich@sensiolabs.de>
|
|
||||||
*/
|
|
||||||
class BigDecimalPositive extends GreaterThan
|
|
||||||
{
|
{
|
||||||
use BigNumberConstraintTrait;
|
|
||||||
|
|
||||||
public $message = 'This value should be positive.';
|
|
||||||
|
|
||||||
public function __construct($options = null)
|
|
||||||
{
|
|
||||||
parent::__construct($this->configureNumberConstraintOptions($options));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function validatedBy(): string
|
public function validatedBy(): string
|
||||||
{
|
{
|
||||||
return BigDecimalGreaterThanValidator::class;
|
return BigDecimalGreaterThanValidator::class;
|
||||||
|
|
|
@ -22,25 +22,11 @@ declare(strict_types=1);
|
||||||
*/
|
*/
|
||||||
namespace App\Validator\Constraints\BigDecimal;
|
namespace App\Validator\Constraints\BigDecimal;
|
||||||
|
|
||||||
use Symfony\Component\Validator\Constraints\GreaterThanOrEqual;
|
use Symfony\Component\Validator\Constraints\PositiveOrZero;
|
||||||
|
|
||||||
/**
|
#[\Attribute(\Attribute::TARGET_PROPERTY | \Attribute::TARGET_METHOD | \Attribute::IS_REPEATABLE)]
|
||||||
* @Annotation
|
class BigDecimalPositiveOrZero extends PositiveOrZero
|
||||||
* @Target({"PROPERTY", "METHOD", "ANNOTATION"})
|
|
||||||
*
|
|
||||||
* @author Jan Schädlich <jan.schaedlich@sensiolabs.de>
|
|
||||||
*/
|
|
||||||
class BigDecimalPositiveOrZero extends GreaterThanOrEqual
|
|
||||||
{
|
{
|
||||||
use BigNumberConstraintTrait;
|
|
||||||
|
|
||||||
public $message = 'This value should be either positive or zero.';
|
|
||||||
|
|
||||||
public function __construct($options = null)
|
|
||||||
{
|
|
||||||
parent::__construct($this->configureNumberConstraintOptions($options));
|
|
||||||
}
|
|
||||||
|
|
||||||
public function validatedBy(): string
|
public function validatedBy(): string
|
||||||
{
|
{
|
||||||
return BigDecimalGreaterThenOrEqualValidator::class;
|
return BigDecimalGreaterThenOrEqualValidator::class;
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This file is part of Part-DB (https://github.com/Part-DB/Part-DB-symfony).
|
|
||||||
*
|
|
||||||
* Copyright (C) 2019 - 2022 Jan Böhmer (https://github.com/jbtronics)
|
|
||||||
*
|
|
||||||
* This program is free software: you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU Affero General Public License as published
|
|
||||||
* by the Free Software Foundation, either version 3 of the License, or
|
|
||||||
* (at your option) any later version.
|
|
||||||
*
|
|
||||||
* This program is distributed in the hope that it will be useful,
|
|
||||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
||||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
||||||
* GNU Affero General Public License for more details.
|
|
||||||
*
|
|
||||||
* You should have received a copy of the GNU Affero General Public License
|
|
||||||
* along with this program. If not, see <https://www.gnu.org/licenses/>.
|
|
||||||
*/
|
|
||||||
namespace App\Validator\Constraints\BigDecimal;
|
|
||||||
|
|
||||||
use Symfony\Component\Validator\Exception\ConstraintDefinitionException;
|
|
||||||
|
|
||||||
use function is_array;
|
|
||||||
|
|
||||||
trait BigNumberConstraintTrait
|
|
||||||
{
|
|
||||||
private function configureNumberConstraintOptions($options): array
|
|
||||||
{
|
|
||||||
if (null === $options) {
|
|
||||||
$options = [];
|
|
||||||
} elseif (!is_array($options)) {
|
|
||||||
$options = [$this->getDefaultOption() => $options];
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($options['propertyPath'])) {
|
|
||||||
throw new ConstraintDefinitionException(sprintf('The "propertyPath" option of the "%s" constraint cannot be set.', static::class));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (isset($options['value'])) {
|
|
||||||
throw new ConstraintDefinitionException(sprintf('The "value" option of the "%s" constraint cannot be set.', static::class));
|
|
||||||
}
|
|
||||||
|
|
||||||
$options['value'] = 0;
|
|
||||||
|
|
||||||
return $options;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -43,9 +43,7 @@ namespace App\Validator\Constraints\Misc;
|
||||||
|
|
||||||
use Symfony\Component\Validator\Constraint;
|
use Symfony\Component\Validator\Constraint;
|
||||||
|
|
||||||
/**
|
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||||
* @Annotation
|
|
||||||
*/
|
|
||||||
class ValidRange extends Constraint
|
class ValidRange extends Constraint
|
||||||
{
|
{
|
||||||
public string $message = 'validator.invalid_range';
|
public string $message = 'validator.invalid_range';
|
||||||
|
|
|
@ -26,9 +26,8 @@ use Symfony\Component\Validator\Constraint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This constraint restricts a user in that way that it can not lock itself out of the user system.
|
* This constraint restricts a user in that way that it can not lock itself out of the user system.
|
||||||
*
|
|
||||||
* @Annotation
|
|
||||||
*/
|
*/
|
||||||
|
#[\Attribute(\Attribute::TARGET_CLASS)]
|
||||||
class NoLockout extends Constraint
|
class NoLockout extends Constraint
|
||||||
{
|
{
|
||||||
public string $message = 'validator.noLockout';
|
public string $message = 'validator.noLockout';
|
||||||
|
|
|
@ -34,11 +34,8 @@ use Symfony\Component\Validator\ConstraintValidator;
|
||||||
|
|
||||||
class NoLockoutValidator extends ConstraintValidator
|
class NoLockoutValidator extends ConstraintValidator
|
||||||
{
|
{
|
||||||
protected array $perm_structure;
|
|
||||||
|
|
||||||
public function __construct(protected PermissionManager $resolver, protected Security $security, protected EntityManagerInterface $entityManager)
|
public function __construct(protected PermissionManager $resolver, protected Security $security, protected EntityManagerInterface $entityManager)
|
||||||
{
|
{
|
||||||
$this->perm_structure = $resolver->getPermissionStructure();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -71,6 +68,8 @@ class NoLockoutValidator extends ConstraintValidator
|
||||||
) ?? false)) {
|
) ?? false)) {
|
||||||
$this->context->addViolation($constraint->message);
|
$this->context->addViolation($constraint->message);
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
throw new \LogicException('The NoLockout constraint can only be used on User or Group objects.');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,8 @@ use Symfony\Component\Validator\Constraint;
|
||||||
/**
|
/**
|
||||||
* Constraints the parent property on StructuralDBElement objects in the way, that neither the object self nor any
|
* Constraints the parent property on StructuralDBElement objects in the way, that neither the object self nor any
|
||||||
* of its children can be assigned.
|
* of its children can be assigned.
|
||||||
*
|
|
||||||
* @Annotation
|
|
||||||
*/
|
*/
|
||||||
|
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||||
class NoneOfItsChildren extends Constraint
|
class NoneOfItsChildren extends Constraint
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -26,9 +26,8 @@ use Symfony\Component\Validator\Constraint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* This constraint checks that the given ProjectBuildRequest is valid.
|
* This constraint checks that the given ProjectBuildRequest is valid.
|
||||||
*
|
|
||||||
* @Annotation
|
|
||||||
*/
|
*/
|
||||||
|
#[\Attribute(\Attribute::TARGET_CLASS)]
|
||||||
class ValidProjectBuildRequest extends Constraint
|
class ValidProjectBuildRequest extends Constraint
|
||||||
{
|
{
|
||||||
public function getTargets(): string
|
public function getTargets(): string
|
||||||
|
|
|
@ -27,9 +27,8 @@ use Symfony\Component\Validator\Constraint;
|
||||||
/**
|
/**
|
||||||
* If a property is marked with this constraint, the choosen value (of type StructuralDBElement)
|
* If a property is marked with this constraint, the choosen value (of type StructuralDBElement)
|
||||||
* must NOT be marked as not selectable.
|
* must NOT be marked as not selectable.
|
||||||
*
|
|
||||||
* @Annotation
|
|
||||||
*/
|
*/
|
||||||
|
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||||
class Selectable extends Constraint
|
class Selectable extends Constraint
|
||||||
{
|
{
|
||||||
public $message = 'validator.isSelectable';
|
public $message = 'validator.isSelectable';
|
||||||
|
|
|
@ -27,9 +27,8 @@ use Symfony\Component\Validator\Constraints\Url;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Constraints the field that way that the content is either an url or a path to a builtin ressource (like %FOOTPRINTS%).
|
* Constraints the field that way that the content is either an url or a path to a builtin ressource (like %FOOTPRINTS%).
|
||||||
*
|
|
||||||
* @Annotation
|
|
||||||
*/
|
*/
|
||||||
|
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||||
class UrlOrBuiltin extends Url
|
class UrlOrBuiltin extends Url
|
||||||
{
|
{
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -27,6 +27,7 @@ use Symfony\Component\Validator\Constraint;
|
||||||
/**
|
/**
|
||||||
* @Annotation
|
* @Annotation
|
||||||
*/
|
*/
|
||||||
|
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||||
class ValidFileFilter extends Constraint
|
class ValidFileFilter extends Constraint
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -27,9 +27,8 @@ use Symfony\Component\Validator\Constraint;
|
||||||
/**
|
/**
|
||||||
* A constraint "dummy" to validate the PartLot.
|
* A constraint "dummy" to validate the PartLot.
|
||||||
* We need to access services in our Validator, so we can not use a simple callback on PartLot.
|
* We need to access services in our Validator, so we can not use a simple callback on PartLot.
|
||||||
*
|
|
||||||
* @Annotation
|
|
||||||
*/
|
*/
|
||||||
|
#[\Attribute(\Attribute::TARGET_CLASS)]
|
||||||
class ValidPartLot extends Constraint
|
class ValidPartLot extends Constraint
|
||||||
{
|
{
|
||||||
public function getTargets(): string
|
public function getTargets(): string
|
||||||
|
|
|
@ -28,8 +28,8 @@ use Symfony\Component\Validator\Constraint;
|
||||||
* A PermissionEmbed object with this annotation will be checked with ValidPermissionValidator.
|
* A PermissionEmbed object with this annotation will be checked with ValidPermissionValidator.
|
||||||
* That means the alsoSet values of the permission operations are set.
|
* That means the alsoSet values of the permission operations are set.
|
||||||
*
|
*
|
||||||
* @Annotation
|
|
||||||
*/
|
*/
|
||||||
|
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||||
class ValidPermission extends Constraint
|
class ValidPermission extends Constraint
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -26,8 +26,8 @@ use Symfony\Component\Validator\Constraint;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A constraint to validate the theme setting of the user.
|
* A constraint to validate the theme setting of the user.
|
||||||
* @Annotation
|
|
||||||
*/
|
*/
|
||||||
|
#[\Attribute(\Attribute::TARGET_PROPERTY)]
|
||||||
class ValidTheme extends Constraint
|
class ValidTheme extends Constraint
|
||||||
{
|
{
|
||||||
public string $message = 'validator.selected_theme_is_invalid';
|
public string $message = 'validator.selected_theme_is_invalid';
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue