Skip to content

Commit 72d2c27

Browse files
committed
Refactor metadata link entities with type enum and index properties
Signed-off-by: Tim Goudriaan <tim@codedmonkey.com>
1 parent a0eedc4 commit 72d2c27

13 files changed

+194
-131
lines changed

migrations/Version20260325114538.php

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ private function createMetadataTables(): void
9696
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
9797
linked_package_name VARCHAR(191) NOT NULL,
9898
linked_version_constraint TEXT NOT NULL,
99+
index INT NOT NULL,
99100
metadata_id INT NOT NULL,
100101
PRIMARY KEY (id)
101102
)
@@ -108,6 +109,7 @@ private function createMetadataTables(): void
108109
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
109110
linked_package_name VARCHAR(191) NOT NULL,
110111
linked_version_constraint TEXT NOT NULL,
112+
index INT NOT NULL,
111113
metadata_id INT NOT NULL,
112114
PRIMARY KEY (id)
113115
)
@@ -120,6 +122,7 @@ private function createMetadataTables(): void
120122
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
121123
linked_package_name VARCHAR(191) NOT NULL,
122124
linked_version_constraint TEXT NOT NULL,
125+
index INT NOT NULL,
123126
metadata_id INT NOT NULL,
124127
PRIMARY KEY (id)
125128
)
@@ -132,6 +135,7 @@ private function createMetadataTables(): void
132135
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
133136
linked_package_name VARCHAR(191) NOT NULL,
134137
linked_version_constraint TEXT NOT NULL,
138+
index INT NOT NULL,
135139
metadata_id INT NOT NULL,
136140
PRIMARY KEY (id)
137141
)
@@ -144,6 +148,7 @@ private function createMetadataTables(): void
144148
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
145149
linked_package_name VARCHAR(191) NOT NULL,
146150
linked_version_constraint TEXT NOT NULL,
151+
index INT NOT NULL,
147152
metadata_id INT NOT NULL,
148153
PRIMARY KEY (id)
149154
)
@@ -156,6 +161,7 @@ private function createMetadataTables(): void
156161
id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL,
157162
linked_package_name VARCHAR(191) NOT NULL,
158163
linked_version_constraint TEXT NOT NULL,
164+
index INT NOT NULL,
159165
metadata_id INT NOT NULL,
160166
PRIMARY KEY (id)
161167
)
@@ -294,8 +300,12 @@ private function fillMetadataTables(): void
294300

295301
foreach ($linkTables as $linkTable) {
296302
$this->addSql(<<<SQL
297-
INSERT INTO metadata_{$linkTable}_link (metadata_id, linked_package_name, linked_version_constraint)
298-
SELECT metadata.id, link.linked_package_name, link.linked_version_constraint
303+
INSERT INTO metadata_{$linkTable}_link (metadata_id, linked_package_name, linked_version_constraint, index)
304+
SELECT
305+
metadata.id,
306+
link.linked_package_name,
307+
link.linked_version_constraint,
308+
link.index
299309
FROM version_{$linkTable}_link link
300310
INNER JOIN metadata metadata ON link.version_id = metadata.version_id
301311
SQL);
@@ -759,6 +769,7 @@ private function fillVersionTables(): void
759769
WHERE version_link.version_id = metadata.version_id
760770
AND version_link.linked_package_name = metadata_link.linked_package_name
761771
)
772+
ORDER BY metadata_link.index
762773
SQL);
763774
}
764775
}

phpstan.dist.neon

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,6 @@ parameters:
1111
- tests/bootstrap.php
1212
ignoreErrors:
1313
- '#^Call to an undefined method Symfony\\Component\\Config\\Definition\\Builder\\NodeDefinition\:\:children\(\)\.$#'
14-
- '#CodedMonkey\\Dirigent\\Doctrine\\Entity\\AbstractMetadataLink given\.#'
15-
- '#^PHPDoc tag @var with type CodedMonkey\\Dirigent\\Doctrine\\Entity\\AbstractMetadataLink is not subtype of native type#'
1614
- '#^Property CodedMonkey\\Dirigent\\Doctrine\\Entity\\[a-zA-Z]+\:\:\$id \(int\|null\) is never assigned int so it can be removed from the property type\.$#'
1715
-
1816
message: '#^Class CodedMonkey\\Dirigent\\Doctrine\\Entity\\TrackedEntity has an uninitialized readonly property \$createdAt\. Assign it in the constructor\.$#'

src/Doctrine/Entity/AbstractMetadataLink.php

Lines changed: 22 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22

33
namespace CodedMonkey\Dirigent\Doctrine\Entity;
44

