Add proper length constraint validations to all string mapped ORM fields, so they show a nice validation error, instead of a 500 error

Fixes issue #544
This commit is contained in:
Jan Böhmer 2024-03-06 19:46:11 +01:00
parent 113e5b3bcd
commit dc7c13479c
17 changed files with 43 additions and 0 deletions

View file

@ -148,6 +148,7 @@ abstract class Attachment extends AbstractNamedDBElement
*/ */
#[ORM\Column(type: Types::STRING, nullable: true)] #[ORM\Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'attachment:read'])] #[Groups(['full', 'attachment:read'])]
#[Assert\Length(max: 255)]
protected ?string $original_filename = null; protected ?string $original_filename = null;
/** /**

View file

@ -50,6 +50,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
*/ */
#[Groups(['full', 'company:read', 'company:write'])] #[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $address = ''; protected string $address = '';
/** /**
@ -57,6 +58,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
*/ */
#[Groups(['full', 'company:read', 'company:write'])] #[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $phone_number = ''; protected string $phone_number = '';
/** /**
@ -64,6 +66,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
*/ */
#[Groups(['full', 'company:read', 'company:write'])] #[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $fax_number = ''; protected string $fax_number = '';
/** /**
@ -72,6 +75,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
#[Assert\Email] #[Assert\Email]
#[Groups(['full', 'company:read', 'company:write'])] #[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $email_address = ''; protected string $email_address = '';
/** /**
@ -80,6 +84,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
#[Assert\Url] #[Assert\Url]
#[Groups(['full', 'company:read', 'company:write'])] #[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $website = ''; protected string $website = '';
#[Groups(['company:read', 'company:write'])] #[Groups(['company:read', 'company:write'])]
@ -89,6 +94,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
* @var string The link to the website of an article. Use %PARTNUMBER% as placeholder for the part number. * @var string The link to the website of an article. Use %PARTNUMBER% as placeholder for the part number.
*/ */
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $auto_product_url = ''; protected string $auto_product_url = '';
/******************************************************************************** /********************************************************************************

View file

@ -45,6 +45,7 @@ abstract class AbstractNamedDBElement extends AbstractDBElement implements Named
#[Assert\NotBlank] #[Assert\NotBlank]
#[Groups(['simple', 'extended', 'full', 'import', 'api:basic:read', 'api:basic:write'])] #[Groups(['simple', 'extended', 'full', 'import', 'api:basic:read', 'api:basic:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $name = ''; protected string $name = '';
/****************************************************************************** /******************************************************************************

View file

@ -27,6 +27,7 @@ use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping\Column; use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Embeddable; use Doctrine\ORM\Mapping\Embeddable;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints\Length;
#[Embeddable] #[Embeddable]
class EDACategoryInfo class EDACategoryInfo
@ -36,6 +37,7 @@ class EDACategoryInfo
*/ */
#[Column(type: Types::STRING, nullable: true)] #[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'category:read', 'category:write'])] #[Groups(['full', 'category:read', 'category:write'])]
#[Length(max: 255)]
private ?string $reference_prefix = null; private ?string $reference_prefix = null;
/** @var bool|null Visibility of this part to EDA software in trinary logic. True=Visible, False=Invisible, Null=Auto */ /** @var bool|null Visibility of this part to EDA software in trinary logic. True=Visible, False=Invisible, Null=Auto */
@ -61,6 +63,7 @@ class EDACategoryInfo
/** @var string|null The KiCAD schematic symbol, which should be used (the path to the library) */ /** @var string|null The KiCAD schematic symbol, which should be used (the path to the library) */
#[Column(type: Types::STRING, nullable: true)] #[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'category:read', 'category:write'])] #[Groups(['full', 'category:read', 'category:write'])]
#[Length(max: 255)]
private ?string $kicad_symbol = null; private ?string $kicad_symbol = null;
public function getReferencePrefix(): ?string public function getReferencePrefix(): ?string

View file

