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 ;
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,20 @@ 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+ $ implementationCount = $ this ->entityManager ->getRepository (Provider::class)->count (['providedPackageName ' => $ package ->getName (), 'implementation ' => true ]);
46+ $ providerCount = $ this ->entityManager ->getRepository (Provider::class)->count (['providedPackageName ' => $ package ->getName (), 'implementation ' => false ]);
47+ $ suggesterCount = $ this ->entityManager ->getRepository (Suggester::class)->count (['suggestedPackageName ' => $ package ->getName ()]);
48+
3749 return $ this ->render ('dashboard/packages/package_info.html.twig ' , [
3850 'package ' => $ package ,
3951 'latestVersion ' => $ latestVersion ,
4052 'version ' => $ version ,
53+
54+ 'dependentCount ' => $ dependentCount ,
55+ 'implementationCount ' => $ implementationCount ,
56+ 'providerCount ' => $ providerCount ,
57+ 'suggesterCount ' => $ suggesterCount ,
4158 ]);
4259 }
4360
@@ -56,6 +73,104 @@ public function versions(string $packageName): Response
5673 ]);
5774 }
5875
76+ #[Route('/dashboard/packages/dependents/{packageName} ' , name: 'dashboard_packages_dependents ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
77+ #[IsGrantedAccess]
78+ public function dependents (Request $ request , string $ packageName ): Response
79+ {
80+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
81+
82+ $ dependentRepository = $ this ->entityManager ->getRepository (Dependent::class);
83+ $ queryBuilder = $ dependentRepository ->createQueryBuilder ('dependent ' );
84+ $ queryBuilder
85+ ->leftJoin ('dependent.package ' , 'package ' )
86+ ->andWhere ('dependent.dependentPackageName = :packageName ' )
87+ ->setParameter ('packageName ' , $ package ->getName ())
88+ ->addOrderBy ('package.name ' , 'ASC ' );
89+
90+ $ paginator = PackagePaginator::fromRequest ($ request , $ queryBuilder , $ this ->container ->get ('router ' ));
91+ $ dependents = $ paginator ->getResults ();
92+
93+ return $ this ->render ('dashboard/packages/package_dependents.html.twig ' , [
94+ 'package ' => $ package ,
95+ 'dependents ' => $ dependents ,
96+ 'paginator ' => $ paginator ,
97+ ]);
98+ }
99+
100+ #[Route('/dashboard/packages/implementations/{packageName} ' , name: 'dashboard_packages_implementations ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
101+ #[IsGrantedAccess]
102+ public function implementations (Request $ request , string $ packageName ): Response
103+ {
104+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
105+
106+ $ providerRepository = $ this ->entityManager ->getRepository (Provider::class);
107+ $ queryBuilder = $ providerRepository ->createQueryBuilder ('provider ' );
108+ $ queryBuilder
109+ ->leftJoin ('provider.package ' , 'package ' )
110+ ->andWhere ('provider.providedPackageName = :packageName ' )
111+ ->andWhere ('provider.implementation = true ' )
112+ ->setParameter ('packageName ' , $ package ->getName ())
113+ ->addOrderBy ('package.name ' , 'ASC ' );
114+
115+ $ paginator = PackagePaginator::fromRequest ($ request , $ queryBuilder , $ this ->container ->get ('router ' ));
116+ $ providers = $ paginator ->getResults ();
117+
118+ return $ this ->render ('dashboard/packages/package_implementations.html.twig ' , [
119+ 'package ' => $ package ,
120+ 'providers ' => $ providers ,
121+ 'paginator ' => $ paginator ,
122+ ]);
123+ }
124+
125+ #[Route('/dashboard/packages/providers/{packageName} ' , name: 'dashboard_packages_providers ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
126+ #[IsGrantedAccess]
127+ public function providers (Request $ request , string $ packageName ): Response
128+ {
129+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
130+
131+ $ providerRepository = $ this ->entityManager ->getRepository (Provider::class);
132+ $ queryBuilder = $ providerRepository ->createQueryBuilder ('provider ' );
133+ $ queryBuilder
134+ ->leftJoin ('provider.package ' , 'package ' )
135+ ->andWhere ('provider.providedPackageName = :packageName ' )
136+ ->andWhere ('provider.implementation = false ' )
137+ ->setParameter ('packageName ' , $ package ->getName ())
138+ ->addOrderBy ('package.name ' , 'ASC ' );
139+
140+ $ paginator = PackagePaginator::fromRequest ($ request , $ queryBuilder , $ this ->container ->get ('router ' ));
141+ $ providers = $ paginator ->getResults ();
142+
143+ return $ this ->render ('dashboard/packages/package_providers.html.twig ' , [
144+ 'package ' => $ package ,
145+ 'providers ' => $ providers ,
146+ 'paginator ' => $ paginator ,
147+ ]);
148+ }
149+
150+ #[Route('/dashboard/packages/suggesters/{packageName} ' , name: 'dashboard_packages_suggesters ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
151+ #[IsGrantedAccess]
152+ public function suggesters (Request $ request , string $ packageName ): Response
153+ {
154+ $ package = $ this ->packageRepository ->findOneBy (['name ' => $ packageName ]);
155+
156+ $ suggesterRepository = $ this ->entityManager ->getRepository (Suggester::class);
157+ $ queryBuilder = $ suggesterRepository ->createQueryBuilder ('suggester ' );
158+ $ queryBuilder
159+ ->leftJoin ('suggester.package ' , 'package ' )
160+ ->andWhere ('suggester.suggestedPackageName = :packageName ' )
161+ ->setParameter ('packageName ' , $ package ->getName ())
162+ ->addOrderBy ('package.name ' , 'ASC ' );
163+
164+ $ paginator = PackagePaginator::fromRequest ($ request , $ queryBuilder , $ this ->container ->get ('router ' ));
165+ $ suggesters = $ paginator ->getResults ();
166+
167+ return $ this ->render ('dashboard/packages/package_suggesters.html.twig ' , [
168+ 'package ' => $ package ,
169+ 'suggesters ' => $ suggesters ,
170+ 'paginator ' => $ paginator ,
171+ ]);
172+ }
173+
59174 #[Route('/dashboard/packages/statistics/{packageName} ' , name: 'dashboard_packages_statistics ' , requirements: ['packageName ' => '[a-z0-9_.-]+/[a-z0-9_.-]+ ' ])]
60175 #[IsGrantedAccess]
61176 public function statistics (string $ packageName ): Response
0 commit comments