Skip to content

Commit 3c5a00a

Browse files
committed
Split DashboardPackagesController
1 parent 58f8fec commit 3c5a00a

File tree

2 files changed

+172
-147
lines changed

2 files changed

+172
-147
lines changed

src/Controller/Dashboard/DashboardPackagesController.php

Lines changed: 0 additions & 147 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,16 @@
33
namespace CodedMonkey\Dirigent\Controller\Dashboard;
44

55
use CodedMonkey\Dirigent\Attribute\IsGrantedAccess;
6-
use CodedMonkey\Dirigent\Doctrine\Entity\Dependent;
76
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
87
use CodedMonkey\Dirigent\Doctrine\Entity\PackageFetchStrategy;
9-
use CodedMonkey\Dirigent\Doctrine\Entity\Provider;
108
use CodedMonkey\Dirigent\Doctrine\Entity\Registry;
11-
use CodedMonkey\Dirigent\Doctrine\Entity\Suggester;
129
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
1310
use CodedMonkey\Dirigent\EasyAdmin\PackagePaginator;
1411
use CodedMonkey\Dirigent\Form\PackageAddMirroringFormType;
1512
use CodedMonkey\Dirigent\Form\PackageAddVcsFormType;
1613
use CodedMonkey\Dirigent\Form\PackageFormType;
1714
use CodedMonkey\Dirigent\Message\UpdatePackage;
1815
use CodedMonkey\Dirigent\Package\PackageMetadataResolver;
19-
use Composer\Semver\VersionParser;
2016
use Doctrine\ORM\EntityManagerInterface;
2117
use EasyCorp\Bundle\EasyAdminBundle\Dto\PaginatorDto;
2218
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
@@ -71,149 +67,6 @@ public function list(Request $request): Response
7167
]);
7268
}
7369

