Skip to content

Commit ede9c7e

Browse files
committed
Save distributions in the database
1 parent ca0569a commit ede9c7e

7 files changed

Lines changed: 196 additions & 3 deletions

File tree

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace DoctrineMigrations;
6+
7+
use Doctrine\DBAL\Schema\Schema;
8+
use Doctrine\Migrations\AbstractMigration;
9+
10+
final class Version20250610105944 extends AbstractMigration
11+
{
12+
public function getDescription(): string
13+
{
14+
return 'Create distribution table';
15+
}
16+
17+
public function up(Schema $schema): void
18+
{
19+
$this->addSql(<<<'SQL'
20+
CREATE TABLE distribution (id INT GENERATED BY DEFAULT AS IDENTITY NOT NULL, reference VARCHAR(255) NOT NULL, version_id INT NOT NULL, PRIMARY KEY(id))
21+
SQL);
22+
$this->addSql(<<<'SQL'
23+
CREATE INDEX IDX_A44837814BBC2705 ON distribution (version_id)
24+
SQL);
25+
$this->addSql(<<<'SQL'
26+
ALTER TABLE distribution ADD CONSTRAINT FK_A44837814BBC2705 FOREIGN KEY (version_id) REFERENCES version (id) NOT DEFERRABLE INITIALLY IMMEDIATE
27+
SQL);
28+
}
29+
30+
public function down(Schema $schema): void
31+
{
32+
$this->addSql(<<<'SQL'
33+
ALTER TABLE distribution DROP CONSTRAINT FK_A44837814BBC2705
34+
SQL);
35+
$this->addSql(<<<'SQL'
36+
DROP TABLE distribution
37+
SQL);
38+
}
39+
}

src/Controller/Dashboard/DashboardPackagesInfoController.php

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,12 @@
33
namespace CodedMonkey\Dirigent\Controller\Dashboard;
44

55
use CodedMonkey\Dirigent\Attribute\IsGrantedAccess;
6+
use CodedMonkey\Dirigent\Doctrine\Entity\Distribution;
67
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
78
use CodedMonkey\Dirigent\Doctrine\Entity\PackageProvideLink;
89
use CodedMonkey\Dirigent\Doctrine\Entity\PackageRequireLink;
910
use CodedMonkey\Dirigent\Doctrine\Entity\PackageSuggestLink;
11+
use CodedMonkey\Dirigent\Doctrine\Repository\DistributionRepository;
1012
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
1113
use CodedMonkey\Dirigent\EasyAdmin\PackagePaginator;
1214
use Composer\Semver\VersionParser;
@@ -35,7 +37,7 @@ public function info(string $packageName): Response
3537
return $this->versionInfo($packageName, $version->getNormalizedVersion());
3638
}
3739

38-
#[Route('/packages/{packageName}/v/{packageVersion}', name: 'dashboard_packages_version_info', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
40+
#[Route('/packages/{packageName}/v/{packageVersion}', name: 'dashboard_packages_version_info', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+', 'packageVersion' => '.*'])]
3941
#[IsGrantedAccess]
4042
public function versionInfo(string $packageName, string $packageVersion): Response
4143
{
@@ -73,6 +75,22 @@ public function versions(string $packageName): Response
7375
]);
7476
}
7577

78+
#[Route('/packages/{packageName}/distributions', name: 'dashboard_packages_distributions', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
79+
#[IsGrantedAccess]
80+
public function distributions(string $packageName): Response
81+
{
82+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
83+
84+
/** @var DistributionRepository $distributionRepository */
85+
$distributionRepository = $this->entityManager->getRepository(Distribution::class);
86+
$distributions = $distributionRepository->findByPackage($package);
87+
88+
return $this->render('dashboard/packages/package_distributions.html.twig', [
89+
'package' => $package,
90+
'distributions' => $distributions,
91+
]);
92+
}
93+
7694
#[Route('/packages/{packageName}/dependents', name: 'dashboard_packages_dependents', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
7795
#[IsGrantedAccess]
7896
public function dependents(Request $request, string $packageName): Response
Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Doctrine\Entity;
4+
5+
use CodedMonkey\Dirigent\Doctrine\Repository\DistributionRepository;
6+
use Doctrine\ORM\Mapping as ORM;
7+
8+
#[ORM\Entity(repositoryClass: DistributionRepository::class)]
9+
class Distribution
10+
{
11+
#[ORM\Column, ORM\GeneratedValue, ORM\Id]
12+
private ?int $id = null;
13+
14+
#[ORM\ManyToOne]
15+
#[ORM\JoinColumn(nullable: false)]
16+
private ?Version $version = null;
17+
18+
#[ORM\Column]
19+
private ?string $reference = null;
20+
21+
public function getId(): ?int
22+
{
23+
return $this->id;
24+
}
25+
26+
public function getVersion(): ?Version
27+
{
28+
return $this->version;
29+
}
30+
31+
public function setVersion(Version $version): void
32+
{
33+
$this->version = $version;
34+
}
35+
36+
public function getReference(): ?string
37+
{
38+
return $this->reference;
39+
}
40+
41+
public function setReference(string $reference): void
42+
{
43+
$this->reference = $reference;
44+
}
45+
}
Lines changed: 56 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,56 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Doctrine\Repository;
4+
5+
use CodedMonkey\Dirigent\Doctrine\Entity\Distribution;
6+
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
7+
use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepository;
8+
use Doctrine\Persistence\ManagerRegistry;
9+
10+
/**
11+
* @extends ServiceEntityRepository<Distribution>
12+
*
13+
* @method Distribution|null find($id, $lockMode = null, $lockVersion = null)
14+
* @method Distribution[] findAll()
15+
* @method Distribution[] findBy(array $criteria, array $orderBy = null, $limit = null, $offset = null)
16+
* @method Distribution|null findOneBy(array $criteria, array $orderBy = null)
17+
*/
18+
class DistributionRepository extends ServiceEntityRepository
19+
{
20+
public function __construct(ManagerRegistry $registry)
21+
{
22+
parent::__construct($registry, Distribution::class);
23+
}
24+
25+
public function save(Distribution $entity, bool $flush = false): void
26+
{
27+
$this->getEntityManager()->persist($entity);
28+
29+
if ($flush) {
30+
$this->getEntityManager()->flush();
31+
}
32+
}
33+
34+
public function remove(Distribution $entity, bool $flush = false): void
35+
{
36+
$this->getEntityManager()->remove($entity);
37+
38+
if ($flush) {
39+
$this->getEntityManager()->flush();
40+
}
41+
}
42+
43+
/**
44+
* @return Distribution[]
45+
*/
46+
public function findByPackage(Package $package): array
47+
{
48+
return $this->createQueryBuilder('distribution')
49+
->leftJoin('distribution.version', 'version')
50+
->leftJoin('version.package', 'package')
51+
->andWhere('package.id = :package')
52+
->setParameter('package', $package->getId())
53+
->getQuery()
54+
->getResult();
55+
}
56+
}

