. */ namespace SP\Domain\Account\Services; use SP\Core\Application; use SP\Domain\Account\Dtos\AccountCacheDto; use SP\Domain\Account\Ports\AccountCacheService; use SP\Domain\Account\Ports\AccountToUserGroupRepository; use SP\Domain\Account\Ports\AccountToUserRepository; use SP\Domain\Common\Services\Service; use SP\Domain\Core\Exceptions\ConstraintException; use SP\Domain\Core\Exceptions\QueryException; use SP\Domain\Core\Exceptions\SPException; /** * Class AccountCache */ final class AccountCache extends Service implements AccountCacheService { public function __construct( Application $application, private readonly AccountToUserRepository $accountToUserRepository, private readonly AccountToUserGroupRepository $accountToUserGroupRepository ) { parent::__construct($application); } /** * Devolver los accesos desde la caché * * @param int $accountId The account's ID * @param int $dateEdit The account's date edit * * @return AccountCacheDto * @throws ConstraintException * @throws QueryException * @throws SPException */ public function getCacheForAccount(int $accountId, int $dateEdit): AccountCacheDto { $cache = $this->context->getAccountsCache(); $cacheMiss = $cache === null || !isset($cache[$accountId]) || $cache[$accountId]->getTime() < $dateEdit; if ($cacheMiss) { $cache[$accountId] = new AccountCacheDto( $accountId, $this->accountToUserRepository->getUsersByAccountId($accountId)->getDataAsArray(), $this->accountToUserGroupRepository->getUserGroupsByAccountId($accountId)->getDataAsArray() ); $this->context->setAccountsCache($cache); } return $cache[$accountId]; } }