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)]
#[Groups(['full', 'attachment:read'])]
#[Assert\Length(max: 255)]
protected ?string $original_filename = null;
/**

View file

@ -50,6 +50,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
*/
#[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $address = '';
/**
@ -57,6 +58,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
*/
#[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $phone_number = '';
/**
@ -64,6 +66,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
*/
#[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $fax_number = '';
/**
@ -72,6 +75,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
#[Assert\Email]
#[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $email_address = '';
/**
@ -80,6 +84,7 @@ abstract class AbstractCompany extends AbstractPartsContainingDBElement
#[Assert\Url]
#[Groups(['full', 'company:read', 'company:write'])]
#[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $website = '';
#[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.
*/
#[ORM\Column(type: Types::STRING)]
#[Assert\Length(max: 255)]
protected string $auto_product_url = '';
/********************************************************************************

View file

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

View file

@ -27,6 +27,7 @@ use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Embeddable;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints\Length;
#[Embeddable]
class EDACategoryInfo
@ -36,6 +37,7 @@ class EDACategoryInfo
*/
#[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'category:read', 'category:write'])]
#[Length(max: 255)]
private ?string $reference_prefix = null;
/** @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) */
#[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'category:read', 'category:write'])]
#[Length(max: 255)]
private ?string $kicad_symbol = null;
public function getReferencePrefix(): ?string

View file

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

View file

@ -27,6 +27,7 @@ use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping\Column;
use Doctrine\ORM\Mapping\Embeddable;
use Symfony\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints\Length;
#[Embeddable]
class EDAPartInfo
@ -36,11 +37,13 @@ class EDAPartInfo
*/
#[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'eda_info:read', 'eda_info:write'])]
#[Length(max: 255)]
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) */
#[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'eda_info:read', 'eda_info:write'])]
#[Length(max: 255)]
private ?string $value = null;
/** @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) */
#[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'eda_info:read', 'eda_info:write'])]
#[Length(max: 255)]
private ?string $kicad_symbol = null;
/** @var string|null The KiCAD footprint, which should be used (the path to the library) */
#[Column(type: Types::STRING, nullable: true)]
#[Groups(['full', 'eda_info:read', 'eda_info:write'])]
#[Length(max: 255)]
private ?string $kicad_footprint = null;
public function __construct()

View file

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

View file

@ -50,6 +50,7 @@ use Doctrine\ORM\Mapping as ORM;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups;
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.

View file

@ -44,6 +44,7 @@ use App\Entity\Base\TimestampTrait;
use Symfony\Bridge\Doctrine\Validator\Constraints\UniqueEntity;
use Symfony\Component\Serializer\Annotation\Groups;
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.
@ -86,6 +87,7 @@ class PartAssociation extends AbstractDBElement implements TimeStampableInterfac
#[Assert\Expression("this.getType().value !== 0 or this.getOtherType() !== null",
message: 'validator.part_association.must_set_an_value_if_type_is_other')]
#[Groups(['part_assoc:read', 'part_assoc:write'])]
#[Length(max: 255)]
protected ?string $other_type = null;
/**

View file

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

View file

@ -28,6 +28,7 @@ use App\Entity\Parts\Part;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
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.
@ -62,6 +63,7 @@ trait AdvancedPropertyTrait
#[Assert\Length(max: 100)]
#[Groups(['extended', 'full', 'import', 'part:read', 'part:write'])]
#[ORM\Column(type: Types::STRING, length: 100, unique: true, nullable: true)]
#[Length(max: 100)]
protected ?string $ipn = null;
/**

View file

@ -30,6 +30,7 @@ use App\Validator\Constraints\Selectable;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Serializer\Annotation\Groups;
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).
@ -58,6 +59,7 @@ trait ManufacturerTrait
*/
#[Groups(['extended', 'full', 'import', 'part:read', 'part:write'])]
#[ORM\Column(type: Types::STRING)]
#[Length(max: 255)]
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\Component\Serializer\Annotation\Groups;
use Symfony\Component\Validator\Constraints as Assert;
use Symfony\Component\Validator\Constraints\Length;
/**
* Class Orderdetail.
@ -106,6 +107,7 @@ class Orderdetail extends AbstractDBElement implements TimeStampableInterface, N
*/
#[Groups(['extended', 'full', 'import', 'orderdetail:read', 'orderdetail:write'])]
#[ORM\Column(type: Types::STRING)]
#[Length(max: 255)]
protected string $supplierpartnr = '';
/**

View file

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

View file

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

View file

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

View file

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