@ -27,6 +27,7 @@ use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping\Column; use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Embeddable; use Doctrine\ORM\Mapping\Embeddable;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints\Length;
#[Embeddable] #[Embeddable]
class EDAFootprintInfo class EDAFootprintInfo
@ -34,6 +35,7 @@ class EDAFootprintInfo
/** @var string|null The KiCAD footprint, which should be used (the path to the library) */ /** @var string|null The KiCAD footprint, which should be used (the path to the library) */
#[Column(type: Types::STRING, nullable: true)] #[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'footprint:read', 'footprint:write'])] #[Groups(['full', 'footprint:read', 'footprint:write'])]
#[Length(max: 255)]
private ?string $kicad_footprint = null; private ?string $kicad_footprint = null;
public function getKicadFootprint(): ?string public function getKicadFootprint(): ?string

View file

@ -27,6 +27,7 @@ use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping\Column; use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Embeddable; use Doctrine\ORM\Mapping\Embeddable;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints\Length;
#[Embeddable] #[Embeddable]
class EDAPartInfo class EDAPartInfo
@ -36,11 +37,13 @@ class EDAPartInfo
*/ */
#[Column(type: Types::STRING, nullable: true)] #[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'eda_info:read', 'eda_info:write'])] #[Groups(['full', 'eda_info:read', 'eda_info:write'])]
#[Length(max: 255)]
private ?string $reference_prefix = null; private ?string $reference_prefix = null;
/** @var string|null The value, which should be shown together with the part (e.g. 470 for a 470 Ohm resistor) */ /** @var string|null The value, which should be shown together with the part (e.g. 470 for a 470 Ohm resistor) */
#[Column(type: Types::STRING, nullable: true)] #[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'eda_info:read', 'eda_info:write'])] #[Groups(['full', 'eda_info:read', 'eda_info:write'])]
#[Length(max: 255)]
private ?string $value = null; private ?string $value = null;
/** @var bool|null Visibility of this part to EDA software in trinary logic. True=Visible, False=Invisible, Null=Auto */ /** @var bool|null Visibility of this part to EDA software in trinary logic. True=Visible, False=Invisible, Null=Auto */
@ -66,11 +69,13 @@ class EDAPartInfo
/** @var string|null The KiCAD schematic symbol, which should be used (the path to the library) */ /** @var string|null The KiCAD schematic symbol, which should be used (the path to the library) */
#[Column(type: Types::STRING, nullable: true)] #[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'eda_info:read', 'eda_info:write'])] #[Groups(['full', 'eda_info:read', 'eda_info:write'])]
#[Length(max: 255)]
private ?string $kicad_symbol = null; private ?string $kicad_symbol = null;
/** @var string|null The KiCAD footprint, which should be used (the path to the library) */ /** @var string|null The KiCAD footprint, which should be used (the path to the library) */
#[Column(type: Types::STRING, nullable: true)] #[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'eda_info:read', 'eda_info:write'])] #[Groups(['full', 'eda_info:read', 'eda_info:write'])]
#[Length(max: 255)]
private ?string $kicad_footprint = null; private ?string $kicad_footprint = null;
public function __construct() public function __construct()

View file

