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 ;
913use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
14+ use Symfony \Component \HttpFoundation \Request ;
1015use Symfony \Component \HttpFoundation \Response ;
1116use Symfony \Component \Routing \Attribute \Route ;
1217
1318class DashboardPackagesInfoController extends AbstractController
1419{
1520 public function __construct (
21+ private readonly EntityManagerInterface $ entityManager ,
1622 private readonly PackageRepository $ packageRepository ,
1723 ) {
1824 }
@@ -34,10 +40,16 @@ public function info(string $packageName, ?string $packageVersion = null): Respo
3440 $ version = $ package ->getLatestVersion ();
3541 }
3642
43+ $ dependentCount = $ this ->entityManager ->getRepository (Dependent::class)->count (['dependentPackageName ' => $ package ->getName ()]);
44+ $ suggesterCount = $ this ->entityManager ->getRepository (Suggester::class)->count (['suggestedPackageName ' => $ package ->getName ()]);
45+
3746 return $ this ->render ('dashboard/packages/package_info.html.twig ' , [
3847 'package ' => $ package ,
3948 'latestVersion ' => $ latestVersion ,
4049 'version ' => $ version ,
50+
51+ 'dependentCount ' => $ dependentCount ,
52+ 'suggesterCount ' => $ suggesterCount ,
4153 ]);
4254 }
4355
@@ -56,6 +68,54 @@ public function versions(string $packageName): Response
5668 ]);
5769 }
5870
71+ #[Route('/dashboard/packages/dependents/{packageName} ' , name: 'dashboard_packages_dependents ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
72+ #[IsGrantedAccess]
73+ public function dependents (Request $ request , string $ packageName ): Response
74+ {
75+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
76+
77+ $ dependentRepository = $ this ->entityManager ->getRepository (Dependent::class);
78+ $ queryBuilder = $ dependentRepository ->createQueryBuilder ('dependent ' );
79+ $ queryBuilder
80+ ->leftJoin ('dependent.package ' , 'package ' )
81+ ->andWhere ('dependent.dependentPackageName = :packageName ' )
82+ ->setParameter ('packageName ' , $ package ->getName ())
83+ ->addOrderBy ('package.name ' , 'ASC ' );
84+
85+ $ paginator = PackagePaginator::fromRequest ($ request , $ queryBuilder , $ this ->container ->get ('router ' ));
86+ $ dependents = $ paginator ->getResults ();
87+
88+ return $ this ->render ('dashboard/packages/package_dependents.html.twig ' , [
89+ 'package ' => $ package ,
90+ 'dependents ' => $ dependents ,
91+ 'paginator ' => $ paginator ,
92+ ]);
93+ }
94+
95+ #[Route('/dashboard/packages/suggesters/{packageName} ' , name: 'dashboard_packages_suggesters ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
96+ #[IsGrantedAccess]
97+ public function suggesters (Request $ request , string $ packageName ): Response
98+ {
99+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
100+
101+ $ suggesterRepository = $ this ->entityManager ->getRepository (Suggester::class);
102+ $ queryBuilder = $ suggesterRepository ->createQueryBuilder ('suggester ' );
103+ $ queryBuilder
104+ ->leftJoin ('suggester.package ' , 'package ' )
105+ ->andWhere ('suggester.suggestedPackageName = :packageName ' )
106+ ->setParameter ('packageName ' , $ package ->getName ())
107+ ->addOrderBy ('package.name ' , 'ASC ' );
108+
109+ $ paginator = PackagePaginator::fromRequest ($ request , $ queryBuilder , $ this ->container ->get ('router ' ));
110+ $ suggesters = $ paginator ->getResults ();
111+
112+ return $ this ->render ('dashboard/packages/package_suggesters.html.twig ' , [
113+ 'package ' => $ package ,
114+ 'suggesters ' => $ suggesters ,
115+ 'paginator ' => $ paginator ,
116+ ]);
117+ }
118+
59119 #[Route('/dashboard/packages/statistics/{packageName} ' , name: 'dashboard_packages_statistics ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
60120 #[IsGrantedAccess]
61121 public function statistics (string $ packageName ): Response
0 commit comments