diff --git a/src/Factory/Api/Mastodon/Account.php b/src/Factory/Api/Mastodon/Account.php index 60f9a76e11..a58f8941ef 100644 --- a/src/Factory/Api/Mastodon/Account.php +++ b/src/Factory/Api/Mastodon/Account.php @@ -4,26 +4,35 @@ namespace Friendica\Factory\Api\Mastodon; use Friendica\App\BaseURL; use Friendica\BaseFactory; +use Friendica\Collection\Api\Mastodon\Fields; use Friendica\Model\APContact; use Friendica\Model\Contact; use Friendica\Network\HTTPException; +use Friendica\Repository\PermissionSet; +use Friendica\Repository\ProfileField; use Psr\Log\LoggerInterface; class Account extends BaseFactory { /** @var BaseURL */ protected $baseUrl; + /** @var ProfileField */ + protected $profileField; + /** @var Field */ + protected $mstdnField; - public function __construct(LoggerInterface $logger, BaseURL $baseURL) + public function __construct(LoggerInterface $logger, BaseURL $baseURL, ProfileField $profileField, Field $mstdnField) { parent::__construct($logger); $this->baseUrl = $baseURL; + $this->profileField = $profileField; + $this->mstdnField = $mstdnField; } /** * @param int $contactId - * @param int $uid User Id + * @param int $uid Public contact (=0) or owner user id * @return \Friendica\Object\Api\Mastodon\Account * @throws HTTPException\InternalServerErrorException * @throws \ImagickException @@ -41,6 +50,24 @@ class Account extends BaseFactory $apcontact = APContact::getByURL($publicContact['url'], false); - return new \Friendica\Object\Api\Mastodon\Account($this->baseUrl, $publicContact, $apcontact, $userContact); + return new \Friendica\Object\Api\Mastodon\Account($this->baseUrl, $publicContact, new Fields(), $apcontact, $userContact); + } + + /** + * @param int $userId + * @return \Friendica\Object\Api\Mastodon\Account + * @throws HTTPException\InternalServerErrorException + * @throws \ImagickException + */ + public function createFromUserId(int $userId) + { + $publicContact = Contact::selectFirst([], ['uid' => $userId, 'self' => true]); + + $profileFields = $this->profileField->select(['uid' => $userId, 'psid' => PermissionSet::PUBLIC]); + $fields = $this->mstdnField->createFromProfileFields($profileFields); + + $apcontact = APContact::getByURL($publicContact['url'], false); + + return new \Friendica\Object\Api\Mastodon\Account($this->baseUrl, $publicContact, $fields, $apcontact); } } diff --git a/src/Object/Api/Mastodon/Account.php b/src/Object/Api/Mastodon/Account.php index 38eefee3df..a5f401a0f3 100644 --- a/src/Object/Api/Mastodon/Account.php +++ b/src/Object/Api/Mastodon/Account.php @@ -4,6 +4,7 @@ namespace Friendica\Object\Api\Mastodon; use Friendica\App\BaseURL; use Friendica\BaseEntity; +use Friendica\Collection\Api\Mastodon\Fields; use Friendica\Content\Text\BBCode; use Friendica\Database\DBA; use Friendica\Model\Contact; @@ -70,7 +71,7 @@ class Account extends BaseEntity * @param array $userContact Optional full contact table record with uid != 0 * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public function __construct(BaseURL $baseUrl, array $publicContact, array $apcontact = [], array $userContact = []) + public function __construct(BaseURL $baseUrl, array $publicContact, Fields $fields, array $apcontact = [], array $userContact = []) { $this->id = $publicContact['id']; $this->username = $publicContact['nick']; @@ -94,7 +95,7 @@ class Account extends BaseEntity // No custom emojis per account in Friendica $this->emojis = []; // No metadata fields in Friendica - $this->fields = []; + $this->fields = $fields->getArrayCopy(); $this->bot = ($publicContact['contact-type'] == Contact::TYPE_NEWS); $this->group = ($publicContact['contact-type'] == Contact::TYPE_COMMUNITY); $this->discoverable = !$publicContact['unsearchable']; diff --git a/src/Object/Api/Mastodon/FollowRequest.php b/src/Object/Api/Mastodon/FollowRequest.php index ed72f07d54..2e1257d3e4 100644 --- a/src/Object/Api/Mastodon/FollowRequest.php +++ b/src/Object/Api/Mastodon/FollowRequest.php @@ -3,6 +3,7 @@ namespace Friendica\Object\Api\Mastodon; use Friendica\App\BaseURL; +use Friendica\Collection\Api\Mastodon\Fields; /** * Virtual entity to separate Accounts from Follow Requests. @@ -24,7 +25,7 @@ class FollowRequest extends Account */ public function __construct(BaseURL $baseUrl, int $introduction_id, array $publicContact, array $apcontact = [], array $userContact = []) { - parent::__construct($baseUrl, $publicContact, $apcontact, $userContact); + parent::__construct($baseUrl, $publicContact, new Fields(), $apcontact, $userContact); $this->id = $introduction_id; }