diff --git a/composer.json b/composer.json index d3ff4d39..a47bd12a 100644 --- a/composer.json +++ b/composer.json @@ -21,7 +21,6 @@ "doctrine/doctrine-migrations-bundle": "^3.0", "doctrine/orm": "^2.16", "dompdf/dompdf": "dev-master#87bea32efe0b0db309e1d31537201f64d5508280 as v2.0.3", - "dunglas/doctrine-json-odm": "^1.3", "erusev/parsedown": "^1.7", "florianv/swap": "^4.0", "florianv/swap-bundle": "dev-master", diff --git a/composer.lock b/composer.lock index 01b26199..13a67773 100644 --- a/composer.lock +++ b/composer.lock @@ -4,7 +4,7 @@ "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies", "This file is @generated automatically" ], - "content-hash": "8a469df5900d883cd5b7ad6944ded916", + "content-hash": "258be26a5e5d25abc80062849a2a948e", "packages": [ { "name": "api-platform/core", @@ -2046,88 +2046,6 @@ }, "time": "2023-11-17T21:30:00+00:00" }, - { - "name": "dunglas/doctrine-json-odm", - "version": "v1.3.0", - "source": { - "type": "git", - "url": "https://github.com/dunglas/doctrine-json-odm.git", - "reference": "d729dc37fa7aaddb7658c52020678cc5294387f1" - }, - "dist": { - "type": "zip", - "url": "https://api.github.com/repos/dunglas/doctrine-json-odm/zipball/d729dc37fa7aaddb7658c52020678cc5294387f1", - "reference": "d729dc37fa7aaddb7658c52020678cc5294387f1", - "shasum": "" - }, - "require": { - "doctrine/orm": "^2.6.3", - "php": ">=7.1", - "symfony/property-access": "^4.4 || ^5.4 || ^6.0", - "symfony/property-info": "^4.4 || ^5.4 || ^6.0", - "symfony/serializer": "^4.4 || ^5.4 || ^6.0" - }, - "require-dev": { - "doctrine/annotations": "^1.0", - "doctrine/dbal": "^2.7 || ^3.3", - "doctrine/doctrine-bundle": "^1.12.13 || ^2.2", - "symfony/finder": "^4.4 || ^5.4 || ^6.0", - "symfony/framework-bundle": "^4.4 || ^5.4 || ^6.0", - "symfony/phpunit-bridge": "^6.0" - }, - "suggest": { - "scienta/doctrine-json-functions": "To add support for JSON functions in DQL.", - "symfony/framework-bundle": "To use the provided bundle." - }, - "type": "library", - "extra": { - "branch-alias": { - "dev-main": "1.0.x-dev" - } - }, - "autoload": { - "psr-4": { - "Dunglas\\DoctrineJsonOdm\\": "src/" - } - }, - "notification-url": "https://packagist.org/downloads/", - "license": [ - "MIT" - ], - "authors": [ - { - "name": "Kévin Dunglas", - "email": "kevin@dunglas.fr", - "homepage": "https://dunglas.fr" - } - ], - "description": "An object document mapper for Doctrine ORM using JSON types of modern RDBMS.", - "homepage": "https://dunglas.fr", - "keywords": [ - "database", - "json", - "mysql", - "odm", - "orm", - "postgresql", - "rdbms" - ], - "support": { - "issues": "https://github.com/dunglas/doctrine-json-odm/issues", - "source": "https://github.com/dunglas/doctrine-json-odm/tree/v1.3.0" - }, - "funding": [ - { - "url": "https://github.com/dunglas", - "type": "github" - }, - { - "url": "https://tidelift.com/funding/github/packagist/dunglas/doctrine-json-odm", - "type": "tidelift" - } - ], - "time": "2023-02-23T15:22:16+00:00" - }, { "name": "egulias/email-validator", "version": "4.0.2", diff --git a/config/bundles.php b/config/bundles.php index 4dd085a7..70b10fa5 100644 --- a/config/bundles.php +++ b/config/bundles.php @@ -33,5 +33,4 @@ return [ KnpU\OAuth2ClientBundle\KnpUOAuth2ClientBundle::class => ['all' => true], Nelmio\CorsBundle\NelmioCorsBundle::class => ['all' => true], ApiPlatform\Symfony\Bundle\ApiPlatformBundle::class => ['all' => true], - Dunglas\DoctrineJsonOdm\Bundle\DunglasDoctrineJsonOdmBundle::class => ['all' => true], ]; diff --git a/migrations/Version20231129231240.php b/migrations/Version20231129231240.php deleted file mode 100644 index 676da4fb..00000000 --- a/migrations/Version20231129231240.php +++ /dev/null @@ -1,36 +0,0 @@ -addSql('ALTER TABLE categories ADD eda_info JSON NOT NULL COMMENT \'(DC2Type:json_document)\''); - $this->addSql('ALTER TABLE footprints ADD eda_info JSON NOT NULL COMMENT \'(DC2Type:json_document)\''); - $this->addSql('ALTER TABLE parts ADD eda_info JSON NOT NULL COMMENT \'(DC2Type:json_document)\''); - - } - - public function down(Schema $schema): void - { - // this down() migration is auto-generated, please modify it to your needs - $this->addSql('ALTER TABLE `categories` DROP eda_info'); - $this->addSql('ALTER TABLE `footprints` DROP eda_info'); - $this->addSql('ALTER TABLE `parts` DROP eda_info'); - } -} diff --git a/migrations/Version20231130180903.php b/migrations/Version20231130180903.php new file mode 100644 index 00000000..52cdc051 --- /dev/null +++ b/migrations/Version20231130180903.php @@ -0,0 +1,35 @@ +addSql('ALTER TABLE categories ADD eda_info_reference_prefix VARCHAR(255) DEFAULT NULL, ADD eda_info_invisible TINYINT(1) DEFAULT NULL, ADD eda_info_exclude_from_bom TINYINT(1) DEFAULT NULL, ADD eda_info_exclude_from_board TINYINT(1) DEFAULT NULL, ADD eda_info_exclude_from_sim TINYINT(1) DEFAULT NULL, ADD eda_info_kicad_symbol VARCHAR(255) DEFAULT NULL'); + $this->addSql('ALTER TABLE footprints ADD eda_info_kicad_footprint VARCHAR(255) DEFAULT NULL'); + $this->addSql('ALTER TABLE parts ADD eda_info_reference_prefix VARCHAR(255) DEFAULT NULL, ADD eda_info_value VARCHAR(255) DEFAULT NULL, ADD eda_info_invisible TINYINT(1) DEFAULT NULL, ADD eda_info_exclude_from_bom TINYINT(1) DEFAULT NULL, ADD eda_info_exclude_from_board TINYINT(1) DEFAULT NULL, ADD eda_info_exclude_from_sim TINYINT(1) DEFAULT NULL, ADD eda_info_kicad_symbol VARCHAR(255) DEFAULT NULL, ADD eda_info_kicad_footprint VARCHAR(255) DEFAULT NULL'); + } + + public function down(Schema $schema): void + { + // this down() migration is auto-generated, please modify it to your needs + $this->addSql('ALTER TABLE `categories` DROP eda_info_reference_prefix, DROP eda_info_invisible, DROP eda_info_exclude_from_bom, DROP eda_info_exclude_from_board, DROP eda_info_exclude_from_sim, DROP eda_info_kicad_symbol'); + $this->addSql('ALTER TABLE `footprints` DROP eda_info_kicad_footprint'); + $this->addSql('ALTER TABLE `parts` DROP eda_info_reference_prefix, DROP eda_info_value, DROP eda_info_invisible, DROP eda_info_exclude_from_bom, DROP eda_info_exclude_from_board, DROP eda_info_exclude_from_sim, DROP eda_info_kicad_symbol, DROP eda_info_kicad_footprint'); + } +} diff --git a/src/Entity/EDA/EDACategoryInfo.php b/src/Entity/EDA/EDACategoryInfo.php new file mode 100644 index 00000000..2b8ecda7 --- /dev/null +++ b/src/Entity/EDA/EDACategoryInfo.php @@ -0,0 +1,125 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Entity\EDA; + +use Doctrine\DBAL\Types\Types; +use Doctrine\ORM\Mapping\Column; +use Doctrine\ORM\Mapping\Embeddable; + +#[Embeddable] +class EDACategoryInfo +{ + /** + * @var string|null The reference prefix of the Part in the schematic. E.g. "R" for resistors, or "C" for capacitors. + */ + #[Column(type: Types::STRING, nullable: true)] + private ?string $reference_prefix = null; + + /** @var bool|null If this is true, then this part is invisible for the EDA software */ + #[Column(type: Types::BOOLEAN, nullable: true)] + private ?bool $invisible = null; + + /** @var bool|null If this is set to true, then this part will be excluded from the BOM */ + #[Column(type: Types::BOOLEAN, nullable: true)] + private ?bool $exclude_from_bom = null; + + /** @var bool|null If this is set to true, then this part will be excluded from the board/the PCB */ + #[Column(type: Types::BOOLEAN, nullable: true)] + private ?bool $exclude_from_board = null; + + /** @var bool|null If this is set to true, then this part will be excluded in the simulation */ + #[Column(type: Types::BOOLEAN, nullable: true)] + private ?bool $exclude_from_sim = true; + + /** @var string|null The KiCAD schematic symbol, which should be used (the path to the library) */ + #[Column(type: Types::STRING, nullable: true)] + private ?string $kicad_symbol = null; + + public function getReferencePrefix(): ?string + { + return $this->reference_prefix; + } + + public function setReferencePrefix(?string $reference_prefix): EDACategoryInfo + { + $this->reference_prefix = $reference_prefix; + return $this; + } + + public function getInvisible(): ?bool + { + return $this->invisible; + } + + public function setInvisible(?bool $invisible): EDACategoryInfo + { + $this->invisible = $invisible; + return $this; + } + + public function getExcludeFromBom(): ?bool + { + return $this->exclude_from_bom; + } + + public function setExcludeFromBom(?bool $exclude_from_bom): EDACategoryInfo + { + $this->exclude_from_bom = $exclude_from_bom; + return $this; + } + + public function getExcludeFromBoard(): ?bool + { + return $this->exclude_from_board; + } + + public function setExcludeFromBoard(?bool $exclude_from_board): EDACategoryInfo + { + $this->exclude_from_board = $exclude_from_board; + return $this; + } + + public function getExcludeFromSim(): ?bool + { + return $this->exclude_from_sim; + } + + public function setExcludeFromSim(?bool $exclude_from_sim): EDACategoryInfo + { + $this->exclude_from_sim = $exclude_from_sim; + return $this; + } + + public function getKicadSymbol(): ?string + { + return $this->kicad_symbol; + } + + public function setKicadSymbol(?string $kicad_symbol): EDACategoryInfo + { + $this->kicad_symbol = $kicad_symbol; + return $this; + } + +} \ No newline at end of file diff --git a/src/Entity/EDA/EDAFootprintInfo.php b/src/Entity/EDA/EDAFootprintInfo.php new file mode 100644 index 00000000..915c1c3d --- /dev/null +++ b/src/Entity/EDA/EDAFootprintInfo.php @@ -0,0 +1,47 @@ +. + */ + +declare(strict_types=1); + + +namespace App\Entity\EDA; + +use Doctrine\DBAL\Types\Types; +use Doctrine\ORM\Mapping\Column; +use Doctrine\ORM\Mapping\Embeddable; + +#[Embeddable] +class EDAFootprintInfo +{ + /** @var string|null The KiCAD footprint, which should be used (the path to the library) */ + #[Column(type: Types::STRING, nullable: true)] + private ?string $kicad_footprint = null; + + public function getKicadFootprint(): ?string + { + return $this->kicad_footprint; + } + + public function setKicadFootprint(?string $kicad_footprint): EDAFootprintInfo + { + $this->kicad_footprint = $kicad_footprint; + return $this; + } +} \ No newline at end of file diff --git a/src/Entity/EDA/EDAPartInfo.php b/src/Entity/EDA/EDAPartInfo.php index 731ffcef..6410a0e2 100644 --- a/src/Entity/EDA/EDAPartInfo.php +++ b/src/Entity/EDA/EDAPartInfo.php @@ -23,31 +23,49 @@ declare(strict_types=1); namespace App\Entity\EDA; +use Doctrine\DBAL\Types\Types; +use Doctrine\ORM\Mapping\Column; +use Doctrine\ORM\Mapping\Embeddable; + +#[Embeddable] class EDAPartInfo { /** * @var string|null The reference prefix of the Part in the schematic. E.g. "R" for resistors, or "C" for capacitors. */ + #[Column(type: Types::STRING, nullable: true)] 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)] private ?string $value = null; + /** @var bool|null If this is true, then this part is invisible for the EDA software */ + #[Column(type: Types::BOOLEAN, nullable: true)] private ?bool $invisible = null; /** @var bool|null If this is set to true, then this part will be excluded from the BOM */ + #[Column(type: Types::BOOLEAN, nullable: true)] private ?bool $exclude_from_bom = null; + /** @var bool|null If this is set to true, then this part will be excluded from the board/the PCB */ + #[Column(type: Types::BOOLEAN, nullable: true)] private ?bool $exclude_from_board = null; + /** @var bool|null If this is set to true, then this part will be excluded in the simulation */ + #[Column(type: Types::BOOLEAN, nullable: true)] private ?bool $exclude_from_sim = true; + /** @var string|null The KiCAD schematic symbol, which should be used (the path to the library) */ + #[Column(type: Types::STRING, nullable: true)] 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)] private ?string $kicad_footprint = null; - public function __construct( - - ) { + public function __construct() + { } diff --git a/src/Entity/Parts/Category.php b/src/Entity/Parts/Category.php index 2751db79..f2f56e4a 100644 --- a/src/Entity/Parts/Category.php +++ b/src/Entity/Parts/Category.php @@ -38,6 +38,7 @@ use ApiPlatform\OpenApi\Model\Operation; use ApiPlatform\Serializer\Filter\PropertyFilter; use App\ApiPlatform\Filter\LikeFilter; use App\Entity\Attachments\Attachment; +use App\Entity\EDA\EDACategoryInfo; use App\Entity\EDA\EDAPartInfo; use App\Repository\Parts\CategoryRepository; use Doctrine\DBAL\Types\Types; @@ -187,8 +188,18 @@ class Category extends AbstractPartsContainingDBElement #[Groups(['category:read'])] protected ?\DateTimeInterface $lastModified = null; - #[Column(type: 'json_document', options: ['jsonb' => true])] - protected ?EDAPartInfo $eda_info = null; + #[Assert\Valid] + #[ORM\Embedded(class: EDACategoryInfo::class)] + protected EDACategoryInfo $eda_info; + + public function __construct() + { + parent::__construct(); + $this->children = new ArrayCollection(); + $this->attachments = new ArrayCollection(); + $this->parameters = new ArrayCollection(); + $this->eda_info = new EDACategoryInfo(); + } public function getPartnameHint(): string { @@ -282,14 +293,17 @@ class Category extends AbstractPartsContainingDBElement public function setDefaultComment(string $default_comment): self { $this->default_comment = $default_comment; - return $this; } - public function __construct() + + public function getEdaInfo(): EDACategoryInfo { - parent::__construct(); - $this->children = new ArrayCollection(); - $this->attachments = new ArrayCollection(); - $this->parameters = new ArrayCollection(); + return $this->eda_info; + } + + public function setEdaInfo(EDACategoryInfo $eda_info): Category + { + $this->eda_info = $eda_info; + return $this; } } diff --git a/src/Entity/Parts/Footprint.php b/src/Entity/Parts/Footprint.php index be00d162..ecdec525 100644 --- a/src/Entity/Parts/Footprint.php +++ b/src/Entity/Parts/Footprint.php @@ -39,6 +39,8 @@ use ApiPlatform\Serializer\Filter\PropertyFilter; use App\ApiPlatform\Filter\LikeFilter; use App\Entity\Attachments\Attachment; use App\Entity\Attachments\AttachmentTypeAttachment; +use App\Entity\EDA\EDACategoryInfo; +use App\Entity\EDA\EDAFootprintInfo; use App\Entity\EDA\EDAPartInfo; use App\Repository\Parts\FootprintRepository; use App\Entity\Base\AbstractStructuralDBElement; @@ -139,8 +141,18 @@ class Footprint extends AbstractPartsContainingDBElement #[Groups(['footprint:read'])] protected ?\DateTimeInterface $lastModified = null; - #[Column(type: 'json_document', options: ['jsonb' => true])] - protected ?EDAPartInfo $eda_info = null; + #[Assert\Valid] + #[ORM\Embedded(class: EDAFootprintInfo::class)] + protected EDAFootprintInfo $eda_info; + + public function __construct() + { + parent::__construct(); + $this->children = new ArrayCollection(); + $this->attachments = new ArrayCollection(); + $this->parameters = new ArrayCollection(); + $this->eda_info = new EDAFootprintInfo(); + } /**************************************** * Getters @@ -170,11 +182,15 @@ class Footprint extends AbstractPartsContainingDBElement return $this; } - public function __construct() + + public function getEdaInfo(): EDAFootprintInfo { - parent::__construct(); - $this->children = new ArrayCollection(); - $this->attachments = new ArrayCollection(); - $this->parameters = new ArrayCollection(); + return $this->eda_info; + } + + public function setEdaInfo(EDAFootprintInfo $eda_info): Footprint + { + $this->eda_info = $eda_info; + return $this; } } diff --git a/src/Entity/Parts/Part.php b/src/Entity/Parts/Part.php index 61c8d821..5581a38b 100644 --- a/src/Entity/Parts/Part.php +++ b/src/Entity/Parts/Part.php @@ -41,6 +41,7 @@ use App\ApiPlatform\Filter\EntityFilter; use App\ApiPlatform\Filter\LikeFilter; use App\ApiPlatform\Filter\PartStoragelocationFilter; use App\Entity\Attachments\AttachmentTypeAttachment; +use App\Entity\EDA\EDAPartInfo; use App\Entity\Parts\PartTraits\AssociationTrait; use App\Entity\Parts\PartTraits\EDATrait; use App\Repository\PartRepository; @@ -175,6 +176,7 @@ class Part extends AttachmentContainingDBElement //By default, the part has no provider $this->providerReference = InfoProviderReference::noProvider(); + $this->eda_info = new EDAPartInfo(); } public function __clone() @@ -210,6 +212,7 @@ class Part extends AttachmentContainingDBElement //Deep clone info provider $this->providerReference = clone $this->providerReference; + $this->eda_info = clone $this->eda_info; } parent::__clone(); } diff --git a/src/Entity/Parts/PartTraits/EDATrait.php b/src/Entity/Parts/PartTraits/EDATrait.php index 134d3141..66d8a2d9 100644 --- a/src/Entity/Parts/PartTraits/EDATrait.php +++ b/src/Entity/Parts/PartTraits/EDATrait.php @@ -25,13 +25,14 @@ namespace App\Entity\Parts\PartTraits; use App\Entity\EDA\EDAPartInfo; use Doctrine\ORM\Mapping\Column; +use Doctrine\ORM\Mapping\Embedded; use Symfony\Component\Validator\Constraints\Valid; trait EDATrait { - #[Column(type: 'json_document', options: ['jsonb' => true])] #[Valid] - protected ?EDAPartInfo $eda_info = null; + #[Embedded(class: EDAPartInfo::class)] + protected EDAPartInfo $eda_info; public function getEdaInfo(): ?EDAPartInfo { diff --git a/symfony.lock b/symfony.lock index 7fe0957f..72f5ec4d 100644 --- a/symfony.lock +++ b/symfony.lock @@ -152,15 +152,6 @@ "dompdf/dompdf": { "version": "v0.8.5" }, - "dunglas/doctrine-json-odm": { - "version": "1.3", - "recipe": { - "repo": "github.com/symfony/recipes-contrib", - "branch": "main", - "version": "0.1", - "ref": "c2ab78f625df0c89af5908d50a28602ff8c4919f" - } - }, "egulias/email-validator": { "version": "2.1.11" },