From d41f9d8eee58301e212a0e7c4a4e449b72047990 Mon Sep 17 00:00:00 2001 From: the-djmaze <> Date: Tue, 17 Jan 2023 12:31:07 +0100 Subject: [PATCH] Improved contacts suggestions limit handling #849 --- .../app/libraries/RainLoop/Actions/User.php | 38 +--------- .../RainLoop/Providers/Suggestions.php | 71 ++++++++++++------- .../Views/Admin/AdminSettingsContacts.html | 2 +- 3 files changed, 50 insertions(+), 61 deletions(-) diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php index f9f28ed1a..dfda9075e 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Actions/User.php @@ -236,44 +236,10 @@ trait User $this->Plugins()->RunHook('json.suggestions-input-parameters', array(&$sQuery, &$iLimit, $oAccount)); - $iLimit = \max(5, (int) $iLimit); - $aResult = array(); - if (\strlen($sQuery)) { - try - { - // Address Book - $oAddressBookProvider = $this->AddressBookProvider($oAccount); - if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) { - $aSuggestions = $oAddressBookProvider->GetSuggestions($sQuery, $iLimit); - foreach ($aSuggestions as $aItem) { - // Unique email address - $sLine = \mb_strtolower($aItem[0]); - if (!isset($aResult[$sLine])) { - $aResult[$sLine] = $aItem; - } - } - } - } - catch (\Throwable $oException) - { - $this->Logger()->WriteException($oException); - } - - if ($iLimit > \count($aResult)) { - $oSuggestionsProvider = $this->SuggestionsProvider(); - if ($oSuggestionsProvider && $oSuggestionsProvider->IsActive()) { - $aSuggestions = $oSuggestionsProvider->Process($oAccount, $sQuery, $iLimit); - foreach ($aSuggestions as $sLine => $aItem) { - if (!isset($aResult[$sLine])) { - $aResult[$sLine] = $aItem; - } - } - } - } - - $aResult = \array_slice(\array_values($aResult), 0, $iLimit); + if ($oSuggestionsProvider = $this->SuggestionsProvider()) { + $aResult = $oSuggestionsProvider->Process($oAccount, $sQuery, $iLimit); } return $this->DefaultResponse($aResult); diff --git a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions.php b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions.php index 9660a1572..5b6feef58 100644 --- a/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions.php +++ b/snappymail/v/0.0.0/app/libraries/RainLoop/Providers/Suggestions.php @@ -7,7 +7,7 @@ class Suggestions extends \RainLoop\Providers\AbstractProvider /** * @var \RainLoop\Providers\Suggestions\ISuggestions[] */ - private ?array $aDrivers; + private array $aDrivers = []; /** * @param \RainLoop\Providers\Suggestions\ISuggestions[]|null $aDriver = null @@ -15,44 +15,67 @@ class Suggestions extends \RainLoop\Providers\AbstractProvider public function __construct(?array $aDriver = null) { if (\is_array($aDriver)) { - $aDriver = \array_filter($aDriver, function ($oDriver) { + $this->aDrivers = \array_filter($aDriver, function ($oDriver) { return $oDriver instanceof \RainLoop\Providers\Suggestions\ISuggestions; }); } - - $this->aDrivers = \is_array($aDriver) && \count($aDriver) ? $aDriver : null; } public function Process(\RainLoop\Model\Account $oAccount, string $sQuery, int $iLimit = 20) : array { - $aResult = array(); - if (\strlen($sQuery) && $this->IsActive()) { - foreach ($this->aDrivers as $oDriver) { - if ($oDriver) try { - $aSubs = $oDriver->Process($oAccount, $sQuery, $iLimit); - if ($aSubs) { - foreach ($aSubs as $aItem) { - // Unique email address - $sLine = \mb_strtolower($aItem[0]); - if (!isset($aResult[$sLine])) { - $aResult[$sLine] = $aItem; - } - } - if ($iLimit < \count($aResult)) { - break; - } + if (!\strlen($sQuery)) { + return []; + } + + $iLimit = \max(5, (int) $iLimit); + $aResult = []; + + // Address Book + try + { + $oAddressBookProvider = \RainLoop\Api::Actions()->AddressBookProvider($oAccount); + if ($oAddressBookProvider && $oAddressBookProvider->IsActive()) { + $aSuggestions = $oAddressBookProvider->GetSuggestions($sQuery, $iLimit); + foreach ($aSuggestions as $aItem) { + // Unique email address + $sLine = \mb_strtolower($aItem[0]); + if (!isset($aResult[$sLine])) { + $aResult[$sLine] = $aItem; } - } catch (\Throwable $oException) { - $this->oLogger && $this->oLogger->WriteException($oException); } } } + catch (\Throwable $oException) + { + $this->oLogger && $this->oLogger->WriteException($oException); + } - return \array_slice($aResult, 0, $iLimit); + // Extensions/Plugins + foreach ($this->aDrivers as $oDriver) { + if ($oDriver) try { + $aSuggestions = $oDriver->Process($oAccount, $sQuery, $iLimit); + if ($aSuggestions) { + foreach ($aSuggestions as $aItem) { + // Unique email address + $sLine = \mb_strtolower($aItem[0]); + if (!isset($aResult[$sLine])) { + $aResult[$sLine] = $aItem; + } + } + if ($iLimit < \count($aResult)) { + break; + } + } + } catch (\Throwable $oException) { + $this->oLogger && $this->oLogger->WriteException($oException); + } + } + + return \array_slice(\array_values($aResult), 0, $iLimit); } public function IsActive() : bool { - return \is_array($this->aDrivers) && \count($this->aDrivers); + return \count($this->aDrivers); } } diff --git a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsContacts.html b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsContacts.html index 11baa566a..82b68883e 100644 --- a/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsContacts.html +++ b/snappymail/v/0.0.0/app/templates/Views/Admin/AdminSettingsContacts.html @@ -21,7 +21,7 @@
- +