Refactored Peer Information to use InformationFields rather than being hard-coded into the peer record
This commit is contained in:
parent
75de51c910
commit
f689e36378
45 changed files with 1422 additions and 1337 deletions
282
src/Socialbox/Managers/PeerInformationManager.php
Normal file
282
src/Socialbox/Managers/PeerInformationManager.php
Normal file
|
@ -0,0 +1,282 @@
|
|||
<?php
|
||||
|
||||
namespace Socialbox\Managers;
|
||||
|
||||
use PDOException;
|
||||
use Socialbox\Classes\Configuration;
|
||||
use Socialbox\Classes\Database;
|
||||
use Socialbox\Enums\PrivacyState;
|
||||
use Socialbox\Enums\Types\InformationFieldName;
|
||||
use Socialbox\Exceptions\DatabaseOperationException;
|
||||
use Socialbox\Objects\Database\PeerInformationFieldRecord;
|
||||
use Socialbox\Objects\Database\PeerRecord;
|
||||
|
||||
class PeerInformationManager
|
||||
{
|
||||
/**
|
||||
* Adds a property to a peer's information record.
|
||||
*
|
||||
* @param string|PeerRecord $peerUuid The UUID of the peer to add the property to.
|
||||
* @param InformationFieldName $property The name of the property to add.
|
||||
* @param string $value The value of the property to add.
|
||||
* @param PrivacyState|null $privacyState The privacy state of the property to add.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws DatabaseOperationException Thrown if the operation fails.
|
||||
*/
|
||||
public static function addField(string|PeerRecord $peerUuid, InformationFieldName $property, string $value, ?PrivacyState $privacyState=null): void
|
||||
{
|
||||
if($peerUuid instanceof PeerRecord)
|
||||
{
|
||||
$peerUuid = $peerUuid->getUuid();
|
||||
}
|
||||
|
||||
if($privacyState === null)
|
||||
{
|
||||
$privacyState = match($property)
|
||||
{
|
||||
InformationFieldName::DISPLAY_NAME => Configuration::getPoliciesConfiguration()->getDefaultDisplayPicturePrivacy(),
|
||||
InformationFieldName::FIRST_NAME => Configuration::getPoliciesConfiguration()->getDefaultFirstNamePrivacy(),
|
||||
InformationFieldName::MIDDLE_NAME => Configuration::getPoliciesConfiguration()->getDefaultMiddleNamePrivacy(),
|
||||
InformationFieldName::LAST_NAME => Configuration::getPoliciesConfiguration()->getDefaultLastNamePrivacy(),
|
||||
InformationFieldName::EMAIL_ADDRESS => Configuration::getPoliciesConfiguration()->getDefaultEmailAddressPrivacy(),
|
||||
InformationFieldName::PHONE_NUMBER => Configuration::getPoliciesConfiguration()->getDefaultPhoneNumberPrivacy(),
|
||||
InformationFieldName::BIRTHDAY => Configuration::getPoliciesConfiguration()->getDefaultBirthdayPrivacy(),
|
||||
InformationFieldName::DISPLAY_PICTURE => COnfiguration::getPoliciesConfiguration()->getDefaultDisplayPicturePrivacy(),
|
||||
InformationFieldName::URL => Configuration::getPoliciesConfiguration()->getDefaultUrlPrivacy(),
|
||||
};
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('INSERT INTO peer_information (peer_uuid, property_name, property_value, privacy_state) VALUES (:peer_uuid, :property_name, :property_value, :privacy_state)');
|
||||
$stmt->bindValue(':peer_uuid', $peerUuid);
|
||||
$propertyName = $property->value;
|
||||
$stmt->bindValue(':property_name', $propertyName);
|
||||
$stmt->bindValue(':property_value', $value);
|
||||
$stmt->bindValue(':privacy_state', $privacyState->value);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException(sprintf('Failed to add property for peer %s', $peerUuid), $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates a property for a peer's information record.
|
||||
*
|
||||
* @param string|PeerRecord $peerUuid The UUID of the peer to update the property for.
|
||||
* @param InformationFieldName $property The name of the property to update.
|
||||
* @param string $value The new value of the property.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws DatabaseOperationException Thrown if the operation fails.
|
||||
*/
|
||||
public static function updateField(string|PeerRecord $peerUuid, InformationFieldName $property, string $value): void
|
||||
{
|
||||
if($peerUuid instanceof PeerRecord)
|
||||
{
|
||||
$peerUuid = $peerUuid->getUuid();
|
||||
}
|
||||
|
||||
if(!self::fieldExists($peerUuid, $property))
|
||||
{
|
||||
throw new DatabaseOperationException(sprintf('Cannot to update property %s for peer %s, property does not exist', $property->value, $peerUuid));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('UPDATE peer_information SET property_value=:property_value WHERE peer_uuid=:peer_uuid AND property_name=:property_name');
|
||||
$stmt->bindValue(':peer_uuid', $peerUuid);
|
||||
$propertyName = $property->value;
|
||||
$stmt->bindValue(':property_name', $propertyName);
|
||||
$stmt->bindValue(':property_value', $value);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException(sprintf('Failed to update property %s for peer %s', $property->value, $peerUuid), $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Updates the privacy state for a property in a peer's information record.
|
||||
*
|
||||
* @param string|PeerRecord $peerUuid The UUID of the peer to update the privacy state for.
|
||||
* @param InformationFieldName $property The name of the property to update the privacy state for.
|
||||
* @param PrivacyState $privacyState The new privacy state of the property.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws DatabaseOperationException Thrown if the operation fails.
|
||||
*/
|
||||
public static function updatePrivacyState(string|PeerRecord $peerUuid, InformationFieldName $property, PrivacyState $privacyState): void
|
||||
{
|
||||
if($peerUuid instanceof PeerRecord)
|
||||
{
|
||||
$peerUuid = $peerUuid->getUuid();
|
||||
}
|
||||
|
||||
if(!self::fieldExists($peerUuid, $property))
|
||||
{
|
||||
throw new \InvalidArgumentException(sprintf('Cannot update privacy state, the requested property %s does not exist with %s', $property->value, $peerUuid));
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('UPDATE peer_information SET privacy_state=:privacy_state WHERE peer_uuid=:peer_uuid AND property_name=:property_name');
|
||||
$stmt->bindValue(':peer_uuid', $peerUuid);
|
||||
$propertyName = $property->value;
|
||||
$stmt->bindValue(':property_name', $propertyName);
|
||||
$privacyState = $privacyState->value;
|
||||
$stmt->bindValue(':privacy_state', $privacyState);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException(sprintf('Failed to update privacy state for property %s for peer %s', $property->value, $peerUuid), $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Checks if a property exists for a peer.
|
||||
*
|
||||
* @param string|PeerRecord $peerUuid The UUID of the peer to check for the property.
|
||||
* @param InformationFieldName $property The name of the property to check for.
|
||||
*
|
||||
* @return bool
|
||||
*
|
||||
* @throws DatabaseOperationException Thrown if the operation fails.
|
||||
*/
|
||||
public static function fieldExists(string|PeerRecord $peerUuid, InformationFieldName $property): bool
|
||||
{
|
||||
if($peerUuid instanceof PeerRecord)
|
||||
{
|
||||
$peerUuid = $peerUuid->getUuid();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT COUNT(*) FROM peer_information WHERE peer_uuid=:peer_uuid AND property_name=:property_name LIMIT 1');
|
||||
$stmt->bindValue(':peer_uuid', $peerUuid);
|
||||
$propertyName = $property->value;
|
||||
$stmt->bindValue(':property_name', $propertyName);
|
||||
$stmt->execute();
|
||||
|
||||
return $stmt->fetchColumn() > 0;
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException(sprintf('Failed to check if property exists for peer %s', $peerUuid), $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets a property from a peer's information record.
|
||||
*
|
||||
* @param string|PeerRecord $peerUuid The UUID of the peer to get the property from.
|
||||
* @param InformationFieldName $property The name of the property to get.
|
||||
*
|
||||
* @return PeerInformationFieldRecord
|
||||
*
|
||||
* @throws DatabaseOperationException Thrown if the operation fails.
|
||||
*/
|
||||
public static function getField(string|PeerRecord $peerUuid, InformationFieldName $property): PeerInformationFieldRecord
|
||||
{
|
||||
if($peerUuid instanceof PeerRecord)
|
||||
{
|
||||
$peerUuid = $peerUuid->getUuid();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT * FROM peer_information WHERE peer_uuid=:peer_uuid AND property_name=:property_name LIMIT 1');
|
||||
$stmt->bindValue(':peer_uuid', $peerUuid);
|
||||
$propertyName = $property->value;
|
||||
$stmt->bindValue(':property_name', $propertyName);
|
||||
$stmt->execute();
|
||||
|
||||
$result = $stmt->fetch();
|
||||
if($result === false)
|
||||
{
|
||||
throw new DatabaseOperationException(sprintf('Property %s does not exist for peer %s', $property->value, $peerUuid));
|
||||
}
|
||||
|
||||
return PeerInformationFieldRecord::fromArray($result);
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException(sprintf('Failed to get property %s for peer %s', $property->value, $peerUuid), $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Gets all properties from a peer's information record.
|
||||
*
|
||||
* @param string|PeerRecord $peerUuid The UUID of the peer to get the properties from.
|
||||
*
|
||||
* @return PeerInformationFieldRecord[]
|
||||
*
|
||||
* @throws DatabaseOperationException Thrown if the operation fails.
|
||||
*/
|
||||
public static function getFields(string|PeerRecord $peerUuid): array
|
||||
{
|
||||
if($peerUuid instanceof PeerRecord)
|
||||
{
|
||||
$peerUuid = $peerUuid->getUuid();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('SELECT * FROM peer_information WHERE peer_uuid=:peer_uuid');
|
||||
$stmt->bindValue(':peer_uuid', $peerUuid);
|
||||
$stmt->execute();
|
||||
$results = $stmt->fetchAll();
|
||||
|
||||
if(!$results)
|
||||
{
|
||||
return [];
|
||||
}
|
||||
|
||||
return array_map(fn($result) => PeerInformationFieldRecord::fromArray($result), $results);
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException(sprintf('Failed to get properties for peer %s', $peerUuid), $e);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes a property from a peer's information record.
|
||||
*
|
||||
* @param string|PeerRecord $peerUuid The UUID of the peer to delete the property from.
|
||||
* @param InformationFieldName $property The name of the property to delete.
|
||||
*
|
||||
* @return void
|
||||
*
|
||||
* @throws DatabaseOperationException Thrown if the operation fails.
|
||||
*/
|
||||
public static function deleteField(string|PeerRecord $peerUuid, InformationFieldName $property): void
|
||||
{
|
||||
if($peerUuid instanceof PeerRecord)
|
||||
{
|
||||
$peerUuid = $peerUuid->getUuid();
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
$stmt = Database::getConnection()->prepare('DELETE FROM peer_information WHERE peer_uuid=:peer_uuid AND property_name=:property_name');
|
||||
$stmt->bindValue(':peer_uuid', $peerUuid);
|
||||
$propertyName = $property->value;
|
||||
$stmt->bindValue(':property_name', $propertyName);
|
||||
$stmt->execute();
|
||||
}
|
||||
catch(PDOException $e)
|
||||
{
|
||||
throw new DatabaseOperationException(sprintf('Failed to delete property %s for peer %s', $property->value, $peerUuid), $e);
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue