33namespace CodedMonkey \Dirigent \Controller \Dashboard ;
44
55use CodedMonkey \Dirigent \Attribute \IsGrantedAccess ;
6+ use CodedMonkey \Dirigent \Doctrine \Entity \Dependent ;
67use CodedMonkey \Dirigent \Doctrine \Entity \Package ;
8+ use CodedMonkey \Dirigent \Doctrine \Entity \Suggester ;
79use CodedMonkey \Dirigent \Doctrine \Repository \PackageRepository ;
10+ use CodedMonkey \Dirigent \EasyAdmin \PackagePaginator ;
811use Composer \Semver \VersionParser ;
12+ use Doctrine \ORM \EntityManagerInterface ;
13+ use EasyCorp \Bundle \EasyAdminBundle \Dto \PaginatorDto ;
914use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
15+ use Symfony \Component \HttpFoundation \Request ;
1016use Symfony \Component \HttpFoundation \Response ;
1117use Symfony \Component \Routing \Attribute \Route ;
1218
1319class DashboardPackagesInfoController extends AbstractController
1420{
1521 public function __construct (
22+ private readonly EntityManagerInterface $ entityManager ,
1623 private readonly PackageRepository $ packageRepository ,
1724 ) {
1825 }
@@ -34,10 +41,16 @@ public function info(string $packageName, ?string $packageVersion = null): Respo
3441 $ version = $ package ->getLatestVersion ();
3542 }
3643
44+ $ dependentCount = $ this ->entityManager ->getRepository (Dependent::class)->count (['dependentPackageName ' => $ package ->getName ()]);
45+ $ suggesterCount = $ this ->entityManager ->getRepository (Suggester::class)->count (['suggestedPackageName ' => $ package ->getName ()]);
46+
3747 return $ this ->render ('dashboard/packages/package_info.html.twig ' , [
3848 'package ' => $ package ,
3949 'latestVersion ' => $ latestVersion ,
4050 'version ' => $ version ,
51+
52+ 'dependentCount ' => $ dependentCount ,
53+ 'suggesterCount ' => $ suggesterCount ,
4154 ]);
4255 }
4356
@@ -56,6 +69,54 @@ public function versions(string $packageName): Response
5669 ]);
5770 }
5871
72+ #[Route('/dashboard/packages/dependents/{packageName} ' , name: 'dashboard_packages_dependents ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
73+ #[IsGrantedAccess]
74+ public function dependents (Request $ request , string $ packageName ): Response
75+ {
76+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
77+
78+ $ dependentRepository = $ this ->entityManager ->getRepository (Dependent::class);
79+ $ queryBuilder = $ dependentRepository ->createQueryBuilder ('dependent ' );
80+ $ queryBuilder
81+ ->leftJoin ('dependent.package ' , 'package ' )
82+ ->andWhere ('dependent.dependentPackageName = :packageName ' )
83+ ->setParameter ('packageName ' , $ package ->getName ())
84+ ->addOrderBy ('package.name ' , 'ASC ' );
85+
86+ $ paginator = PackagePaginator::fromRequest ($ request , $ queryBuilder , $ this ->container ->get ('router ' ));
87+ $ dependents = $ paginator ->getResults ();
88+
89+ return $ this ->render ('dashboard/packages/package_dependents.html.twig ' , [
90+ 'package ' => $ package ,
91+ 'dependents ' => $ dependents ,
92+ 'paginator ' => $ paginator ,
93+ ]);
94+ }
95+
96+ #[Route('/dashboard/packages/suggesters/{packageName} ' , name: 'dashboard_packages_suggesters ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
97+ #[IsGrantedAccess]
98+ public function suggesters (Request $ request , string $ packageName ): Response
99+ {
100+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
101+
102+ $ suggesterRepository = $ this ->entityManager ->getRepository (Suggester::class);
103+ $ queryBuilder = $ suggesterRepository ->createQueryBuilder ('suggester ' );
104+ $ queryBuilder
105+ ->leftJoin ('suggester.package ' , 'package ' )
106+ ->andWhere ('suggester.suggestedPackageName = :packageName ' )
107+ ->setParameter ('packageName ' , $ package ->getName ())
108+ ->addOrderBy ('package.name ' , 'ASC ' );
109+
110+ $ paginator = PackagePaginator::fromRequest ($ request , $ queryBuilder , $ this ->container ->get ('router ' ));
111+ $ suggesters = $ paginator ->getResults ();
112+
113+ return $ this ->render ('dashboard/packages/package_suggesters.html.twig ' , [
114+ 'package ' => $ package ,
115+ 'suggesters ' => $ suggesters ,
116+ 'paginator ' => $ paginator ,
117+ ]);
118+ }
119+
59120 #[Route('/dashboard/packages/statistics/{packageName} ' , name: 'dashboard_packages_statistics ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
60121 #[IsGrantedAccess]
61122 public function statistics (string $ packageName ): Response
0 commit comments