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;
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;
}

View file

@ -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()));
}
}

View file

@ -1,5 +1,7 @@
<?php
/** @noinspection PhpMissingFieldTypeInspection */
namespace FederationLib\Managers;
use Doctrine\DBAL\ParameterType;
@ -230,24 +232,29 @@
/**
* Returns a peer record for the given federated address
*
* @param string $federated_address
* @param string|ParsedFederatedAddress $federated_address
* @return PeerRecord
* @throws CacheConnectionException
* @throws DatabaseException
* @throws PeerNotFoundException
* @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'))
{
$redis = RedisConnectionManager::getConnectionFromConfig('peer_objects');
if($redis->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();

View file

@ -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;
}