src/Package/PackageDistributionResolver.php

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,9 @@
44

55
use CodedMonkey\Dirigent\Composer\ComposerClient;
66
use CodedMonkey\Dirigent\Composer\ConfigFactory;
7+
use CodedMonkey\Dirigent\Doctrine\Entity\Distribution;
78
use CodedMonkey\Dirigent\Doctrine\Entity\Version;
9+
use CodedMonkey\Dirigent\Doctrine\Repository\DistributionRepository;
810
use CodedMonkey\Dirigent\Message\ResolveDistribution;
911
use Composer\IO\NullIO;
1012
use Composer\Pcre\Preg;
@@ -26,6 +28,7 @@
2628
public function __construct(
2729
private MessageBusInterface $messenger,
2830
private ComposerClient $composer,
31+
private DistributionRepository $distributionRepository,
2932
#[Autowire(param: 'dirigent.distributions.build')]
3033
private bool $buildDistributions,
3134
#[Autowire(param: 'dirigent.distributions.mirror')]
@@ -113,6 +116,12 @@ private function build(Version $version, ?string $reference, ?string $type): boo
113116
['git', 'archive', '--format=zip', "--output=$distributionPath", $reference],
114117
], $repositoryUrl, $cachePath);
115118

119+
$distribution = new Distribution();
120+
$distribution->setVersion($version);
121+
$distribution->setReference($reference);
122+
123+
$this->distributionRepository->save($distribution, true);
124+
116125
return true;
117126
}
118127

@@ -137,6 +146,12 @@ private function mirror(Version $version, ?string $reference, ?string $type): bo
137146
$httpDownloader = $this->composer->createHttpDownloader();
138147
$httpDownloader->copy($distributionUrl, $distributionPath);
139148

149+
$distribution = new Distribution();
150+
$distribution->setVersion($version);
151+
$distribution->setReference($reference);
152+
153+
$this->distributionRepository->save($distribution, true);
154+
140155
return true;
141156
}
142157
}

templates/dashboard/packages/_package_header.html.twig

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,8 @@
1010
<a {% if currentPage == 'versions' %}class="nav-link active" aria-current="page"{% else %}class="nav-link text-primary"{% endif%} href="{{ packageVersionsUrl }}">{{ 'Versions'|trans }}</a>
1111
</li>
1212
<li class="nav-item">
13-
{% set packageDependentsUrl = path('dashboard_packages_dependents', {packageName: package.name}) %}
14-
<a {% if currentPage == 'dependents' %}class="nav-link active" aria-current="page"{% else %}class="nav-link text-primary"{% endif%} href="{{ packageDependentsUrl }}">{{ 'Dependents'|trans }}</a>
13+
{% set packageDistributionsUrl = path('dashboard_packages_distributions', {packageName: package.name}) %}
14+
<a {% if currentPage == 'distributions' %}class="nav-link active" aria-current="page"{% else %}class="nav-link text-primary"{% endif%} href="{{ packageDistributionsUrl }}">{{ 'Distributions'|trans }}</a>
1515
</li>
1616
<li class="nav-item">
1717
{% set packageStatisticsUrl = path('dashboard_packages_statistics', {packageName: package.name}) %}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
{% extends 'dashboard/packages/package_base.html.twig' %}
2+
3+
{% block page_title %}{{ package.name }} <small>{{ 'Distributions'|trans }}</small>{% endblock %}
4+
5+
{% block page_content %}
6+
{{ include('dashboard/packages/_package_header.html.twig', {currentPage: 'distributions', package: package}) }}
7+
8+
<div class="list-group list-group-flush mb-3">
9+
{% for distribution in distributions %}
10+
{% set packageVersionInfoUrl = path('dashboard_packages_version_info', {packageName: package.name, packageVersion: distribution.version.version}) %}
11+
<a href="{{ packageVersionInfoUrl }}" class="list-group-item">
12+
<div class="d-flex justify-content-between">
13+
<span>
14+
{{ distribution.version.version }} ({{ distribution.reference }})
15+
</span>
16+
</div>
17+
</a>
18+
{% endfor %}
19+
</div>
20+
{% endblock %}

0 commit comments

Comments
 (0)