![]() Server : Apache System : Linux server2.corals.io 4.18.0-348.2.1.el8_5.x86_64 #1 SMP Mon Nov 15 09:17:08 EST 2021 x86_64 User : corals ( 1002) PHP Version : 7.4.33 Disable Function : exec,passthru,shell_exec,system Directory : /home/corals/mautic.corals.io/app/bundles/MarketplaceBundle/Service/ |
<?php declare(strict_types=1); namespace Mautic\MarketplaceBundle\Service; use Mautic\CoreBundle\Release\ThisRelease; use Mautic\MarketplaceBundle\Api\Connection; use Mautic\MarketplaceBundle\Collection\PackageCollection; use Mautic\MarketplaceBundle\DTO\AllowlistEntry; class PluginCollector { /** * @var AllowlistEntry[] */ private array $allowlistedPackages = []; private int $total = 0; public function __construct( private Connection $connection, private Allowlist $allowlist ) { } public function collectPackages(int $page, int $limit, string $query = ''): PackageCollection { $allowlist = $this->allowlist->getAllowList(); if (!empty($allowlist)) { $this->allowlistedPackages = $this->filterAllowlistedPackagesForCurrentMauticVersion($allowlist->entries); $payload = $this->getAllowlistedPackages($page, $limit); } else { $payload = $this->connection->getPlugins($page, $limit, $query); } $this->total = (int) $payload['total']; return PackageCollection::fromArray($payload['results']); } public function getTotal(): int { return $this->total; } /** * @param AllowlistEntry[] $entries * * @return AllowlistEntry[] */ private function filterAllowlistedPackagesForCurrentMauticVersion(array $entries): array { $mauticVersion = ThisRelease::getMetadata()->getVersion(); return array_filter($entries, function (AllowlistEntry $entry) use ($mauticVersion): bool { if ( !empty($entry->minimumMauticVersion) && !version_compare($mauticVersion, $entry->minimumMauticVersion, '>=') ) { return false; } if ( !empty($entry->maximumMauticVersion) && !version_compare($mauticVersion, $entry->maximumMauticVersion, '<=') ) { return false; } return true; }); } /** * During the Marketplace beta period, we only want to show packages that are explicitly * allowlisted. This function only gets allowlisted packages from Packagist. Their API doesn't * support querying multiple packages at once, so we simply do a foreach loop. * * @return array<string,mixed> */ private function getAllowlistedPackages(int $page, int $limit): array { $total = count($this->allowlistedPackages); $results = []; if (0 === $total) { return [ 'total' => 0, 'results' => [], ]; } /** @var array<int, AllowlistEntry[]> $chunks */ $chunks = array_chunk($this->allowlistedPackages, $limit); // Array keys start at 0 but page numbers start at 1 $pageChunk = $page - 1; foreach ($chunks[$pageChunk] as $entry) { if (count($results) >= $limit) { continue; } $payload = $this->connection->getPlugins(1, 1, $entry->package); if (isset($payload['results'][0])) { $results[] = $payload['results'][0] + $entry->toArray(); } } return [ 'total' => $total, 'results' => $results, ]; } }