Improvements
This commit is contained in:
parent
80f6650eaf
commit
18fcee5863
4 changed files with 67 additions and 43 deletions
|
@ -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;
|
||||||
}
|
}
|
|
@ -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()));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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();
|
||||||
|
|
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue