fix: optimize AbstractIPListController - method getSites()

This commit is contained in:
Rekryt
2026-01-18 16:22:29 +03:00
parent bbbc2b9701
commit 6616bee53d
6 changed files with 41 additions and 32 deletions

View File

@@ -45,7 +45,9 @@ abstract class AbstractIPListController extends AbstractController {
*/ */
protected function getSites(): array { protected function getSites(): array {
$wildcard = !!($this->request->getQueryParameter('wildcard') ?? ''); $wildcard = !!($this->request->getQueryParameter('wildcard') ?? '');
$exclude = [ $group = $this->request->getQueryParameterArray('group') ?? [];
$exclude = array_map(fn($arr) => array_fill_keys($arr, true), [
'group' => $this->request->getQueryParameterArray('exclude[group]') ?? [], 'group' => $this->request->getQueryParameterArray('exclude[group]') ?? [],
'site' => $this->request->getQueryParameterArray('exclude[site]') ?? [], 'site' => $this->request->getQueryParameterArray('exclude[site]') ?? [],
'domain' => $this->request->getQueryParameterArray('exclude[domain]') ?? [], 'domain' => $this->request->getQueryParameterArray('exclude[domain]') ?? [],
@@ -53,34 +55,36 @@ abstract class AbstractIPListController extends AbstractController {
'cidr4' => $this->request->getQueryParameterArray('exclude[cidr4]') ?? [], 'cidr4' => $this->request->getQueryParameterArray('exclude[cidr4]') ?? [],
'ip6' => $this->request->getQueryParameterArray('exclude[ip6]') ?? [], 'ip6' => $this->request->getQueryParameterArray('exclude[ip6]') ?? [],
'cidr6' => $this->request->getQueryParameterArray('exclude[cidr6]') ?? [], 'cidr6' => $this->request->getQueryParameterArray('exclude[cidr6]') ?? [],
]; ]);
$group = $this->request->getQueryParameterArray('group') ?? [];
return array_map(static function (Site $siteEntity) use ($wildcard, $exclude) { $sites = [];
foreach ($this->service->sites as $siteEntity) {
if (isset($exclude['site'][$siteEntity->name])) {
continue;
}
if (isset($exclude['group'][$siteEntity->group])) {
continue;
}
if ($group && !in_array($siteEntity->group, $group, true)) {
continue;
}
$site = clone $siteEntity; $site = clone $siteEntity;
$site->domains = array_values( $site->domains = array_values(
array_filter( array_filter(
$siteEntity->getDomains($wildcard), $siteEntity->getDomains($wildcard),
fn(string $domain) => !in_array($domain, $exclude['domain']) fn(string $domain) => !isset($exclude['domain'][$domain])
) )
); );
$site->ip4 = array_values(array_filter($site->ip4, fn(string $ip) => !in_array($ip, $exclude['ip4']))); $site->ip4 = array_values(array_filter($site->ip4, fn(string $ip) => !isset($exclude['ip4'][$ip])));
$site->cidr4 = array_values( $site->cidr4 = array_values(array_filter($site->cidr4, fn(string $ip) => !isset($exclude['cidr4'][$ip])));
array_filter($site->cidr4, fn(string $ip) => !in_array($ip, $exclude['cidr4'])) $site->ip6 = array_values(array_filter($site->ip6, fn(string $ip) => !isset($exclude['ip6'][$ip])));
); $site->cidr6 = array_values(array_filter($site->cidr6, fn(string $ip) => !isset($exclude['cidr6'][$ip])));
$site->ip6 = array_values(array_filter($site->ip6, fn(string $ip) => !in_array($ip, $exclude['ip6'])));
$site->cidr6 = array_values(
array_filter($site->cidr6, fn(string $ip) => !in_array($ip, $exclude['cidr6']))
);
return $site; $sites[] = $site;
}, array_filter( }
array_filter(
$this->service->sites, return $sites;
fn(Site $siteEntity) => !in_array($siteEntity->name, $exclude['site']) &&
!in_array($siteEntity->group, $exclude['group'])
),
fn(Site $siteEntity) => count($group) === 0 || in_array($siteEntity->group, $group)
));
} }
/** /**

View File

@@ -18,12 +18,13 @@ class AmneziaController extends AbstractIPListController {
} }
$response = []; $response = [];
$sitesEntities = $this->getSites();
if (count($sites)) { if (count($sites)) {
foreach ($sites as $site) { foreach ($sites as $site) {
$response = array_merge($response, $this->getSites()[$site]->$data); $response = array_merge($response, $sitesEntities[$site]->$data ?? []);
} }
} else { } else {
foreach ($this->getSites() as $siteEntity) { foreach ($sitesEntities as $siteEntity) {
$response = array_merge($response, $siteEntity->$data); $response = array_merge($response, $siteEntity->$data);
} }
} }

View File

@@ -25,12 +25,13 @@ class BatController extends AbstractIPListController {
} }
$response = []; $response = [];
$sitesEntities = $this->getSites();
if (count($sites)) { if (count($sites)) {
foreach ($sites as $site) { foreach ($sites as $site) {
$response = array_merge($response, $this->getSites()[$site]->$data); $response = array_merge($response, $sitesEntities[$site]->$data ?? []);
} }
} else { } else {
foreach ($this->getSites() as $siteEntity) { foreach ($sitesEntities as $siteEntity) {
$response = array_merge($response, $siteEntity->$data); $response = array_merge($response, $siteEntity->$data);
} }
} }

View File

@@ -20,12 +20,13 @@ class PacController extends AbstractIPListController {
} }
$items = []; $items = [];
$sitesEntities = $this->getSites();
if (count($sites)) { if (count($sites)) {
foreach ($sites as $site) { foreach ($sites as $site) {
$items = array_merge($items, $this->getSites()[$site]->$data); $items = array_merge($items, $sitesEntities[$site]->$data);
} }
} else { } else {
foreach ($this->getSites() as $siteEntity) { foreach ($sitesEntities as $siteEntity) {
$items = array_merge($items, $siteEntity->$data); $items = array_merge($items, $siteEntity->$data);
} }
} }

View File

@@ -33,15 +33,16 @@ class SwitchyController extends AbstractIPListController {
]; ];
$domains = []; $domains = [];
$sitesEntities = $this->getSites();
if (count($sites)) { if (count($sites)) {
foreach ($sites as $site) { foreach ($sites as $site) {
$domains = array_merge( $domains = array_merge(
$domains, $domains,
array_map($this->wildcardFormat(...), $this->getSites()[$site]->$data) array_map($this->wildcardFormat(...), $sitesEntities[$site]->$data)
); );
} }
} else { } else {
foreach ($this->getSites() as $siteEntity) { foreach ($sitesEntities as $siteEntity) {
$domains = array_merge($domains, array_map($this->wildcardFormat(...), $siteEntity->$data)); $domains = array_merge($domains, array_map($this->wildcardFormat(...), $siteEntity->$data));
} }
} }

View File

@@ -19,12 +19,13 @@ class TextController extends AbstractIPListController {
} }
$response = []; $response = [];
$sitesEntities = $this->getSites();
if (count($sites)) { if (count($sites)) {
foreach ($sites as $site) { foreach ($sites as $site) {
$response = array_merge($response, $this->getSites()[$site]->$data ?? []); $response = array_merge($response, $sitesEntities[$site]->$data ?? []);
} }
} else { } else {
foreach ($this->getSites() as $siteEntity) { foreach ($sitesEntities as $siteEntity) {
$response = array_merge($response, $siteEntity->$data ?? []); $response = array_merge($response, $siteEntity->$data ?? []);
} }
} }