Skip to content

Commit a4dc0c2

Browse files
committed
Update Version entity with metadata entities integration
Signed-off-by: Tim Goudriaan <tim@codedmonkey.com>
1 parent 32ce4c2 commit a4dc0c2

File tree

15 files changed

+247
-115
lines changed

15 files changed

+247
-115
lines changed

migrations/Version20260325114538.php

Lines changed: 104 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,11 +18,15 @@ public function up(Schema $schema): void
1818
{
1919
$this->createMetadataTables();
2020
$this->fillMetadataTables();
21+
$this->addCurrentMetadataColumnToVersionTable();
22+
$this->updateVersionTableColumns();
2123
}
2224

2325
public function down(Schema $schema): void
2426
{
27+
$this->revertVersionTableColumns();
2528
$this->fillVersionTables();
29+
$this->dropCurrentMetadataColumnFromVersionTable();
2630
$this->dropMetadataTables();
2731
}
2832

@@ -294,6 +298,93 @@ private function fillMetadataTables(): void
294298
}
295299
}
296300

301+
private function addCurrentMetadataColumnToVersionTable(): void
302+
{
303+
$this->addSql(<<<'SQL'
304+
ALTER TABLE version ADD current_metadata_id INT DEFAULT NULL
305+
SQL);
306+
$this->addSql(<<<'SQL'
307+
ALTER TABLE
308+
version
309+
ADD
310+
CONSTRAINT FK_BF1CD3C3624A4280 FOREIGN KEY (current_metadata_id) REFERENCES metadata (id)
311+
SQL);
312+
$this->addSql(<<<'SQL'
313+
CREATE UNIQUE INDEX UNIQ_BF1CD3C3624A4280 ON version (current_metadata_id)
314+
SQL);
315+
316+
$this->addSql(<<<'SQL'
317+
UPDATE version
318+
SET current_metadata_id = metadata.id
319+
FROM metadata
320+
WHERE metadata.version_id = version.id
321+
SQL);
322+
}
323+
324+
private function updateVersionTableColumns(): void
325+
{
326+
$this->addSql(<<<'SQL'
327+
DROP INDEX pkg_ver_idx
328+
SQL);
329+
$this->addSql(<<<'SQL'
330+
ALTER TABLE version RENAME COLUMN name TO package_name
331+
SQL);
332+
$this->addSql(<<<'SQL'
333+
ALTER TABLE version RENAME COLUMN version TO name
334+
SQL);
335+
$this->addSql(<<<'SQL'
336+
ALTER TABLE version RENAME COLUMN normalized_version TO normalized_name
337+
SQL);
338+
$this->addSql(<<<'SQL'
339+
CREATE UNIQUE INDEX package_version_idx ON version (package_id, normalized_name)
340+
SQL);
341+
342+
$this->addSql(<<<'SQL'
343+
ALTER TABLE version DROP CONSTRAINT fk_bf1cd3c3f44cabff
344+
SQL);
345+
$this->addSql(<<<'SQL'
346+
ALTER TABLE version ALTER package_id SET NOT NULL
347+
SQL);
348+
$this->addSql(<<<'SQL'
349+
ALTER TABLE
350+
version
351+
ADD
352+
CONSTRAINT FK_BF1CD3C3F44CABFF FOREIGN KEY (package_id) REFERENCES package (id) ON DELETE CASCADE NOT DEFERRABLE
353+
SQL);
354+
}
355+
356+
private function revertVersionTableColumns(): void
357+
{
358+
$this->addSql(<<<'SQL'
359+
DROP INDEX package_version_idx
360+
SQL);
361+
$this->addSql(<<<'SQL'
362+
ALTER TABLE version RENAME COLUMN name TO version
363+
SQL);
364+
$this->addSql(<<<'SQL'
365+
ALTER TABLE version RENAME COLUMN normalized_name TO normalized_version
366+
SQL);
367+
$this->addSql(<<<'SQL'
368+
ALTER TABLE version RENAME COLUMN package_name TO name
369+
SQL);
370+
$this->addSql(<<<'SQL'
371+
CREATE UNIQUE INDEX pkg_ver_idx ON version (package_id, normalized_version)
372+
SQL);
373+
374+
$this->addSql(<<<'SQL'
375+
ALTER TABLE version DROP CONSTRAINT FK_BF1CD3C3F44CABFF
376+
SQL);
377+
$this->addSql(<<<'SQL'
378+
ALTER TABLE version ALTER package_id DROP NOT NULL
379+
SQL);
380+
$this->addSql(<<<'SQL'
381+
ALTER TABLE
382+
version
383+
ADD
384+
CONSTRAINT fk_bf1cd3c3f44cabff FOREIGN KEY (package_id) REFERENCES package (id) NOT DEFERRABLE INITIALLY IMMEDIATE
385+
SQL);
386+
}
387+
297388
private function fillVersionTables(): void
298389
{
299390
$this->addSql(<<<'SQL'
@@ -352,6 +443,19 @@ private function fillVersionTables(): void
352443
}
353444
}
354445