@ -151,6 +151,7 @@ abstract class AbstractParameter extends AbstractNamedDBElement
*/ */
#[Groups(['full', 'parameter:read', 'parameter:write'])] #[Groups(['full', 'parameter:read', 'parameter:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 50)]
protected string $unit = ''; protected string $unit = '';
/** /**
@ -158,6 +159,7 @@ abstract class AbstractParameter extends AbstractNamedDBElement
*/ */
#[Groups(['full', 'parameter:read', 'parameter:write'])] #[Groups(['full', 'parameter:read', 'parameter:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $value_text = ''; protected string $value_text = '';
/** /**
@ -165,6 +167,7 @@ abstract class AbstractParameter extends AbstractNamedDBElement
*/ */
#[Groups(['full', 'parameter:read', 'parameter:write'])] #[Groups(['full', 'parameter:read', 'parameter:write'])]
#[ORM\Column(name: 'param_group', type: Types::STRING)] #[ORM\Column(name: 'param_group', type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $group = ''; protected string $group = '';
/** /**

View file

@ -50,6 +50,7 @@ use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Length;
/** /**
* This unit represents the unit in which the amount of parts in stock are measured. * This unit represents the unit in which the amount of parts in stock are measured.

View file

@ -44,6 +44,7 @@ use App\Entity\Base\TimestampTrait;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Length;
/** /**
* This entity describes a part association, which is a semantic connection between two parts. * This entity describes a part association, which is a semantic connection between two parts.
@ -86,6 +87,7 @@ class PartAssociation extends AbstractDBElement implements TimeStampableInterfac
#[Assert\Expression("this.getType().value !== 0 or this.getOtherType() !== null", #[Assert\Expression("this.getType().value !== 0 or this.getOtherType() !== null",
message: 'validator.part_association.must_set_an_value_if_type_is_other')] message: 'validator.part_association.must_set_an_value_if_type_is_other')]
#[Groups(['part_assoc:read', 'part_assoc:write'])] #[Groups(['part_assoc:read', 'part_assoc:write'])]
#[Length(max: 255)]
protected ?string $other_type = null; protected ?string $other_type = null;
/** /**

View file

@ -51,6 +51,7 @@ use Exception;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Context\ExecutionContextInterface; use Symfony\Component\Validator\Context\ExecutionContextInterface;
/** /**
@ -165,6 +166,7 @@ class PartLot extends AbstractDBElement implements TimeStampableInterface, Named
*/ */
#[ORM\Column(type: Types::STRING, nullable: true)] #[ORM\Column(type: Types::STRING, nullable: true)]
#[Groups(['part_lot:read', 'part_lot:write'])] #[Groups(['part_lot:read', 'part_lot:write'])]
#[Length(max: 255)]
protected ?string $vendor_barcode = null; protected ?string $vendor_barcode = null;
public function __clone() public function __clone()

View file

