Improvements

This commit is contained in:
Netkas 2023-06-20 23:29:09 -04:00
parent 80f6650eaf
commit 18fcee5863
No known key found for this signature in database
GPG key ID: 5DAF58535614062B
4 changed files with 67 additions and 43 deletions

View file

@ -3,7 +3,7 @@
namespace FederationLib\Interfaces; namespace FederationLib\Interfaces;
use FederationLib\Objects\ClientRecord; use FederationLib\Objects\ClientRecord;
use FederationLib\Objects\PeerRecord; use FederationLib\Objects\ParsedFederatedAddress;
use FederationLib\Objects\Standard\PeerMetadata\TelegramUserMetadata; use FederationLib\Objects\Standard\PeerMetadata\TelegramUserMetadata;
interface PeerMetadataManagerInterface interface PeerMetadataManagerInterface
@ -31,8 +31,8 @@
/** /**
* Returns the metadata of the given federated address, this returns the full raw metadata * 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 * @return TelegramUserMetadata
*/ */
public function getMetadata(PeerRecord|string $federated_address): TelegramUserMetadata; public function getMetadata(ParsedFederatedAddress|string $federated_address): TelegramUserMetadata;
} }

View file

@ -15,7 +15,7 @@
use FederationLib\Interfaces\PeerMetadataManagerInterface; use FederationLib\Interfaces\PeerMetadataManagerInterface;
use FederationLib\Managers\RedisConnectionManager; use FederationLib\Managers\RedisConnectionManager;
use FederationLib\Objects\ClientRecord; use FederationLib\Objects\ClientRecord;
use FederationLib\Objects\PeerRecord; use FederationLib\Objects\ParsedFederatedAddress;
use FederationLib\Objects\Standard\PeerMetadata\TelegramUserMetadata; use FederationLib\Objects\Standard\PeerMetadata\TelegramUserMetadata;
use LogLib\Log; use LogLib\Log;
@ -182,24 +182,19 @@
} }
/** /**
* @param PeerRecord|string $federated_address * @param ParsedFederatedAddress|string $federated_address
* @return TelegramUserMetadata * @return TelegramUserMetadata
*@throws DatabaseException * @throws DatabaseException
* @throws PeerMetadataNotFoundException * @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')) if(Configuration::isCacheSystemEnabled() && Configuration::getObjectCacheEnabled('peer_objects'))
{ {
try try
{ {
$redis = RedisConnectionManager::getConnectionFromConfig('peer_objects'); $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)) if($redis->exists($key))
{ {
@ -210,13 +205,13 @@
$redis->expire($key, Configuration::getObjectCacheTTL('peer_objects')); $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; return $telegram_user_metadata;
} }
} }
catch(Exception $e) 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->from(DatabaseTables::PEERS_TELEGRAM_USER);
$qb->where('federated_address = :federated_address'); $qb->where('federated_address = :federated_address');
$qb->setParameter('federated_address', $federated_address); $qb->setParameter('federated_address', $federated_address->getAddress());
$qb->setMaxResults(1); $qb->setMaxResults(1);
try try
@ -243,7 +238,7 @@
if($result->rowCount() === 0) 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); $telegram_user_metadata = TelegramUserMetadata::fromArray($result->fetchAssociative(), true);
@ -254,7 +249,7 @@
} }
catch(Exception $e) 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')) if(Configuration::isCacheSystemEnabled() && Configuration::getObjectCacheEnabled('peer_objects'))
@ -271,11 +266,11 @@
$redis->expire($key, Configuration::getObjectCacheTTL('peer_objects')); $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) 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()));
} }
} }

View file

@ -1,5 +1,7 @@
<?php <?php
/** @noinspection PhpMissingFieldTypeInspection */
namespace FederationLib\Managers; namespace FederationLib\Managers;
use Doctrine\DBAL\ParameterType; use Doctrine\DBAL\ParameterType;
@ -230,24 +232,29 @@
/** /**
* Returns a peer record for the given federated address * Returns a peer record for the given federated address
* *
* @param string $federated_address * @param string|ParsedFederatedAddress $federated_address
* @return PeerRecord * @return PeerRecord
* @throws CacheConnectionException * @throws CacheConnectionException
* @throws DatabaseException * @throws DatabaseException
* @throws PeerNotFoundException * @throws PeerNotFoundException
* @throws RedisException * @throws RedisException
*/ */
public function getPeer(string $federated_address): PeerRecord public function getPeer(string|ParsedFederatedAddress $federated_address): PeerRecord
{ {
if(!($federated_address instanceof ParsedFederatedAddress))
{
$federated_address = new ParsedFederatedAddress($federated_address);
}
if(Configuration::isCacheSystemEnabled() && Configuration::getObjectCacheEnabled('peer_objects')) if(Configuration::isCacheSystemEnabled() && Configuration::getObjectCacheEnabled('peer_objects'))
{ {
$redis = RedisConnectionManager::getConnectionFromConfig('peer_objects'); $redis = RedisConnectionManager::getConnectionFromConfig('peer_objects');
if($redis->exists($federated_address)) if($redis->exists($federated_address->getAddress()))
{ {
$peer = PeerRecord::fromArray($redis->hGetAll($federated_address)); $peer_record = PeerRecord::fromArray($redis->hGetAll($federated_address->getAddress()));
Log::debug(Misc::FEDERATIONLIB, sprintf('Loaded client object %s from cache', $federated_address)); Log::debug(Misc::FEDERATIONLIB, sprintf('Loaded client object %s from cache', $federated_address->getAddress()));
return $peer; return $peer_record;
} }
} }
@ -263,7 +270,7 @@
); );
$qb->from(DatabaseTables::PEERS); $qb->from(DatabaseTables::PEERS);
$qb->where('federated_address = :federated_address'); $qb->where('federated_address = :federated_address');
$qb->setParameter('federated_address', $federated_address); $qb->setParameter('federated_address', $federated_address->getAddress());
$qb->setMaxResults(1); $qb->setMaxResults(1);
try try
@ -272,10 +279,10 @@
if($result->rowCount() === 0) 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) catch(PeerNotFoundException $e)
{ {
@ -295,42 +302,64 @@
$redis = RedisConnectionManager::getConnectionFromConfig('peer_objects'); $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) 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) 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 * Updates the peer's last seen timestamp
* *
* @param ClientRecord|string $client_uuid * @param ClientRecord|string $client_uuid
* @param PeerRecord|string $federated_address * @param ParsedFederatedAddress|string $federated_address
* @return void * @return void
* @throws DatabaseException * @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) if($client_uuid instanceof ClientRecord)
{ {
$client_uuid = $client_uuid->getUuid(); $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(); $qb = Database::getConnection()->createQueryBuilder();

View file

@ -14,7 +14,7 @@
private $client; private $client;
/** /**
* @var PeerRecord|null * @var ParsedFederatedAddress|null
*/ */
private $peer; private $peer;
@ -27,9 +27,9 @@
* ResolvedIdentity constructor. * ResolvedIdentity constructor.
* *
* @param ClientRecord|null $client * @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->client = $client;
$this->peer = $peer; $this->peer = $peer;
@ -81,9 +81,9 @@
} }
/** /**
* @return PeerRecord|null * @return ParsedFederatedAddress|null
*/ */
public function getPeer(): ?PeerRecord public function getPeer(): ?ParsedFederatedAddress
{ {
return $this->peer; return $this->peer;
} }