Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nextcloud/circles.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMaxence Lange <maxence@artificial-owl.com>2022-09-09 16:37:09 +0300
committerMaxence Lange <maxence@artificial-owl.com>2022-09-12 13:46:08 +0300
commite22252e903c0c116f9870206b2deea4c1f6425ae (patch)
tree0937341c04a0fb426df29a695fa8a57df20417b3
parent83fae8c138e0c46a9d3194ea6ccf5d1d78d33cff (diff)
cache getCircles when executed from an other app
Signed-off-by: Maxence Lange <maxence@artificial-owl.com>
-rw-r--r--lib/CirclesManager.php4
-rw-r--r--lib/Service/CircleService.php48
2 files changed, 45 insertions, 7 deletions
diff --git a/lib/CirclesManager.php b/lib/CirclesManager.php
index 32da68c6..6c92b896 100644
--- a/lib/CirclesManager.php
+++ b/lib/CirclesManager.php
@@ -70,8 +70,6 @@ use OCA\Circles\Tools\Exceptions\InvalidItemException;
* @package OCA\Circles
*/
class CirclesManager {
-
-
/** @var FederatedUserService */
private $federatedUserService;
@@ -331,7 +329,7 @@ class CirclesManager {
->filterBackendCircles();
}
- return $this->circleService->getCircles($probe);
+ return $this->circleService->getCircles($probe, true);
}
diff --git a/lib/Service/CircleService.php b/lib/Service/CircleService.php
index b5f2d967..8b865ae2 100644
--- a/lib/Service/CircleService.php
+++ b/lib/Service/CircleService.php
@@ -64,10 +64,14 @@ use OCA\Circles\Model\Member;
use OCA\Circles\Model\Probes\CircleProbe;
use OCA\Circles\Model\Probes\MemberProbe;
use OCA\Circles\StatusCode;
+use OCA\Circles\Tools\Exceptions\InvalidItemException;
use OCA\Circles\Tools\Model\SimpleDataStore;
use OCA\Circles\Tools\Traits\TArrayTools;
+use OCA\Circles\Tools\Traits\TDeserialize;
use OCA\Circles\Tools\Traits\TNCLogger;
use OCA\Circles\Tools\Traits\TStringTools;
+use OCP\ICache;
+use OCP\ICacheFactory;
use OCP\IL10N;
use OCP\Security\IHasher;
@@ -75,6 +79,10 @@ class CircleService {
use TArrayTools;
use TStringTools;
use TNCLogger;
+ use TDeserialize;
+
+ public const CACHE_GET_CIRCLES = 'circles/getCircles';
+ public const CACHE_GET_CIRCLES_TTL = 300;
/** @var IL10N */
@@ -83,6 +91,9 @@ class CircleService {
/** @var IHasher */
private $hasher;
+ /** @var ICache $cache */
+ private $cache;
+
/** @var CircleRequest */
private $circleRequest;
@@ -123,6 +134,7 @@ class CircleService {
public function __construct(
IL10N $l10n,
IHasher $hasher,
+ ICacheFactory $cacheFactory,
CircleRequest $circleRequest,
MemberRequest $memberRequest,
RemoteStreamService $remoteStreamService,
@@ -134,6 +146,7 @@ class CircleService {
) {
$this->l10n = $l10n;
$this->hasher = $hasher;
+ $this->cache = $cacheFactory->createDistributed(self::CACHE_GET_CIRCLES);
$this->circleRequest = $circleRequest;
$this->memberRequest = $memberRequest;
$this->remoteStreamService = $remoteStreamService;
@@ -503,19 +516,41 @@ class CircleService {
/**
- * @param CircleProbe|null $probe
- *
* @return Circle[]
* @throws InitiatorNotFoundException
* @throws RequestBuilderException
*/
- public function getCircles(CircleProbe $probe): array {
+ public function getCircles(CircleProbe $probe, bool $caching = false): array {
$this->federatedUserService->mustHaveCurrentUser();
- return $this->circleRequest->getCircles(
+ // This is a quick solution before implementation of DataProbe
+ if ($caching && !is_null($this->federatedUserService->getCurrentUser())) {
+ $key = $this->generateGetCirclesCacheKey(
+ $this->federatedUserService->getCurrentUser(),
+ $probe->getChecksum()
+ );
+
+ $cachedData = $this->cache->get($key);
+ try {
+ if (!is_string($cachedData)) {
+ throw new InvalidItemException();
+ }
+
+ return $this->deserializeList($cachedData, Circle::class);
+ } catch (InvalidItemException $e) {
+ }
+ }
+
+ $circles = $this->circleRequest->getCircles(
$this->federatedUserService->getCurrentUser(),
$probe
);
+
+ if ($caching && !is_null($this->federatedUserService->getCurrentUser())) {
+ $this->cache->set($key, json_encode($circles), self::CACHE_GET_CIRCLES_TTL);
+ }
+
+ return $circles;
}
@@ -716,4 +751,9 @@ class CircleService {
public function getDefinitionUser(IFederatedUser $federatedUser): string {
return $this->l10n->t('%s', [Circle::$DEF_SOURCE[$federatedUser->getUserType()]]);
}
+
+
+ private function generateGetCirclesCacheKey(FederatedUser $federatedUser, string $probeSum): string {
+ return $federatedUser->getSingleId() . '#' . $probeSum;
+ }
}