@ -28,6 +28,7 @@ use App\Entity\Parts\Part;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Length;
/** /**
* Advanced properties of a part, not related to a more specific group. * Advanced properties of a part, not related to a more specific group.
@ -62,6 +63,7 @@ trait AdvancedPropertyTrait
#[Assert\Length(max: 100)] #[Assert\Length(max: 100)]
#[Groups(['extended', 'full', 'import', 'part:read', 'part:write'])] #[Groups(['extended', 'full', 'import', 'part:read', 'part:write'])]
#[ORM\Column(type: Types::STRING, length: 100, unique: true, nullable: true)] #[ORM\Column(type: Types::STRING, length: 100, unique: true, nullable: true)]
#[Length(max: 100)]
protected ?string $ipn = null; protected ?string $ipn = null;
/** /**

View file

@ -30,6 +30,7 @@ use App\Validator\Constraints\Selectable;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Length;
/** /**
* In this trait all manufacturer related properties of a part are collected (like MPN, manufacturer URL). * In this trait all manufacturer related properties of a part are collected (like MPN, manufacturer URL).
@ -58,6 +59,7 @@ trait ManufacturerTrait
*/ */
#[Groups(['extended', 'full', 'import', 'part:read', 'part:write'])] #[Groups(['extended', 'full', 'import', 'part:read', 'part:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Length(max: 255)]
protected string $manufacturer_product_number = ''; protected string $manufacturer_product_number = '';
/** /**

View file

@ -52,6 +52,7 @@ use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert; use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Length;
/** /**
* Class Orderdetail. * Class Orderdetail.
@ -106,6 +107,7 @@ class Orderdetail extends AbstractDBElement implements TimeStampableInterface, N
*/ */
#[Groups(['extended', 'full', 'import', 'orderdetail:read', 'orderdetail:write'])] #[Groups(['extended', 'full', 'import', 'orderdetail:read', 'orderdetail:write'])]
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Length(max: 255)]
protected string $supplierpartnr = ''; protected string $supplierpartnr = '';
/** /**

View file

@ -36,6 +36,7 @@ use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity; use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\NotBlank;
#[ORM\Entity(repositoryClass: ApiTokenRepository::class)] #[ORM\Entity(repositoryClass: ApiTokenRepository::class)]
@ -64,6 +65,7 @@ class ApiToken implements TimeStampableInterface
protected int $id; protected int $id;
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[Length(max: 255)]
#[NotBlank] #[NotBlank]
#[Groups('token:read')] #[Groups('token:read')]
protected string $name = ''; protected string $name = '';

View file

@ -27,6 +27,7 @@ use Doctrine\DBAL\Types\Types;
use App\Entity\Base\TimestampTrait; use App\Entity\Base\TimestampTrait;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Jbtronics\TFAWebauthn\Model\LegacyU2FKeyInterface; use Jbtronics\TFAWebauthn\Model\LegacyU2FKeyInterface;
use Symfony\Component\Validator\Constraints\Length;
#[ORM\Entity] #[ORM\Entity]
#[ORM\HasLifecycleCallbacks] #[ORM\HasLifecycleCallbacks]
@ -44,6 +45,7 @@ class U2FKey implements LegacyU2FKeyInterface, TimeStampableInterface
* @var string * @var string
**/ **/
#[ORM\Column(type: Types::STRING, length: 128)] #[ORM\Column(type: Types::STRING, length: 128)]
#[Length(max: 128)]
public string $keyHandle = ''; public string $keyHandle = '';
/** /**

View file

@ -50,6 +50,7 @@ use Jbtronics\TFAWebauthn\Model\LegacyU2FKeyInterface;
use Nbgrp\OneloginSamlBundle\Security\User\SamlUserInterface; use Nbgrp\OneloginSamlBundle\Security\User\SamlUserInterface;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface; use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Serializer\Annotation\Groups; use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints\Length;
use Webauthn\PublicKeyCredentialUserEntity; use Webauthn\PublicKeyCredentialUserEntity;
use function count; use function count;
use DateTime; use DateTime;
@ -204,6 +205,7 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe
#[Assert\Email] #[Assert\Email]
#[Groups(['simple', 'extended', 'full', 'import', 'user:read'])] #[Groups(['simple', 'extended', 'full', 'import', 'user:read'])]
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)] #[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
#[Length(max: 255)]
protected ?string $email = ''; protected ?string $email = '';
/** /**
@ -218,6 +220,7 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe
*/ */
#[Groups(['simple', 'extended', 'full', 'import', 'user:read'])] #[Groups(['simple', 'extended', 'full', 'import', 'user:read'])]
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)] #[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
#[Length(max: 255)]
protected ?string $department = ''; protected ?string $department = '';
/** /**
@ -225,6 +228,7 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe
*/ */
#[Groups(['simple', 'extended', 'full', 'import', 'user:read'])] #[Groups(['simple', 'extended', 'full', 'import', 'user:read'])]
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)] #[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
#[Length(max: 255)]
protected ?string $last_name = ''; protected ?string $last_name = '';
/** /**
@ -232,6 +236,7 @@ class User extends AttachmentContainingDBElement implements UserInterface, HasPe
*/ */
#[Groups(['simple', 'extended', 'full', 'import', 'user:read'])] #[Groups(['simple', 'extended', 'full', 'import', 'user:read'])]
#[ORM\Column(type: Types::STRING, length: 255, nullable: true)] #[ORM\Column(type: Types::STRING, length: 255, nullable: true)]
#[Length(max: 255)]
protected ?string $first_name = ''; protected ?string $first_name = '';
/** /**

View file

@ -26,6 +26,7 @@ use App\Entity\Contracts\TimeStampableInterface;
use Doctrine\DBAL\Types\Types; use Doctrine\DBAL\Types\Types;
use App\Entity\Base\TimestampTrait; use App\Entity\Base\TimestampTrait;
use Doctrine\ORM\Mapping as ORM; use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Validator\Constraints\Length;
use Symfony\Component\Validator\Constraints\NotBlank; use Symfony\Component\Validator\Constraints\NotBlank;
use Webauthn\PublicKeyCredentialSource as BasePublicKeyCredentialSource; use Webauthn\PublicKeyCredentialSource as BasePublicKeyCredentialSource;
@ -43,6 +44,7 @@ class WebauthnKey extends BasePublicKeyCredentialSource implements TimeStampable
#[ORM\Column(type: Types::STRING)] #[ORM\Column(type: Types::STRING)]
#[NotBlank] #[NotBlank]
#[Length(max: 255)]
protected string $name = ''; protected string $name = '';
#[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'webauthn_keys')] #[ORM\ManyToOne(targetEntity: User::class, inversedBy: 'webauthn_keys')]