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 \Provider ;
9+ use CodedMonkey \Dirigent \Doctrine \Entity \Suggester ;
710use CodedMonkey \Dirigent \Doctrine \Repository \PackageRepository ;
11+ use CodedMonkey \Dirigent \EasyAdmin \PackagePaginator ;
812use Composer \Semver \VersionParser ;
13+ use Doctrine \ORM \EntityManagerInterface ;
14+ use EasyCorp \Bundle \EasyAdminBundle \Dto \PaginatorDto ;
15+ use EasyCorp \Bundle \EasyAdminBundle \Router \AdminUrlGenerator ;
916use Symfony \Bundle \FrameworkBundle \Controller \AbstractController ;
17+ use Symfony \Component \HttpFoundation \Request ;
1018use Symfony \Component \HttpFoundation \Response ;
1119use Symfony \Component \Routing \Attribute \Route ;
1220
1321class DashboardPackagesInfoController extends AbstractController
1422{
1523 public function __construct (
24+ private readonly EntityManagerInterface $ entityManager ,
1625 private readonly PackageRepository $ packageRepository ,
26+ private readonly AdminUrlGenerator $ adminUrlGenerator ,
1727 ) {
1828 }
1929
@@ -34,10 +44,16 @@ public function info(string $packageName, ?string $packageVersion = null): Respo
3444 $ version = $ package ->getLatestVersion ();
3545 }
3646
47+ $ dependentCount = $ this ->entityManager ->getRepository (Dependent::class)->count (['dependentPackageName ' => $ package ->getName ()]);
48+ $ suggesterCount = $ this ->entityManager ->getRepository (Suggester::class)->count (['suggestedPackageName ' => $ package ->getName ()]);
49+
3750 return $ this ->render ('dashboard/packages/package_info.html.twig ' , [
3851 'package ' => $ package ,
3952 'latestVersion ' => $ latestVersion ,
4053 'version ' => $ version ,
54+
55+ 'dependentCount ' => $ dependentCount ,
56+ 'suggesterCount ' => $ suggesterCount ,
4157 ]);
4258 }
4359
@@ -56,6 +72,58 @@ public function versions(string $packageName): Response
5672 ]);
5773 }
5874
75+ #[Route('/dashboard/packages/dependents/{packageName} ' , name: 'dashboard_packages_dependents ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
76+ #[IsGrantedAccess]
77+ public function dependents (Request $ request , string $ packageName ): Response
78+ {
79+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
80+
81+ $ dependentRepository = $ this ->entityManager ->getRepository (Dependent::class);
82+ $ queryBuilder = $ dependentRepository ->createQueryBuilder ('dependent ' );
83+ $ queryBuilder
84+ ->leftJoin ('dependent.package ' , 'package ' )
85+ ->andWhere ('dependent.dependentPackageName = :packageName ' )
86+ ->setParameter ('packageName ' , $ package ->getName ())
87+ ->addOrderBy ('package.name ' , 'ASC ' );
88+
89+ $ paginatorDto = new PaginatorDto (20 , 3 , 1 , true , null );
90+ $ paginatorDto ->setPageNumber ($ request ->query ->getInt ('page ' , 1 ));
91+ $ paginator = (new PackagePaginator ($ this ->adminUrlGenerator ))->paginate ($ paginatorDto , $ queryBuilder );
92+ $ dependents = $ paginator ->getResults ();
93+
94+ return $ this ->render ('dashboard/packages/package_dependents.html.twig ' , [
95+ 'package ' => $ package ,
96+ 'dependents ' => $ dependents ,
97+ 'paginator ' => $ paginator ,
98+ ]);
99+ }
100+
101+ #[Route('/dashboard/packages/suggesters/{packageName} ' , name: 'dashboard_packages_suggesters ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
102+ #[IsGrantedAccess]
103+ public function suggesters (Request $ request , string $ packageName ): Response
104+ {
105+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
106+
107+ $ suggesterRepository = $ this ->entityManager ->getRepository (Suggester::class);
108+ $ queryBuilder = $ suggesterRepository ->createQueryBuilder ('suggester ' );
109+ $ queryBuilder
110+ ->leftJoin ('suggester.package ' , 'package ' )
111+ ->andWhere ('suggester.suggestedPackageName = :packageName ' )
112+ ->setParameter ('packageName ' , $ package ->getName ())
113+ ->addOrderBy ('package.name ' , 'ASC ' );
114+
115+ $ paginatorDto = new PaginatorDto (20 , 3 , 1 , true , null );
116+ $ paginatorDto ->setPageNumber ($ request ->query ->getInt ('page ' , 1 ));
117+ $ paginator = (new PackagePaginator ($ this ->adminUrlGenerator ))->paginate ($ paginatorDto , $ queryBuilder );
118+ $ suggesters = $ paginator ->getResults ();
119+
120+ return $ this ->render ('dashboard/packages/package_suggesters.html.twig ' , [
121+ 'package ' => $ package ,
122+ 'suggesters ' => $ suggesters ,
123+ 'paginator ' => $ paginator ,
124+ ]);
125+ }
126+
59127 #[Route('/dashboard/packages/statistics/{packageName} ' , name: 'dashboard_packages_statistics ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
60128 #[IsGrantedAccess]
61129 public function statistics (string $ packageName ): Response
0 commit comments