diff --git a/src/FederationLib/Interfaces/PeerMetadataManagerInterface.php b/src/FederationLib/Interfaces/PeerMetadataManagerInterface.php index 70625dd..455caaf 100644 --- a/src/FederationLib/Interfaces/PeerMetadataManagerInterface.php +++ b/src/FederationLib/Interfaces/PeerMetadataManagerInterface.php @@ -3,7 +3,7 @@ namespace FederationLib\Interfaces; use FederationLib\Objects\ClientRecord; - use FederationLib\Objects\PeerRecord; + use FederationLib\Objects\ParsedFederatedAddress; use FederationLib\Objects\Standard\PeerMetadata\TelegramUserMetadata; interface PeerMetadataManagerInterface @@ -31,8 +31,8 @@ /** * Returns the metadata of the given federated address, this returns the full raw metadata * - * @param PeerRecord|string $federated_address + * @param ParsedFederatedAddress|string $federated_address * @return TelegramUserMetadata */ - public function getMetadata(PeerRecord|string $federated_address): TelegramUserMetadata; + public function getMetadata(ParsedFederatedAddress|string $federated_address): TelegramUserMetadata; } \ No newline at end of file diff --git a/src/FederationLib/Managers/MetadataManagers/TelegramUserManager.php b/src/FederationLib/Managers/MetadataManagers/TelegramUserManager.php index 3cf891f..d530d6d 100644 --- a/src/FederationLib/Managers/MetadataManagers/TelegramUserManager.php +++ b/src/FederationLib/Managers/MetadataManagers/TelegramUserManager.php @@ -15,7 +15,7 @@ use FederationLib\Interfaces\PeerMetadataManagerInterface; use FederationLib\Managers\RedisConnectionManager; use FederationLib\Objects\ClientRecord; - use FederationLib\Objects\PeerRecord; + use FederationLib\Objects\ParsedFederatedAddress; use FederationLib\Objects\Standard\PeerMetadata\TelegramUserMetadata; use LogLib\Log; @@ -182,24 +182,19 @@ } /** - * @param PeerRecord|string $federated_address + * @param ParsedFederatedAddress|string $federated_address * @return TelegramUserMetadata - *@throws DatabaseException + * @throws DatabaseException * @throws PeerMetadataNotFoundException */ - public function getMetadata(PeerRecord|string $federated_address): TelegramUserMetadata + public function getMetadata(ParsedFederatedAddress|string $federated_address): TelegramUserMetadata { - if($federated_address instanceof PeerRecord) - { - $federated_address = $federated_address->getFederatedAddress(); - } - if(Configuration::isCacheSystemEnabled() && Configuration::getObjectCacheEnabled('peer_objects')) { try { $redis = RedisConnectionManager::getConnectionFromConfig('peer_objects'); - $key = sprintf('telegram_user_metadata:%s', $federated_address); + $key = sprintf('telegram_user_metadata:%s', $federated_address->getAddress()); if($redis->exists($key)) { @@ -210,13 +205,13 @@ $redis->expire($key, Configuration::getObjectCacheTTL('peer_objects')); } - Log::debug(Misc::FEDERATIONLIB, sprintf('Loaded peer metadata object %s from cache', $federated_address)); + Log::debug(Misc::FEDERATIONLIB, sprintf('Loaded peer metadata object %s from cache', $federated_address->getAddress())); return $telegram_user_metadata; } } catch(Exception $e) { - Log::warning(Misc::FEDERATIONLIB, sprintf('Failed to load peer metadata object %s from cache: %s', $federated_address, $e->getMessage())); + Log::warning(Misc::FEDERATIONLIB, sprintf('Failed to load peer metadata object %s from cache: %s', $federated_address->getAddress(), $e->getMessage())); } } @@ -234,7 +229,7 @@ ); $qb->from(DatabaseTables::PEERS_TELEGRAM_USER); $qb->where('federated_address = :federated_address'); - $qb->setParameter('federated_address', $federated_address); + $qb->setParameter('federated_address', $federated_address->getAddress()); $qb->setMaxResults(1); try @@ -243,7 +238,7 @@ if($result->rowCount() === 0) { - throw new PeerMetadataNotFoundException(sprintf('PeerRecord metadata not found for federated address %s', $federated_address)); + throw new PeerMetadataNotFoundException(sprintf('PeerRecord metadata not found for federated address %s', $federated_address->getAddress())); } $telegram_user_metadata = TelegramUserMetadata::fromArray($result->fetchAssociative(), true); @@ -254,7 +249,7 @@ } catch(Exception $e) { - throw new DatabaseException(sprintf('Failed to get peer metadata for federated address %s', $federated_address), $e); + throw new DatabaseException(sprintf('Failed to get peer metadata for federated address %s', $federated_address->getAddress()), $e); } if(Configuration::isCacheSystemEnabled() && Configuration::getObjectCacheEnabled('peer_objects')) @@ -271,11 +266,11 @@ $redis->expire($key, Configuration::getObjectCacheTTL('peer_objects')); } - Log::debug(Misc::FEDERATIONLIB, sprintf('Cached peer metadata object %s', $federated_address)); + Log::debug(Misc::FEDERATIONLIB, sprintf('Cached peer metadata object %s', $federated_address->getAddress())); } catch(Exception $e) { - Log::warning(Misc::FEDERATIONLIB, sprintf('Failed to cache peer metadata object %s: %s', $federated_address, $e->getMessage())); + Log::warning(Misc::FEDERATIONLIB, sprintf('Failed to cache peer metadata object %s: %s', $federated_address->getAddress(), $e->getMessage())); } } diff --git a/src/FederationLib/Managers/PeerManager.php b/src/FederationLib/Managers/PeerManager.php index 226be3d..e12533d 100644 --- a/src/FederationLib/Managers/PeerManager.php +++ b/src/FederationLib/Managers/PeerManager.php @@ -1,5 +1,7 @@ exists($federated_address)) + if($redis->exists($federated_address->getAddress())) { - $peer = PeerRecord::fromArray($redis->hGetAll($federated_address)); - Log::debug(Misc::FEDERATIONLIB, sprintf('Loaded client object %s from cache', $federated_address)); - return $peer; + $peer_record = PeerRecord::fromArray($redis->hGetAll($federated_address->getAddress())); + Log::debug(Misc::FEDERATIONLIB, sprintf('Loaded client object %s from cache', $federated_address->getAddress())); + return $peer_record; } } @@ -263,7 +270,7 @@ ); $qb->from(DatabaseTables::PEERS); $qb->where('federated_address = :federated_address'); - $qb->setParameter('federated_address', $federated_address); + $qb->setParameter('federated_address', $federated_address->getAddress()); $qb->setMaxResults(1); try @@ -272,10 +279,10 @@ if($result->rowCount() === 0) { - throw new PeerNotFoundException($federated_address); + throw new PeerNotFoundException($federated_address->getAddress()); } - $peer = PeerRecord::fromArray($result->fetchAssociative()); + $peer_record = PeerRecord::fromArray($result->fetchAssociative()); } catch(PeerNotFoundException $e) { @@ -295,42 +302,64 @@ $redis = RedisConnectionManager::getConnectionFromConfig('peer_objects'); } - $redis->hMSet($peer->getFederatedAddress(), $peer->toArray()); + $redis->hMSet($federated_address->getAddress(), $peer_record->toArray()); if(Configuration::getObjectCacheTtl('peer_objects') > 0) { - $redis->expire($peer->getFederatedAddress(), Configuration::getObjectCacheTtl('peer_objects')); + $redis->expire($federated_address->getAddress(), Configuration::getObjectCacheTtl('peer_objects')); } - Log::debug(Misc::FEDERATIONLIB, sprintf('Cached peer object %s', $peer->getFederatedAddress())); + Log::debug(Misc::FEDERATIONLIB, sprintf('Cached peer object %s', $federated_address->getAddress())); } catch(Exception $e) { - Log::warning(Misc::FEDERATIONLIB, sprintf('Failed to cache peer object %s', $peer->getFederatedAddress()), $e); + Log::warning(Misc::FEDERATIONLIB, sprintf('Failed to cache peer object %s', $federated_address->getAddress()), $e); } } - return $peer; + return $peer_record; + } + + /** + * Returns a peer record for the given client UUID + * + * @param ParsedFederatedAddress|string $federated_address + * @return PeerMetadataInterface + * @throws UnsupportedPeerType + */ + public function getPeerMetadata(ParsedFederatedAddress|string $federated_address): PeerMetadataInterface + { + if(!($federated_address instanceof ParsedFederatedAddress)) + { + $federated_address = $federated_address->getAddress(); + } + + if(!array_key_exists($federated_address->getPeerClass(), $this->metadata_managers)) + { + throw new UnsupportedPeerType(sprintf('Peer type %s is not supported', $federated_address->getPeerClass())); + } + + return $this->metadata_managers[$federated_address->getPeerClass()]->getMetadata($federated_address); } /** * Updates the peer's last seen timestamp * * @param ClientRecord|string $client_uuid - * @param PeerRecord|string $federated_address + * @param ParsedFederatedAddress|string $federated_address * @return void * @throws DatabaseException */ - public function updateLastSeen(ClientRecord|string $client_uuid, PeerRecord|string $federated_address): void + public function updateLastSeen(ClientRecord|string $client_uuid, ParsedFederatedAddress|string $federated_address): void { if($client_uuid instanceof ClientRecord) { $client_uuid = $client_uuid->getUuid(); } - if($federated_address instanceof PeerRecord) + if($federated_address instanceof ParsedFederatedAddress) { - $federated_address = $federated_address->getFederatedAddress(); + $federated_address = $federated_address->getAddress(); } $qb = Database::getConnection()->createQueryBuilder(); diff --git a/src/FederationLib/Objects/ResolvedIdentity.php b/src/FederationLib/Objects/ResolvedIdentity.php index 656319b..a90a51d 100644 --- a/src/FederationLib/Objects/ResolvedIdentity.php +++ b/src/FederationLib/Objects/ResolvedIdentity.php @@ -14,7 +14,7 @@ private $client; /** - * @var PeerRecord|null + * @var ParsedFederatedAddress|null */ private $peer; @@ -27,9 +27,9 @@ * ResolvedIdentity constructor. * * @param ClientRecord|null $client - * @param PeerRecord|null $peer + * @param ParsedFederatedAddress|null $peer */ - public function __construct(?ClientRecord $client, ?PeerRecord $peer=null, bool $allow_root=false) + public function __construct(?ClientRecord $client, ?ParsedFederatedAddress $peer=null, bool $allow_root=false) { $this->client = $client; $this->peer = $peer; @@ -81,9 +81,9 @@ } /** - * @return PeerRecord|null + * @return ParsedFederatedAddress|null */ - public function getPeer(): ?PeerRecord + public function getPeer(): ?ParsedFederatedAddress { return $this->peer; }