74-
#[Route('/dashboard/packages/info/{packageName}/{packageVersion}', name: 'dashboard_packages_info', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
75-
#[IsGrantedAccess]
76-
public function info(string $packageName, ?string $packageVersion = null): Response
77-
{
78-
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
79-
80-
$versions = $package->getVersions()->toArray();
81-
$latestVersion = $package->getDefaultVersion();
82-
83-
usort($versions, Package::class . '::sortVersions');
84-
85-
if (null !== $packageVersion) {
86-
$version = $package->getVersion((new VersionParser())->normalize($packageVersion));
87-
} else {
88-
$version = $package->getLatestVersion();
89-
}
90-
91-
$dependentCount = $this->entityManager->getRepository(Dependent::class)->count(['dependentPackageName' => $package->getName()]);
92-
$implementationCount = $this->entityManager->getRepository(Provider::class)->count(['providedPackageName' => $package->getName() . '-implementation']);
93-
$providerCount = $this->entityManager->getRepository(Provider::class)->count(['providedPackageName' => $package->getName()]);
94-
$suggesterCount = $this->entityManager->getRepository(Suggester::class)->count(['suggestedPackageName' => $package->getName()]);
95-
96-
return $this->render('dashboard/packages/package_info.html.twig', [
97-
'package' => $package,
98-
'latestVersion' => $latestVersion,
99-
'version' => $version,
100-
101-
'dependentCount' => $dependentCount,
102-
'implementationCount' => $implementationCount,
103-
'providerCount' => $providerCount,
104-
'suggesterCount' => $suggesterCount,
105-
]);
106-
}
107-
108-
#[Route('/dashboard/packages/versions/{packageName}', name: 'dashboard_packages_versions', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
109-
#[IsGrantedAccess]
110-
public function versions(string $packageName): Response
111-
{
112-
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
113-
$versions = $package->getVersions()->toArray();
114-
115-
usort($versions, Package::class . '::sortVersions');
116-
117-
return $this->render('dashboard/packages/package_versions.html.twig', [
118-
'package' => $package,
119-
'versions' => $versions,
120-
]);
121-
}
122-
123-
#[Route('/dashboard/packages/dependents/{packageName}', name: 'dashboard_packages_dependents', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
124-
#[IsGrantedAccess]
125-
public function dependents(Request $request, string $packageName): Response
126-
{
127-
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
128-
129-
$dependentRepository = $this->entityManager->getRepository(Dependent::class);
130-
$queryBuilder = $dependentRepository->createQueryBuilder('dependent');
131-
$queryBuilder
132-
->leftJoin('dependent.package', 'package')
133-
->andWhere('dependent.dependentPackageName = :packageName')
134-
->setParameter('packageName', $package->getName())
135-
->addOrderBy('package.name', 'ASC');
136-
137-
$paginatorDto = new PaginatorDto(20, 3, 1, true, null);
138-
$paginatorDto->setPageNumber($request->query->getInt('page', 1));
139-
$paginator = (new PackagePaginator($this->adminUrlGenerator))->paginate($paginatorDto, $queryBuilder);
140-
$dependents = $paginator->getResults();
141-
142-
return $this->render('dashboard/packages/package_dependents.html.twig', [
143-
'package' => $package,
144-
'dependents' => $dependents,
145-
'paginator' => $paginator,
146-
]);
147-
}
148-
149-
#[Route('/dashboard/packages/suggesters/{packageName}', name: 'dashboard_packages_suggesters', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
150-
#[IsGrantedAccess]
151-
public function suggesters(Request $request, string $packageName): Response
152-
{
153-
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
154-
155-
$suggesterRepository = $this->entityManager->getRepository(Suggester::class);
156-
$queryBuilder = $suggesterRepository->createQueryBuilder('suggester');
157-
$queryBuilder
158-
->leftJoin('suggester.package', 'package')
159-
->andWhere('suggester.suggestedPackageName = :packageName')
160-
->setParameter('packageName', $package->getName())
161-
->addOrderBy('package.name', 'ASC');
162-
163-
$paginatorDto = new PaginatorDto(20, 3, 1, true, null);
164-
$paginatorDto->setPageNumber($request->query->getInt('page', 1));
165-
$paginator = (new PackagePaginator($this->adminUrlGenerator))->paginate($paginatorDto, $queryBuilder);
166-
$suggesters = $paginator->getResults();
167-
168-
return $this->render('dashboard/packages/package_suggesters.html.twig', [
169-
'package' => $package,
170-
'suggesters' => $suggesters,
171-
'paginator' => $paginator,
172-
]);
173-
}
174-
175-
#[Route('/dashboard/packages/statistics/{packageName}', name: 'dashboard_packages_statistics', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
176-
#[IsGrantedAccess]
177-
public function statistics(string $packageName): Response
178-
{
179-
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
180-
181-
$versionInstallationsData = [];
182-
183-
foreach ($package->getVersions() as $version) {
184-
$majorVersion = $version->getMajorVersion();
185-
186-
$versionInstallationsData[$majorVersion] ??= [];
187-
188-
foreach ($version->getInstallations()->getData() as $key => $installations) {
189-
$versionInstallationsData[$majorVersion][$key] ??= 0;
190-
$versionInstallationsData[$majorVersion][$key] += $installations;
191-
}
192-
}
193-
194-
$today = new \DateTimeImmutable();
195-
$todayKey = $today->format('Ymd');
196-
$installationsToday = $package->getInstallations()->getData()[$todayKey] ?? 0;
197-
198-
$installationsLast30Days = 0;
199-
$date = new \DateTimeImmutable('-30 days');
200-
201-
while ($date <= $today) {
202-
$dateKey = $date->format('Ymd');
203-
$installationsLast30Days += $package->getInstallations()->getData()[$dateKey] ?? 0;
204-
205-
$date = $date->modify('+1 day');
206-
}
207-
208-
return $this->render('dashboard/packages/package_statistics.html.twig', [
209-
'package' => $package,
210-
'versionInstallationsData' => $versionInstallationsData,
211-
'installationsTotal' => $package->getInstallations()->getTotal(),
212-
'installationsLast30Days' => $installationsLast30Days,
213-
'installationsToday' => $installationsToday,
214-
]);
215-
}
216-
21770
#[Route('/dashboard/packages/add-mirroring', name: 'dashboard_packages_add_mirroring')]
21871
#[IsGranted('ROLE_ADMIN')]
21972
public function addMirroring(Request $request): Response
Lines changed: 172 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,172 @@
1+
<?php
2+
3+
namespace CodedMonkey\Dirigent\Controller\Dashboard;
4+
5+
use CodedMonkey\Dirigent\Attribute\IsGrantedAccess;
6+
use CodedMonkey\Dirigent\Doctrine\Entity\Dependent;
7+
use CodedMonkey\Dirigent\Doctrine\Entity\Package;
8+
use CodedMonkey\Dirigent\Doctrine\Entity\Provider;
9+
use CodedMonkey\Dirigent\Doctrine\Entity\Suggester;
10+
use CodedMonkey\Dirigent\Doctrine\Repository\PackageRepository;
11+
use CodedMonkey\Dirigent\EasyAdmin\PackagePaginator;
12+
use Composer\Semver\VersionParser;
13+
use Doctrine\ORM\EntityManagerInterface;
14+
use EasyCorp\Bundle\EasyAdminBundle\Dto\PaginatorDto;
15+
use EasyCorp\Bundle\EasyAdminBundle\Router\AdminUrlGenerator;
16+
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
17+
use Symfony\Component\HttpFoundation\Request;
18+
use Symfony\Component\HttpFoundation\Response;
19+
use Symfony\Component\Routing\Attribute\Route;
20+
21+
class DashboardPackagesInfoController extends AbstractController
22+
{
23+
public function __construct(
24+
private readonly EntityManagerInterface $entityManager,
25+
private readonly PackageRepository $packageRepository,
26+
private readonly AdminUrlGenerator $adminUrlGenerator,
27+
) {
28+
}
29+
30+
#[Route('/dashboard/packages/info/{packageName}/{packageVersion}', name: 'dashboard_packages_info', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
31+
#[IsGrantedAccess]
32+
public function info(string $packageName, ?string $packageVersion = null): Response
33+
{
34+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
35+
36+
$versions = $package->getVersions()->toArray();
37+
$latestVersion = $package->getDefaultVersion();
38+
39+
usort($versions, Package::class . '::sortVersions');
40+
41+
if (null !== $packageVersion) {
42+
$version = $package->getVersion((new VersionParser())->normalize($packageVersion));
43+
} else {
44+
$version = $package->getLatestVersion();
45+
}
46+
47+
$dependentCount = $this->entityManager->getRepository(Dependent::class)->count(['dependentPackageName' => $package->getName()]);
48+
$implementationCount = $this->entityManager->getRepository(Provider::class)->count(['providedPackageName' => $package->getName() . '-implementation']);
49+
$providerCount = $this->entityManager->getRepository(Provider::class)->count(['providedPackageName' => $package->getName()]);
50+
$suggesterCount = $this->entityManager->getRepository(Suggester::class)->count(['suggestedPackageName' => $package->getName()]);
51+
52+
return $this->render('dashboard/packages/package_info.html.twig', [
53+
'package' => $package,
54+
'latestVersion' => $latestVersion,
55+
'version' => $version,
56+
57+
'dependentCount' => $dependentCount,
58+
'implementationCount' => $implementationCount,
59+
'providerCount' => $providerCount,
60+
'suggesterCount' => $suggesterCount,
61+
]);
62+
}
63+
64+
#[Route('/dashboard/packages/versions/{packageName}', name: 'dashboard_packages_versions', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
65+
#[IsGrantedAccess]
66+
public function versions(string $packageName): Response
67+
{
68+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
69+
$versions = $package->getVersions()->toArray();
70+
71+
usort($versions, Package::class . '::sortVersions');
72+
73+
return $this->render('dashboard/packages/package_versions.html.twig', [
74+
'package' => $package,
75+
'versions' => $versions,
76+
]);
77+
}
78+
79+
#[Route('/dashboard/packages/dependents/{packageName}', name: 'dashboard_packages_dependents', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
80+
#[IsGrantedAccess]
81+
public function dependents(Request $request, string $packageName): Response
82+
{
83+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
84+
85+
$dependentRepository = $this->entityManager->getRepository(Dependent::class);
86+
$queryBuilder = $dependentRepository->createQueryBuilder('dependent');
87+
$queryBuilder
88+
->leftJoin('dependent.package', 'package')
89+
->andWhere('dependent.dependentPackageName = :packageName')
90+
->setParameter('packageName', $package->getName())
91+
->addOrderBy('package.name', 'ASC');
92+
93+
$paginatorDto = new PaginatorDto(20, 3, 1, true, null);
94+
$paginatorDto->setPageNumber($request->query->getInt('page', 1));
95+
$paginator = (new PackagePaginator($this->adminUrlGenerator))->paginate($paginatorDto, $queryBuilder);
96+
$dependents = $paginator->getResults();
97+
98+
return $this->render('dashboard/packages/package_dependents.html.twig', [
99+
'package' => $package,
100+
'dependents' => $dependents,
101+
'paginator' => $paginator,
102+
]);
103+
}
104+
105+
#[Route('/dashboard/packages/suggesters/{packageName}', name: 'dashboard_packages_suggesters', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
106+
#[IsGrantedAccess]
107+
public function suggesters(Request $request, string $packageName): Response
108+
{
109+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
110+
111+
$suggesterRepository = $this->entityManager->getRepository(Suggester::class);
112+
$queryBuilder = $suggesterRepository->createQueryBuilder('suggester');
113+
$queryBuilder
114+
->leftJoin('suggester.package', 'package')
115+
->andWhere('suggester.suggestedPackageName = :packageName')
116+
->setParameter('packageName', $package->getName())
117+
->addOrderBy('package.name', 'ASC');
118+
119+
$paginatorDto = new PaginatorDto(20, 3, 1, true, null);
120+
$paginatorDto->setPageNumber($request->query->getInt('page', 1));
121+
$paginator = (new PackagePaginator($this->adminUrlGenerator))->paginate($paginatorDto, $queryBuilder);
122+
$suggesters = $paginator->getResults();
123+
124+
return $this->render('dashboard/packages/package_suggesters.html.twig', [
125+
'package' => $package,
126+
'suggesters' => $suggesters,
127+
'paginator' => $paginator,
128+
]);
129+
}
130+
131+
#[Route('/dashboard/packages/statistics/{packageName}', name: 'dashboard_packages_statistics', requirements: ['packageName' => '[a-z0-9_.-]+/[a-z0-9_.-]+'])]
132+
#[IsGrantedAccess]
133+
public function statistics(string $packageName): Response
134+
{
135+
$package = $this->packageRepository->findOneBy(['name' => $packageName]);
136+
137+
$versionInstallationsData = [];
138+
139+
foreach ($package->getVersions() as $version) {
140+
$majorVersion = $version->getMajorVersion();
141+
142+
$versionInstallationsData[$majorVersion] ??= [];
143+
144+
foreach ($version->getInstallations()->getData() as $key => $installations) {
145+
$versionInstallationsData[$majorVersion][$key] ??= 0;
146+
$versionInstallationsData[$majorVersion][$key] += $installations;
147+
}
148+
}
149+
150+
$today = new \DateTimeImmutable();
151+
$todayKey = $today->format('Ymd');
152+
$installationsToday = $package->getInstallations()->getData()[$todayKey] ?? 0;
153+
154+
$installationsLast30Days = 0;
155+
$date = new \DateTimeImmutable('-30 days');
156+
157+
while ($date <= $today) {
158+
$dateKey = $date->format('Ymd');
159+
$installationsLast30Days += $package->getInstallations()->getData()[$dateKey] ?? 0;
160+
161+
$date = $date->modify('+1 day');
162+
}
163+
164+
return $this->render('dashboard/packages/package_statistics.html.twig', [
165+
'package' => $package,
166+
'versionInstallationsData' => $versionInstallationsData,
167+
'installationsTotal' => $package->getInstallations()->getTotal(),
168+
'installationsLast30Days' => $installationsLast30Days,
169+
'installationsToday' => $installationsToday,
170+
]);
171+
}
172+
}

0 commit comments

Comments
 (0)