5+
use CodedMonkey\Dirigent\Entity\MetadataLinkType;
56
use Doctrine\DBAL\Types\Types;
67
use Doctrine\ORM\Mapping as ORM;
78

@@ -21,9 +22,21 @@ abstract class AbstractMetadataLink
2122
#[ORM\Column(type: Types::TEXT)]
2223
private string $linkedVersionConstraint;
2324

24-
public function __construct(Metadata $metadata)
25-
{
25+
#[ORM\Column]
26+
private int $index;
27+
28+
public function __construct(
29+
Metadata $metadata,
30+
string $linkedPackageName,
31+
string $linkedVersionConstraint,
32+
int $index,
33+
) {
2634
$this->metadata = $metadata;
35+
$this->linkedPackageName = $linkedPackageName;
36+
$this->linkedVersionConstraint = $linkedVersionConstraint;
37+
$this->index = $index;
38+
39+
$this->addToCollection();
2740
}
2841

2942
public function getId(): ?int
@@ -41,18 +54,19 @@ public function getLinkedPackageName(): string
4154
return $this->linkedPackageName;
4255
}
4356

44-
public function setLinkedPackageName(string $packageName): void
57+
public function getLinkedVersionConstraint(): string
4558
{
46-
$this->linkedPackageName = $packageName;
59+
return $this->linkedVersionConstraint;
4760
}
4861

49-
public function getLinkedVersionConstraint(): string
62+
public function getIndex(): int
5063
{
51-
return $this->linkedVersionConstraint;
64+
return $this->index;
5265
}
5366

54-
public function setLinkedVersionConstraint(string $packageVersion): void
67+
private function addToCollection(): void
5568
{
56-
$this->linkedVersionConstraint = $packageVersion;
69+
$linkType = MetadataLinkType::fromClass(static::class);
70+
$linkType->getMetadataLinks($this->metadata)->add($this);
5771
}
5872
}

src/Doctrine/Entity/Metadata.php

Lines changed: 34 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
namespace CodedMonkey\Dirigent\Doctrine\Entity;
44

55
use CodedMonkey\Dirigent\Doctrine\Repository\MetadataRepository;
6+
use CodedMonkey\Dirigent\Entity\MetadataLinkType;
67
use Composer\Package\Version\VersionParser;
78
use Composer\Pcre\Preg;
89
use Doctrine\Common\Collections\ArrayCollection;
@@ -100,37 +101,43 @@ class Metadata extends TrackedEntity implements \Stringable
100101
* @var Collection<int, MetadataRequireLink>
101102
*/
102103
#[ORM\OneToMany(targetEntity: MetadataRequireLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach'])]
103-
private Collection $require;
104+
#[ORM\OrderBy(['index' => 'ASC'])]
105+
private Collection $requireLinks;
104106

105107
/**
106108
* @var Collection<int, MetadataDevRequireLink>
107109
*/
108110
#[ORM\OneToMany(targetEntity: MetadataDevRequireLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach'])]
109-
private Collection $devRequire;
111+
#[ORM\OrderBy(['index' => 'ASC'])]
112+
private Collection $devRequireLinks;
110113

111114
/**
112115
* @var Collection<int, MetadataConflictLink>
113116
*/
114117
#[ORM\OneToMany(targetEntity: MetadataConflictLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach'])]
115-
private Collection $conflict;
118+
#[ORM\OrderBy(['index' => 'ASC'])]
119+
private Collection $conflictLinks;
116120

117121
/**
118122
* @var Collection<int, MetadataProvideLink>
119123
*/
120124
#[ORM\OneToMany(targetEntity: MetadataProvideLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach'])]
121-
private Collection $provide;
125+
#[ORM\OrderBy(['index' => 'ASC'])]
126+
private Collection $provideLinks;
122127

123128
/**
124129
* @var Collection<int, MetadataReplaceLink>
125130
*/
126131
#[ORM\OneToMany(targetEntity: MetadataReplaceLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach'])]
127-
private Collection $replace;
132+
#[ORM\OrderBy(['index' => 'ASC'])]
133+
private Collection $replaceLinks;
128134

129135
/**
130136
* @var Collection<int, MetadataSuggestLink>
131137
*/
132138
#[ORM\OneToMany(targetEntity: MetadataSuggestLink::class, mappedBy: 'metadata', cascade: ['persist', 'detach'])]
133-
private Collection $suggest;
139+
#[ORM\OrderBy(['index' => 'ASC'])]
140+
private Collection $suggestLinks;
134141

