diff --git a/src/DI.php b/src/DI.php index 9025feb470..e64c5cef2d 100644 --- a/src/DI.php +++ b/src/DI.php @@ -460,6 +460,11 @@ abstract class DI return self::$dice->create(Repository\ProfileField::class); } + public static function profileFieldNew(): Profile\ProfileField\Depository\ProfileField + { + return self::$dice->create(Profile\ProfileField\Depository\ProfileField::class); + } + public static function notification(): Navigation\Notifications\Depository\Notification { return self::$dice->create(Navigation\Notifications\Depository\Notification::class); diff --git a/src/Factory/Api/Mastodon/Field.php b/src/Factory/Api/Mastodon/Field.php index 2e33022425..aade421bb1 100644 --- a/src/Factory/Api/Mastodon/Field.php +++ b/src/Factory/Api/Mastodon/Field.php @@ -23,7 +23,7 @@ namespace Friendica\Factory\Api\Mastodon; use Friendica\BaseFactory; use Friendica\Collection\Api\Mastodon\Fields; -use Friendica\Collection\ProfileFields; +use Friendica\Profile\ProfileField\Collection\ProfileFields; use Friendica\Content\Text\BBCode; use Friendica\Profile\ProfileField\Entity\ProfileField; use Friendica\Network\HTTPException; diff --git a/src/Module/Api/Friendica/Profile/Show.php b/src/Module/Api/Friendica/Profile/Show.php index b1d4314b7f..c0f3a3f8dc 100644 --- a/src/Module/Api/Friendica/Profile/Show.php +++ b/src/Module/Api/Friendica/Profile/Show.php @@ -21,7 +21,7 @@ namespace Friendica\Module\Api\Friendica\Profile; -use Friendica\Collection\ProfileFields; +use Friendica\Profile\ProfileField\Collection\ProfileFields; use Friendica\Content\Text\BBCode; use Friendica\DI; use Friendica\Model\Contact; @@ -45,7 +45,7 @@ class Show extends BaseApi $profile = Profile::getByUID($uid); - $profileFields = DI::profileField()->select(['uid' => $uid, 'psid' => PermissionSet::PUBLIC]); + $profileFields = DI::profileFieldNew()->selectPublicFieldsByUserId($uid); $profile = self::formatProfile($profile, $profileFields); diff --git a/src/Collection/ProfileFields.php b/src/Profile/ProfileField/Collection/ProfileFields.php similarity index 95% rename from src/Collection/ProfileFields.php rename to src/Profile/ProfileField/Collection/ProfileFields.php index 9e706da1f3..b235ad2ecd 100644 --- a/src/Collection/ProfileFields.php +++ b/src/Profile/ProfileField/Collection/ProfileFields.php @@ -19,7 +19,7 @@ * */ -namespace Friendica\Collection; +namespace Friendica\Profile\ProfileField\Collection; use Friendica\BaseCollection; diff --git a/src/Profile/ProfileField/Depository/ProfileField.php b/src/Profile/ProfileField/Depository/ProfileField.php new file mode 100644 index 0000000000..47abcbd145 --- /dev/null +++ b/src/Profile/ProfileField/Depository/ProfileField.php @@ -0,0 +1,56 @@ +getArrayCopy()); + } + + /** + * Returns all public available ProfileFields for a specific user + * + * @param int $uid the user id + * + * @return Collection\ProfileFields + */ + public function selectPublicFieldsByUserId(int $uid): Collection\ProfileFields + { + return $this->select([ + 'uid' => $uid, + 'psid' => PermissionSet::PUBLIC, + ]); + } +} diff --git a/src/Profile/ProfileField/Entity/ProfileField.php b/src/Profile/ProfileField/Entity/ProfileField.php index 6703615b0b..ad122344f1 100644 --- a/src/Profile/ProfileField/Entity/ProfileField.php +++ b/src/Profile/ProfileField/Entity/ProfileField.php @@ -21,12 +21,10 @@ namespace Friendica\Profile\ProfileField\Entity; -use Friendica\BaseModel; -use Friendica\Database\Database; -use Friendica\Network\HTTPException\NotFoundException; +use Friendica\BaseEntity; +use Friendica\Profile\ProfileField\Exception\UnexpectedPermissionSetException; use Friendica\Security\PermissionSet\Depository\PermissionSet as PermissionSetDepository; use Friendica\Security\PermissionSet\Entity\PermissionSet; -use Psr\Log\LoggerInterface; /** * Custom profile field model class. @@ -34,40 +32,61 @@ use Psr\Log\LoggerInterface; * Custom profile fields are user-created arbitrary profile fields that can be assigned a permission set to restrict its * display to specific Friendica contacts as it requires magic authentication to work. * - * @property int uid - * @property int order - * @property int psid - * @property string label - * @property string value - * @property string created - * @property string edited - * @property PermissionSet permissionSet + * @property-read int|null $id + * @property-read int $uid + * @property-read int $order + * @property-read int $permissionSetId + * @property-read string $label + * @property-read string $value + * @property-read \DateTime $created + * @property-read \DateTime $edited + * @property PermissionSet $permissionSet */ -class ProfileField extends BaseModel +class ProfileField extends BaseEntity { + /** @var int|null */ + protected $id; /** @var PermissionSet */ - private $permissionSet; - + protected $permissionSet; /** @var PermissionSetDepository */ - private $permissionSetDepository; + protected $permissionSetDepository; + /** @var int */ + protected $uid; + /** @var int */ + protected $order; + /** @var int */ + protected $psid; + /** @var string */ + protected $label; + /** @var string */ + protected $value; + /** @var \DateTime */ + protected $created; + /** @var \DateTime */ + protected $edited; - public function __construct(Database $dba, LoggerInterface $logger, PermissionSetDepository $permissionSetDepository, array $data = []) + public function __construct(PermissionSetDepository $permissionSetDepository, int $uid, int $order, int $permissionSetId, string $label, string $value, \DateTime $created, \DateTime $edited, int $id = null) { - parent::__construct($dba, $logger, $data); - $this->permissionSetDepository = $permissionSetDepository; + + $this->uid = $uid; + $this->order = $order; + $this->psid = $permissionSetId; + $this->label = $label; + $this->value = $value; + $this->created = $created; + $this->edited = $edited; + $this->id = $id; } public function __get($name) { - $this->checkValid(); - switch ($name) { case 'permissionSet': if (empty($this->permissionSet)) { $permissionSet = $this->permissionSetDepository->selectOneById($this->psid, $this->uid); if ($permissionSet->uid !== $this->uid) { - throw new NotFoundException(sprintf('PermissionSet %d (user-id: %d) for ProfileField %d (user-id: %d) is invalid.', $permissionSet->id, $permissionSet->uid, $this->id, $this->uid)); + throw new UnexpectedPermissionSetException(sprintf('PermissionSet %d (user-id: %d) for ProfileField %d (user-id: %d) is invalid.', $permissionSet->id, $permissionSet->uid, $this->id, $this->uid)); } $this->permissionSet = $permissionSet; diff --git a/src/Profile/ProfileField/Exception/UnexpectedPermissionSetException.php b/src/Profile/ProfileField/Exception/UnexpectedPermissionSetException.php new file mode 100644 index 0000000000..677a75befe --- /dev/null +++ b/src/Profile/ProfileField/Exception/UnexpectedPermissionSetException.php @@ -0,0 +1,7 @@ +permissionSetDepository = $permissionSetDepository; + } + + /** + * @inheritDoc + */ + public function createFromTableRow(array $row): Entity\ProfileField + { + return new Entity\ProfileField( + $this->permissionSetDepository, + $row['uid'], + $row['order'], + $row['psid'], + $row['label'], + $row['value'], + new \DateTime($row['created'], new \DateTimeZone('UTC')), + new \DateTime($row['edited'] ?? 'now', new \DateTimeZone('UTC')) + ); + } +} diff --git a/src/Repository/ProfileField.php b/src/Repository/ProfileField.php index 75221933b3..878c6b2b4b 100644 --- a/src/Repository/ProfileField.php +++ b/src/Repository/ProfileField.php @@ -23,7 +23,6 @@ namespace Friendica\Repository; use Friendica\BaseModel; use Friendica\BaseRepository; -use Friendica\Collection; use Friendica\Core\L10n; use Friendica\Database\Database; use Friendica\Database\DBA; @@ -38,7 +37,7 @@ class ProfileField extends BaseRepository protected static $model_class = \Friendica\Profile\ProfileField\Entity\ProfileField::class; - protected static $collection_class = Collection\ProfileFields::class; + protected static $collection_class = \Friendica\Profile\ProfileField\Collection\ProfileFields::class; /** @var PermissionSet */ private $permissionSet; @@ -80,7 +79,8 @@ class ProfileField extends BaseRepository /** * @param array $condition * @param array $params - * @return Collection\ProfileFields + * + * @return \Friendica\Profile\ProfileField\Collection\ProfileFields * @throws \Exception */ public function select(array $condition = [], array $params = []) @@ -94,7 +94,8 @@ class ProfileField extends BaseRepository * @param int|null $min_id * @param int|null $max_id * @param int $limit - * @return Collection\ProfileFields + * + * @return \Friendica\Profile\ProfileField\Collection\ProfileFields * @throws \Exception */ public function selectByBoundaries(array $condition = [], array $params = [], int $min_id = null, int $max_id = null, int $limit = self::LIMIT) @@ -104,7 +105,8 @@ class ProfileField extends BaseRepository /** * @param int $uid Field owner user Id - * @return Collection\ProfileFields + * + * @return \Friendica\Profile\ProfileField\Collection\ProfileFields * @throws \Exception */ public function selectByUserId(int $uid) @@ -120,7 +122,8 @@ class ProfileField extends BaseRepository * * @param int $cid Private contact id, must be owned by $uid * @param int $uid Field owner user id - * @return Collection\ProfileFields + * + * @return \Friendica\Profile\ProfileField\Collection\ProfileFields * @throws \Exception */ public function selectByContactId(int $cid, int $uid) @@ -166,14 +169,15 @@ class ProfileField extends BaseRepository } /** - * @param int $uid User Id - * @param Collection\ProfileFields $profileFields Collection of existing profile fields - * @param array $profileFieldInputs Array of profile field form inputs indexed by profile field id - * @param array $profileFieldOrder List of profile field id in order - * @return Collection\ProfileFields + * @param int $uid User Id + * @param \Friendica\Profile\ProfileField\Collection\ProfileFields $profileFields Collection of existing profile fields + * @param array $profileFieldInputs Array of profile field form inputs indexed by profile field id + * @param array $profileFieldOrder List of profile field id in order + * + * @return \Friendica\Profile\ProfileField\Collection\ProfileFields * @throws \Exception */ - public function updateCollectionFromForm(int $uid, Collection\ProfileFields $profileFields, array $profileFieldInputs, array $profileFieldOrder) + public function updateCollectionFromForm(int $uid, \Friendica\Profile\ProfileField\Collection\ProfileFields $profileFields, array $profileFieldInputs, array $profileFieldOrder) { // Returns an associative array of id => order values $profileFieldOrder = array_flip($profileFieldOrder); @@ -232,8 +236,8 @@ class ProfileField extends BaseRepository $profileFieldInputs[$profileField->id]['group_deny'] ?? '' ))->id; - $profileField->psid = $psid; - $profileField->label = $profileFieldInputs[$profileField->id]['label']; + $profileField->permissionSetId = $psid; + $profileField->label = $profileFieldInputs[$profileField->id]['label']; $profileField->value = $profileFieldInputs[$profileField->id]['value']; $profileField->order = $profileFieldOrder[$profileField->id];