diff --git a/doc/API-Mastodon.md b/doc/API-Mastodon.md index 0d7f921a27..5fcb4782c5 100644 --- a/doc/API-Mastodon.md +++ b/doc/API-Mastodon.md @@ -63,6 +63,10 @@ Extensions to the [Mastodon Status Entities](https://docs.joinmastodon.org/entit * `in_reply_to_status`: A fully populated Mastodon Status entity for the replied to status or null it is a post rather than a response * `friendica`: Friendica specific properties of a status including: * `title`: The Friendica title for a post, or empty if the status is a comment + * `delivery_data`: Information about the state of federating a message from the server + * `delivery_queue_count`: Total number of remote servers that the status needs to be federated to. + * `delivery_queue_done`: Total number of remote servers that have successfully been federated to so far. + * `delivery_queue_failed`: Total number of remote servers that have we failed to federate to so far. * `dislikes_count`: The number of dislikes that a status has accumulated according to the server. Example: @@ -111,6 +115,11 @@ Example: ... "friendica": { "title": "", + "delivery_data": { + "delivery_queue_count": 10, + "delivery_queue_done": 3, + "delivery_queue_failed": 0 + }, "dislikes_count": 0 } } diff --git a/src/Factory/Api/Mastodon/Status.php b/src/Factory/Api/Mastodon/Status.php index 788841a9bc..fed7ea4730 100644 --- a/src/Factory/Api/Mastodon/Status.php +++ b/src/Factory/Api/Mastodon/Status.php @@ -33,6 +33,8 @@ use Friendica\Model\Post; use Friendica\Model\Tag as TagModel; use Friendica\Model\Verb; use Friendica\Network\HTTPException; +use Friendica\Object\Api\Mastodon\Status\FriendicaDeliveryData; +use Friendica\Object\Api\Mastodon\Status\FriendicaExtension; use Friendica\Protocol\Activity; use Friendica\Protocol\ActivityPub; use ImagickException; @@ -97,7 +99,8 @@ class Status extends BaseFactory public function createFromUriId(int $uriId, int $uid = 0, bool $display_quote = false, bool $reblog = true, bool $in_reply_status = true): \Friendica\Object\Api\Mastodon\Status { $fields = ['uri-id', 'uid', 'author-id', 'causer-id', 'author-uri-id', 'author-link', 'causer-uri-id', 'post-reason', 'starred', 'app', 'title', 'body', 'raw-body', 'content-warning', 'question-id', - 'created', 'network', 'thr-parent-id', 'parent-author-id', 'language', 'uri', 'plink', 'private', 'vid', 'gravity', 'featured', 'has-media', 'quote-uri-id']; + 'created', 'network', 'thr-parent-id', 'parent-author-id', 'language', 'uri', 'plink', 'private', 'vid', 'gravity', 'featured', 'has-media', 'quote-uri-id', + 'delivery_queue_count', 'delivery_queue_done','delivery_queue_failed']; $item = Post::selectFirst($fields, ['uri-id' => $uriId, 'uid' => [0, $uid]], ['order' => ['uid' => true]]); if (!$item) { $mail = DBA::selectFirst('mail', ['id'], ['uri-id' => $uriId, 'uid' => $uid]); @@ -285,7 +288,10 @@ class Status extends BaseFactory $in_reply = []; } - return new \Friendica\Object\Api\Mastodon\Status($item, $account, $counts, $userAttributes, $sensitive, $application, $mentions, $tags, $card, $attachments, $in_reply, $reshare, $quote, $poll); + $delivery_data = new FriendicaDeliveryData($item['delivery_queue_count'], $item['delivery_queue_done'], $item['delivery_queue_failed']); + $friendica = new FriendicaExtension($item['title'], $counts->dislikes, $delivery_data); + + return new \Friendica\Object\Api\Mastodon\Status($item, $account, $counts, $userAttributes, $sensitive, $application, $mentions, $tags, $card, $attachments, $in_reply, $reshare, $friendica, $quote, $poll); } /** @@ -349,7 +355,8 @@ class Status extends BaseFactory $attachments = []; $in_reply = []; $reshare = []; + $friendica = new FriendicaExtension('', 0, new FriendicaDeliveryData(0, 0, 0)); - return new \Friendica\Object\Api\Mastodon\Status($item, $account, $counts, $userAttributes, $sensitive, $application, $mentions, $tags, $card, $attachments, $in_reply, $reshare); + return new \Friendica\Object\Api\Mastodon\Status($item, $account, $counts, $userAttributes, $sensitive, $application, $mentions, $tags, $card, $attachments, $in_reply, $reshare, $friendica); } } diff --git a/src/Object/Api/Mastodon/Status.php b/src/Object/Api/Mastodon/Status.php index 30f554bdf5..2e7a0877d4 100644 --- a/src/Object/Api/Mastodon/Status.php +++ b/src/Object/Api/Mastodon/Status.php @@ -105,7 +105,7 @@ class Status extends BaseDataTransferObject * @param array $item * @throws \Friendica\Network\HTTPException\InternalServerErrorException */ - public function __construct(array $item, Account $account, Counts $counts, UserAttributes $userAttributes, bool $sensitive, Application $application, array $mentions, array $tags, Card $card, array $attachments, array $in_reply, array $reblog, array $quote = null, array $poll = null) + public function __construct(array $item, Account $account, Counts $counts, UserAttributes $userAttributes, bool $sensitive, Application $application, array $mentions, array $tags, Card $card, array $attachments, array $in_reply, array $reblog, FriendicaExtension $friendica, array $quote = null, array $poll = null) { $this->id = (string)$item['uri-id']; $this->created_at = DateTimeFormat::utc($item['created'], DateTimeFormat::JSON); @@ -151,7 +151,7 @@ class Status extends BaseDataTransferObject $this->emojis = []; $this->card = $card->toArray() ?: null; $this->poll = $poll; - $this->friendica = new FriendicaExtension($item['title'], $counts->dislikes); + $this->friendica = $friendica; } /** diff --git a/src/Object/Api/Mastodon/Status/FriendicaDeliveryData.php b/src/Object/Api/Mastodon/Status/FriendicaDeliveryData.php new file mode 100644 index 0000000000..3da0eae57c --- /dev/null +++ b/src/Object/Api/Mastodon/Status/FriendicaDeliveryData.php @@ -0,0 +1,55 @@ +. + * + */ + +namespace Friendica\Object\Api\Mastodon\Status; + +use Friendica\BaseDataTransferObject; + +/** + * Class FriendicaDeliveryData + * + * Additional fields on Mastodon Statuses for storing Friendica delivery data + * + * @see https://docs.joinmastodon.org/entities/status + */ +class FriendicaDeliveryData extends BaseDataTransferObject +{ + /** @var int|null */ + protected $delivery_queue_count; + + /** @var int|null */ + protected $delivery_queue_done; + + /** @var int|null */ + protected $delivery_queue_failed; + + /** + * Creates a FriendicaDeliveryData object + * + * @throws \Friendica\Network\HTTPException\InternalServerErrorException + */ + public function __construct(?int $delivery_queue_count, ?int $delivery_queue_done, ?int $delivery_queue_failed) + { + $this->delivery_queue_count = $delivery_queue_count; + $this->delivery_queue_done = $delivery_queue_done; + $this->delivery_queue_failed = $delivery_queue_failed; + } +} diff --git a/src/Object/Api/Mastodon/Status/FriendicaExtension.php b/src/Object/Api/Mastodon/Status/FriendicaExtension.php index 1db70f7312..b2853894ad 100644 --- a/src/Object/Api/Mastodon/Status/FriendicaExtension.php +++ b/src/Object/Api/Mastodon/Status/FriendicaExtension.php @@ -35,6 +35,8 @@ class FriendicaExtension extends BaseDataTransferObject /** @var string */ protected $title; + /** @var FriendicaDeliveryData */ + protected $delivery_data; /** @var int */ protected $dislikes_count; @@ -42,11 +44,13 @@ class FriendicaExtension extends BaseDataTransferObject * Creates a status count object * * @param string $title - * @throws \Friendica\Network\HTTPException\InternalServerErrorException + * @param int $dislikes_count + * @param FriendicaDeliveryData $delivery_data */ - public function __construct(string $title, int $dislikes_count) + public function __construct(string $title, int $dislikes_count, FriendicaDeliveryData $delivery_data) { $this->title = $title; + $this->delivery_data = $delivery_data; $this->dislikes_count = $dislikes_count; } }