135142
/**
136143
* @var Collection<int, MetadataKeyword>
@@ -143,12 +150,12 @@ public function __construct(Version $version)
143150
$this->version = $version;
144151
$this->package = $version->getPackage();
145152

146-
$this->require = new ArrayCollection();
147-
$this->devRequire = new ArrayCollection();
148-
$this->conflict = new ArrayCollection();
149-
$this->provide = new ArrayCollection();
150-
$this->replace = new ArrayCollection();
151-
$this->suggest = new ArrayCollection();
153+
$this->requireLinks = new ArrayCollection();
154+
$this->devRequireLinks = new ArrayCollection();
155+
$this->conflictLinks = new ArrayCollection();
156+
$this->provideLinks = new ArrayCollection();
157+
$this->replaceLinks = new ArrayCollection();
158+
$this->suggestLinks = new ArrayCollection();
152159
$this->keywords = new ArrayCollection();
153160
}
154161

@@ -409,49 +416,49 @@ public function getPackage(): Package
409416
/**
410417
* @return Collection<int, MetadataRequireLink>
411418
*/
412-
public function getRequire(): Collection
419+
public function getRequireLinks(): Collection
413420
{
414-
return $this->require;
421+
return $this->requireLinks;
415422
}
416423

417424
/**
418425
* @return Collection<int, MetadataDevRequireLink>
419426
*/
420-
public function getDevRequire(): Collection
427+
public function getDevRequireLinks(): Collection
421428
{
422-
return $this->devRequire;
429+
return $this->devRequireLinks;
423430
}
424431

425432
/**
426433
* @return Collection<int, MetadataConflictLink>
427434
*/
428-
public function getConflict(): Collection
435+
public function getConflictLinks(): Collection
429436
{
430-
return $this->conflict;
437+
return $this->conflictLinks;
431438
}
432439

433440
/**
434441
* @return Collection<int, MetadataProvideLink>
435442
*/
436-
public function getProvide(): Collection
443+
public function getProvideLinks(): Collection
437444
{
438-
return $this->provide;
445+
return $this->provideLinks;
439446
}
440447

441448
/**
442449
* @return Collection<int, MetadataReplaceLink>
443450
*/
444-
public function getReplace(): Collection
451+
public function getReplaceLinks(): Collection
445452
{
446-
return $this->replace;
453+
return $this->replaceLinks;
447454
}
448455

449456
/**
450457
* @return Collection<int, MetadataSuggestLink>
451458
*/
452-
public function getSuggest(): Collection
459+
public function getSuggestLinks(): Collection
453460
{
454-
return $this->suggest;
461+
return $this->suggestLinks;
455462
}
456463

457464
/**
@@ -615,19 +622,10 @@ public function toComposerArray(): array
615622
];
616623

617624
// Set links
618-
$supportedLinkTypes = [
619-
'require' => $this->require,
620-
'require-dev' => $this->devRequire,
621-
'suggest' => $this->suggest,
622-
'conflict' => $this->conflict,
623-
'provide' => $this->provide,
624-
'replace' => $this->replace,
625-
];
626-
627-
foreach ($supportedLinkTypes as $linkType => $linkCollection) {
625+
foreach (MetadataLinkType::cases() as $linkType) {
628626
/** @var AbstractMetadataLink $link */
629-
foreach ($linkCollection as $link) {
630-
$data[$linkType][$link->getLinkedPackageName()] = $link->getLinkedVersionConstraint();
627+
foreach ($linkType->getMetadataLinks($this) as $link) {
628+
$data[$linkType->value][$link->getLinkedPackageName()] = $link->getLinkedVersionConstraint();
631629
}
632630
}
633631

src/Doctrine/Entity/MetadataConflictLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataConflictLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'conflict')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'conflictLinks')]
1111
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
1212
protected Metadata $metadata;
1313
}

src/Doctrine/Entity/MetadataDevRequireLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataDevRequireLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'devRequire')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'devRequireLinks')]
1111
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
1212
protected Metadata $metadata;
1313
}

src/Doctrine/Entity/MetadataProvideLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataProvideLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'provide')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'provideLinks')]
1111
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
1212
protected Metadata $metadata;
1313

src/Doctrine/Entity/MetadataReplaceLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataReplaceLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'replace')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'replaceLinks')]
1111
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
1212
protected Metadata $metadata;
1313
}

src/Doctrine/Entity/MetadataRequireLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataRequireLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'require')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'requireLinks')]
1111
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
1212
protected Metadata $metadata;
1313
}

src/Doctrine/Entity/MetadataSuggestLink.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,7 @@
77
#[ORM\Entity]
88
class MetadataSuggestLink extends AbstractMetadataLink
99
{
10-
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'suggest')]
10+
#[ORM\ManyToOne(targetEntity: Metadata::class, inversedBy: 'suggestLinks')]
1111
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
1212
protected Metadata $metadata;
1313
}

0 commit comments

Comments
 (0)