446+
private function dropCurrentMetadataColumnFromVersionTable(): void
447+
{
448+
$this->addSql(<<<'SQL'
449+
ALTER TABLE version DROP CONSTRAINT FK_BF1CD3C3624A4280
450+
SQL);
451+
$this->addSql(<<<'SQL'
452+
DROP INDEX UNIQ_BF1CD3C3624A4280
453+
SQL);
454+
$this->addSql(<<<'SQL'
455+
ALTER TABLE version DROP current_metadata_id
456+
SQL);
457+
}
458+
355459
private function dropMetadataTables(): void
356460
{
357461
$this->addSql(<<<'SQL'

src/Controller/ApiController.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -128,7 +128,7 @@ public function packageDistribution(Request $request, string $reference, string
128128
throw $this->createNotFoundException();
129129
}
130130

131-
if (null === $version = $this->versionRepository->findOneByNormalizedVersion($package, $versionName)) {
131+
if (null === $version = $this->versionRepository->findOneByNormalizedName($package, $versionName)) {
132132
throw $this->createNotFoundException();
133133
}
134134

src/Doctrine/Entity/Metadata.php

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class Metadata extends TrackedEntity implements \Stringable
8888
#[ORM\Column(nullable: true)]
8989
private ?\DateTimeImmutable $releasedAt = null;
9090

91-
#[ORM\ManyToOne(targetEntity: Version::class)]
91+
#[ORM\ManyToOne(targetEntity: Version::class, inversedBy: 'metadata')]
9292
#[ORM\JoinColumn(nullable: false, onDelete: 'CASCADE')]
9393
private Version $version;
9494

src/Doctrine/Entity/Package.php

Lines changed: 40 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -276,7 +276,7 @@ public function getVersion(string $normalizedVersion): ?Version
276276
if (!isset($this->cachedVersions)) {
277277
$this->cachedVersions = [];
278278
foreach ($this->getVersions() as $version) {
279-
$this->cachedVersions[strtolower($version->getNormalizedVersion())] = $version;
279+
$this->cachedVersions[strtolower($version->getNormalizedName())] = $version;
280280
}
281281
}
282282

@@ -420,25 +420,25 @@ public function getActiveVersions(): array
420420
$activePrereleaseVersions = [];
421421

422422
foreach ($this->getSortedVersions() as $version) {
423-
if ('stable' !== VersionParser::parseStability($version->getNormalizedVersion())) {
423+
if ('stable' !== VersionParser::parseStability($version->getNormalizedName())) {
424424
continue;
425425
}
426426

427-
[$majorVersion, $minorVersion] = explode('.', $version->getNormalizedVersion());
427+
[$majorVersion, $minorVersion] = explode('.', $version->getNormalizedName());
428428

429429
if ('0' === $majorVersion) {
430430
$prereleaseVersion = "$majorVersion.$minorVersion";
431431

432432
$activePrereleaseVersions[$prereleaseVersion] ??= $version;
433-
if (version_compare($version->getNormalizedVersion(), $activePrereleaseVersions[$prereleaseVersion]->getNormalizedVersion(), '>')) {
433+
if (version_compare($version->getNormalizedName(), $activePrereleaseVersions[$prereleaseVersion]->getNormalizedName(), '>')) {
434434
$activePrereleaseVersions[$prereleaseVersion] = $version;
435435
}
436436

437437
continue;
438438
}
439439

440440
$activeVersions[$majorVersion] ??= $version;
441-
if (version_compare($version->getNormalizedVersion(), $activeVersions[$majorVersion]->getNormalizedVersion(), '>')) {
441+
if (version_compare($version->getNormalizedName(), $activeVersions[$majorVersion]->getNormalizedName(), '>')) {
442442
$activeVersions[$majorVersion] = $version;
443443
}
444444
}
@@ -448,34 +448,34 @@ public function getActiveVersions(): array
448448

449449
// Find newer unstable releases of active versions
450450
foreach ($this->getSortedVersions() as $version) {
451-
if (in_array(VersionParser::parseStability($version->getNormalizedVersion()), ['stable', 'dev'], true)) {
451+
if (in_array(VersionParser::parseStability($version->getNormalizedName()), ['stable', 'dev'], true)) {
452452
continue;
453453
}
454454

455-
[$majorVersion, $minorVersion] = explode('.', $version->getNormalizedVersion());
455+
[$majorVersion, $minorVersion] = explode('.', $version->getNormalizedName());
456456

457457
$developmentVersion = "$majorVersion.$minorVersion";
458458

459459
if ('0' === $majorVersion) {
460-
if (isset($activePrereleaseVersions[$developmentVersion]) && !version_compare($version->getNormalizedVersion(), $activePrereleaseVersions[$developmentVersion]->getNormalizedVersion(), '>')) {
460+
if (isset($activePrereleaseVersions[$developmentVersion]) && !version_compare($version->getNormalizedName(), $activePrereleaseVersions[$developmentVersion]->getNormalizedName(), '>')) {
461461
continue;
462462
}
463463

464464
$activePrereleaseDevelopmentVersions[$developmentVersion] ??= $version;
465-
if (version_compare($version->getNormalizedVersion(), $activePrereleaseDevelopmentVersions[$developmentVersion]->getNormalizedVersion(), '>')) {
465+
if (version_compare($version->getNormalizedName(), $activePrereleaseDevelopmentVersions[$developmentVersion]->getNormalizedName(), '>')) {
466466
$activePrereleaseDevelopmentVersions[$developmentVersion] = $version;
467467
}
468468

469469
continue;
470470
}
471471

472-
if (isset($activeVersions[$majorVersion]) && !version_compare($version->getNormalizedVersion(), $activeVersions[$majorVersion]->getNormalizedVersion(), '>')) {
472+
if (isset($activeVersions[$majorVersion]) && !version_compare($version->getNormalizedName(), $activeVersions[$majorVersion]->getNormalizedName(), '>')) {
473473
continue;
474474
}
475475

476476
$activeDevelopmentVersions[$developmentVersion] ??= $version;
477-
if (version_compare($version->getNormalizedVersion(), $activeDevelopmentVersions[$developmentVersion]->getNormalizedVersion(), '>')) {
478-
$activeDevelopmentVersions[$version->getNormalizedVersion()] = $version;
477+
if (version_compare($version->getNormalizedName(), $activeDevelopmentVersions[$developmentVersion]->getNormalizedName(), '>')) {
478+
$activeDevelopmentVersions[$version->getNormalizedName()] = $version;
479479
}
480480
}
481481

@@ -515,7 +515,7 @@ public function getHistoricalVersions(): array
515515
public function getDevVersions(): array
516516
{
517517
return array_filter($this->getSortedVersions(), static function (Version $version) {
518-
if (str_ends_with($version->getNormalizedVersion(), '.9999999-dev')) {
518+
if (str_ends_with($version->getNormalizedName(), '.9999999-dev')) {
519519
return true;
520520
}
521521

@@ -532,44 +532,49 @@ public function getDevVersions(): array
532532
*/
533533
public function getDevBranchVersions(): array
534534
{
535-
return array_filter($this->getSortedVersions(), static fn (Version $version) => str_starts_with($version->getNormalizedVersion(), 'dev-'));
535+
return array_filter($this->getSortedVersions(), static fn (Version $version) => str_starts_with($version->getNormalizedName(), 'dev-'));
536536
}
537537

538+
/**
539+
* Sort versions from newest to oldest.
540+
*/
538541
public static function sortVersions(Version $a, Version $b): int
539542
{
540-
$aVersion = $a->getNormalizedVersion();
541-
$bVersion = $b->getNormalizedVersion();
543+
$aName = $a->getNormalizedName();
544+
$bName = $b->getNormalizedName();
542545

543-
// use branch alias for sorting if one is provided
544-
if (isset($a->getExtra()['branch-alias'][$aVersion])) {
545-
$aVersion = Preg::replace('{(.x)?-dev$}', '.9999999-dev', $a->getExtra()['branch-alias'][$aVersion]);
546+
// Use the branch alias for sorting if one is provided
547+
if (null !== $aBranchAlias = $a->getExtra()['branch-alias'][$aName] ?? null) {
548+
$aName = Preg::replace('{(.x)?-dev$}', '.9999999-dev', $aBranchAlias);
546549
}
547-
if (isset($b->getExtra()['branch-alias'][$bVersion])) {
548-
$bVersion = Preg::replace('{(.x)?-dev$}', '.9999999-dev', $b->getExtra()['branch-alias'][$bVersion]);
550+
if (null !== $bBranchAlias = $b->getExtra()['branch-alias'][$bName] ?? null) {
551+
$bName = Preg::replace('{(.x)?-dev$}', '.9999999-dev', $bBranchAlias);
549552
}
550553

551-
$aVersion = Preg::replace('{^dev-.*}', '0.0.0-alpha', $aVersion);
552-
$bVersion = Preg::replace('{^dev-.*}', '0.0.0-alpha', $bVersion);
554+
$aName = Preg::replace('{^dev-.*}', '0.0.0-alpha', $aName);
555+
$bName = Preg::replace('{^dev-.*}', '0.0.0-alpha', $bName);
553556

554-
// sort default branch first if it is non numeric
555-
if ('0.0.0-alpha' === $aVersion && $a->isDefaultBranch()) {
557+
// Sort the default branch first if it is non-numeric
558+
if ('0.0.0-alpha' === $aName && $a->isDefaultBranch()) {
556559
return -1;
557560
}
558-
if ('0.0.0-alpha' === $bVersion && $b->isDefaultBranch()) {
561+
if ('0.0.0-alpha' === $bName && $b->isDefaultBranch()) {
559562
return 1;
560563
}
561564

562-
// equal versions are sorted by date
563-
if ($aVersion === $bVersion) {
564-
// make sure sort is stable
565-
if ($a->getReleasedAt() === $b->getReleasedAt()) {
566-
return $a->getNormalizedVersion() <=> $b->getNormalizedVersion();
567-
}
565+
if ($aName !== $bName) {
566+
return version_compare($bName, $aName);
567+
}
568+
569+
// Equal versions are sorted by release date
570+
$aReleasedAt = $a->getReleasedAt();
571+
$bReleasedAt = $b->getReleasedAt();
568572

569-
return $b->getReleasedAt() > $a->getReleasedAt() ? 1 : -1;
573+
if (0 !== $sort = $bReleasedAt <=> $aReleasedAt) {
574+
return $sort;
570575
}
571576

572-
// the rest is sorted by version
573-
return version_compare($bVersion, $aVersion);
577+
// Add a stable fallback sort
578+
return $b->getId() <=> $a->getId();
574579
}
575580
}

0 commit comments

Comments
 (0)