diff --git a/src/Controller/ExtensionController.php b/src/Controller/ExtensionController.php new file mode 100644 index 000000000..1bfd99b2d --- /dev/null +++ b/src/Controller/ExtensionController.php @@ -0,0 +1,75 @@ + + * Nils Adermann + * + * For the full copyright and license information, please view the LICENSE + * file that was distributed with this source code. + */ + +namespace App\Controller; + +use App\Entity\Package; +use App\Model\DownloadManager; +use App\Model\FavoriteManager; +use Pagerfanta\Adapter\FixedAdapter; +use Pagerfanta\Pagerfanta; +use Predis\Client as RedisClient; +use Symfony\Component\HttpFoundation\JsonResponse; +use Symfony\Component\HttpFoundation\Request; +use Symfony\Component\HttpFoundation\Response; +use Symfony\Component\HttpKernel\EventListener\AbstractSessionListener; +use Symfony\Component\Routing\Attribute\Route; +use Symfony\Component\Routing\Generator\UrlGeneratorInterface; + +class ExtensionController extends Controller +{ + #[Route(path: '/extensions.{_format}', name: 'browse_extensions', defaults: ['_format' => 'html'])] + public function extensionsAction(Request $req, RedisClient $redis, FavoriteManager $favMgr, DownloadManager $dlMgr): Response + { + $packages = $this->getEM()->getRepository(Package::class) + ->createQueryBuilder('p') + ->where("(p.type = 'php-ext' OR p.type = 'php-ext-zend')") + ->andWhere('p.frozen IS NULL') + ->orderBy('p.name') + ->getQuery() + ->enableResultCache(900) + ->getResult(); + + $packages = new Pagerfanta(new FixedAdapter(count($packages), $packages)); + + $data = [ + 'packages' => $packages, + ]; + $data['meta'] = $this->getPackagesMetadata($favMgr, $dlMgr, $data['packages']); + + if ($req->getRequestFormat() === 'json') { + $result = [ + 'packages' => [], + ]; + + foreach ($packages as $package) { + $url = $this->generateUrl('view_package', ['name' => $package->getName()], UrlGeneratorInterface::ABSOLUTE_URL); + + $result['packages'][] = [ + 'name' => $package->getName(), + 'description' => $package->getDescription() ?: '', + 'url' => $url, + 'downloads' => $data['meta']['downloads'][$package->getId()], + 'favers' => $data['meta']['favers'][$package->getId()], + ]; + } + + $response = new JsonResponse($result); + $response->setSharedMaxAge(900); + $response->headers->set(AbstractSessionListener::NO_AUTO_CACHE_CONTROL_HEADER, 'true'); + + return $response; + } + + return $this->render('extensions/list.html.twig', $data); + } +} diff --git a/src/Entity/Package.php b/src/Entity/Package.php index 40145e54c..b8464e346 100644 --- a/src/Entity/Package.php +++ b/src/Entity/Package.php @@ -76,6 +76,7 @@ public function isRemoteIdMismatch(): bool #[ORM\Index(name: 'dumped2_crawled_frozen_idx', columns: ['dumpedAtV2', 'crawledAt', 'frozen'])] #[ORM\Index(name: 'vendor_idx', columns: ['vendor'])] #[ORM\Index(name: 'frozen_idx', columns: ['frozen'])] +#[ORM\Index(name: 'type_frozen_idx', columns: ['type', 'frozen'])] #[UniquePackage(groups: ['Create'])] #[VendorWritable(groups: ['Create'])] #[ValidPackageRepository(groups: ['Update', 'Default'])] diff --git a/templates/extensions/list.html.twig b/templates/extensions/list.html.twig new file mode 100644 index 000000000..50e2cd2be --- /dev/null +++ b/templates/extensions/list.html.twig @@ -0,0 +1,5 @@ +{% embed "web/list.html.twig" %} + {% block content_title %} +

PHP Extensions

+ {% endblock %} +{% endembed %}