Update Status caption render logic

This commit is contained in:
Daniel Supernault 2024-11-19 02:53:39 -07:00
parent 0917953dbc
commit fb8dbb95db
No known key found for this signature in database
GPG key ID: 23740873EE6F76A1
9 changed files with 719 additions and 708 deletions

View file

@ -2,18 +2,17 @@
namespace App\Http\Resources; namespace App\Http\Resources;
use Illuminate\Http\Resources\Json\JsonResource; use App\Models\CustomEmoji;
use Cache;
use App\Services\AccountService; use App\Services\AccountService;
use App\Services\HashidService; use App\Services\HashidService;
use App\Services\LikeService; use App\Services\LikeService;
use App\Services\MediaService; use App\Services\MediaService;
use App\Services\MediaTagService; use App\Services\MediaTagService;
use App\Services\StatusHashtagService;
use App\Services\StatusLabelService;
use App\Services\StatusMentionService;
use App\Services\PollService; use App\Services\PollService;
use App\Models\CustomEmoji; use App\Services\StatusHashtagService;
use App\Services\StatusMentionService;
use App\Util\Lexer\Autolink;
use Illuminate\Http\Resources\Json\JsonResource;
class StatusStateless extends JsonResource class StatusStateless extends JsonResource
{ {
@ -28,6 +27,7 @@ class StatusStateless extends JsonResource
$status = $this; $status = $this;
$taggedPeople = MediaTagService::get($status->id); $taggedPeople = MediaTagService::get($status->id);
$poll = $status->type === 'poll' ? PollService::get($status->id) : null; $poll = $status->type === 'poll' ? PollService::get($status->id) : null;
$autoLink = $status->caption ? Autolink::create()->autolink($status->caption) : null;
return [ return [
'_v' => 1, '_v' => 1,
@ -39,7 +39,7 @@ class StatusStateless extends JsonResource
'in_reply_to_id' => $status->in_reply_to_id ? (string) $status->in_reply_to_id : null, 'in_reply_to_id' => $status->in_reply_to_id ? (string) $status->in_reply_to_id : null,
'in_reply_to_account_id' => $status->in_reply_to_profile_id ? (string) $status->in_reply_to_profile_id : null, 'in_reply_to_account_id' => $status->in_reply_to_profile_id ? (string) $status->in_reply_to_profile_id : null,
'reblog' => null, 'reblog' => null,
'content' => $status->rendered ?? $status->caption, 'content' => $autoLink,
'content_text' => $status->caption, 'content_text' => $status->caption,
'created_at' => str_replace('+00:00', 'Z', $status->created_at->format(DATE_RFC3339_EXTENDED)), 'created_at' => str_replace('+00:00', 'Z', $status->created_at->format(DATE_RFC3339_EXTENDED)),
'emojis' => CustomEmoji::scan($status->caption), 'emojis' => CustomEmoji::scan($status->caption),
@ -53,7 +53,7 @@ class StatusStateless extends JsonResource
'visibility' => $status->scope ?? $status->visibility, 'visibility' => $status->scope ?? $status->visibility,
'application' => [ 'application' => [
'name' => 'web', 'name' => 'web',
'website' => null 'website' => null,
], ],
'language' => null, 'language' => null,
'mentions' => StatusMentionService::get($status->id), 'mentions' => StatusMentionService::get($status->id),
@ -70,7 +70,7 @@ class StatusStateless extends JsonResource
'media_attachments' => MediaService::get($status->id), 'media_attachments' => MediaService::get($status->id),
'account' => AccountService::get($status->profile_id, true), 'account' => AccountService::get($status->profile_id, true),
'tags' => StatusHashtagService::statusTags($status->id), 'tags' => StatusHashtagService::statusTags($status->id),
'poll' => $poll 'poll' => $poll,
]; ];
} }
} }

View file

@ -2,14 +2,17 @@
namespace App\Transformer\ActivityPub; namespace App\Transformer\ActivityPub;
use App\Status;
use League\Fractal;
use App\Services\MediaService; use App\Services\MediaService;
use App\Status;
use App\Util\Lexer\Autolink;
use League\Fractal;
class StatusTransformer extends Fractal\TransformerAbstract class StatusTransformer extends Fractal\TransformerAbstract
{ {
public function transform(Status $status) public function transform(Status $status)
{ {
$content = $status->caption ? Autolink::create()->autolink($status->caption) : null;
return [ return [
'@context' => [ '@context' => [
'https://www.w3.org/ns/activitystreams', 'https://www.w3.org/ns/activitystreams',
@ -28,7 +31,7 @@ class StatusTransformer extends Fractal\TransformerAbstract
// XXX: CW Title // XXX: CW Title
'summary' => null, 'summary' => null,
'content' => $status->rendered ?? $status->caption, 'content' => $content,
'inReplyTo' => null, 'inReplyTo' => null,
// TODO: fix date format // TODO: fix date format
@ -53,7 +56,7 @@ class StatusTransformer extends Fractal\TransformerAbstract
'name' => $status->place->name, 'name' => $status->place->name,
'longitude' => $status->place->long, 'longitude' => $status->place->long,
'latitude' => $status->place->lat, 'latitude' => $status->place->lat,
'country' => $status->place->country 'country' => $status->place->country,
] : null, ] : null,
]; ];
} }

View file

@ -2,10 +2,11 @@
namespace App\Transformer\ActivityPub\Verb; namespace App\Transformer\ActivityPub\Verb;
use App\Status;
use League\Fractal;
use App\Models\CustomEmoji; use App\Models\CustomEmoji;
use App\Status;
use App\Util\Lexer\Autolink;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use League\Fractal;
class CreateNote extends Fractal\TransformerAbstract class CreateNote extends Fractal\TransformerAbstract
{ {
@ -15,25 +16,26 @@ class CreateNote extends Fractal\TransformerAbstract
$webfinger = $mention->emailUrl(); $webfinger = $mention->emailUrl();
$name = Str::startsWith($webfinger, '@') ? $name = Str::startsWith($webfinger, '@') ?
$webfinger : $webfinger :
'@' . $webfinger; '@'.$webfinger;
return [ return [
'type' => 'Mention', 'type' => 'Mention',
'href' => $mention->permalink(), 'href' => $mention->permalink(),
'name' => $name 'name' => $name,
]; ];
})->toArray(); })->toArray();
if($status->in_reply_to_id != null) { if ($status->in_reply_to_id != null) {
$parent = $status->parent()->profile; $parent = $status->parent()->profile;
if($parent) { if ($parent) {
$webfinger = $parent->emailUrl(); $webfinger = $parent->emailUrl();
$name = Str::startsWith($webfinger, '@') ? $name = Str::startsWith($webfinger, '@') ?
$webfinger : $webfinger :
'@' . $webfinger; '@'.$webfinger;
$reply = [ $reply = [
'type' => 'Mention', 'type' => 'Mention',
'href' => $parent->permalink(), 'href' => $parent->permalink(),
'name' => $name 'name' => $name,
]; ];
$mentions = array_merge($reply, $mentions); $mentions = array_merge($reply, $mentions);
} }
@ -50,6 +52,7 @@ class CreateNote extends Fractal\TransformerAbstract
$emojis = CustomEmoji::scan($status->caption, true) ?? []; $emojis = CustomEmoji::scan($status->caption, true) ?? [];
$emoji = array_merge($emojis, $mentions); $emoji = array_merge($emojis, $mentions);
$tags = array_merge($emoji, $hashtags); $tags = array_merge($emoji, $hashtags);
$content = $status->caption ? Autolink::create()->autolink($status->caption) : null;
return [ return [
'@context' => [ '@context' => [
@ -62,28 +65,28 @@ class CreateNote extends Fractal\TransformerAbstract
'pixelfed' => 'http://pixelfed.org/ns#', 'pixelfed' => 'http://pixelfed.org/ns#',
'commentsEnabled' => [ 'commentsEnabled' => [
'@id' => 'pixelfed:commentsEnabled', '@id' => 'pixelfed:commentsEnabled',
'@type' => 'schema:Boolean' '@type' => 'schema:Boolean',
], ],
'capabilities' => [ 'capabilities' => [
'@id' => 'pixelfed:capabilities', '@id' => 'pixelfed:capabilities',
'@container' => '@set' '@container' => '@set',
], ],
'announce' => [ 'announce' => [
'@id' => 'pixelfed:canAnnounce', '@id' => 'pixelfed:canAnnounce',
'@type' => '@id' '@type' => '@id',
], ],
'like' => [ 'like' => [
'@id' => 'pixelfed:canLike', '@id' => 'pixelfed:canLike',
'@type' => '@id' '@type' => '@id',
], ],
'reply' => [ 'reply' => [
'@id' => 'pixelfed:canReply', '@id' => 'pixelfed:canReply',
'@type' => '@id' '@type' => '@id',
], ],
'toot' => 'http://joinmastodon.org/ns#', 'toot' => 'http://joinmastodon.org/ns#',
'Emoji' => 'toot:Emoji', 'Emoji' => 'toot:Emoji',
'blurhash' => 'toot:blurhash', 'blurhash' => 'toot:blurhash',
] ],
], ],
'id' => $status->permalink(), 'id' => $status->permalink(),
'type' => 'Create', 'type' => 'Create',
@ -95,7 +98,7 @@ class CreateNote extends Fractal\TransformerAbstract
'id' => $status->url(), 'id' => $status->url(),
'type' => 'Note', 'type' => 'Note',
'summary' => $status->is_nsfw ? $status->cw_summary : null, 'summary' => $status->is_nsfw ? $status->cw_summary : null,
'content' => $status->rendered ?? $status->caption, 'content' => $content,
'inReplyTo' => $status->in_reply_to_id ? $status->parent()->url() : null, 'inReplyTo' => $status->in_reply_to_id ? $status->parent()->url() : null,
'published' => $status->created_at->toAtomString(), 'published' => $status->created_at->toAtomString(),
'url' => $status->url(), 'url' => $status->url(),
@ -110,32 +113,33 @@ class CreateNote extends Fractal\TransformerAbstract
'url' => $media->url(), 'url' => $media->url(),
'name' => $media->caption, 'name' => $media->caption,
]; ];
if($media->blurhash) { if ($media->blurhash) {
$res['blurhash'] = $media->blurhash; $res['blurhash'] = $media->blurhash;
} }
if($media->width) { if ($media->width) {
$res['width'] = $media->width; $res['width'] = $media->width;
} }
if($media->height) { if ($media->height) {
$res['height'] = $media->height; $res['height'] = $media->height;
} }
return $res; return $res;
})->toArray(), })->toArray(),
'tag' => $tags, 'tag' => $tags,
'commentsEnabled' => (bool) !$status->comments_disabled, 'commentsEnabled' => (bool) ! $status->comments_disabled,
'capabilities' => [ 'capabilities' => [
'announce' => 'https://www.w3.org/ns/activitystreams#Public', 'announce' => 'https://www.w3.org/ns/activitystreams#Public',
'like' => 'https://www.w3.org/ns/activitystreams#Public', 'like' => 'https://www.w3.org/ns/activitystreams#Public',
'reply' => $status->comments_disabled == true ? '[]' : 'https://www.w3.org/ns/activitystreams#Public' 'reply' => $status->comments_disabled == true ? '[]' : 'https://www.w3.org/ns/activitystreams#Public',
], ],
'location' => $status->place_id ? [ 'location' => $status->place_id ? [
'type' => 'Place', 'type' => 'Place',
'name' => $status->place->name, 'name' => $status->place->name,
'longitude' => $status->place->long, 'longitude' => $status->place->long,
'latitude' => $status->place->lat, 'latitude' => $status->place->lat,
'country' => $status->place->country 'country' => $status->place->country,
] : null, ] : null,
] ],
]; ];
} }
} }

View file

@ -2,10 +2,11 @@
namespace App\Transformer\ActivityPub\Verb; namespace App\Transformer\ActivityPub\Verb;
use App\Status;
use League\Fractal;
use App\Models\CustomEmoji; use App\Models\CustomEmoji;
use App\Status;
use App\Util\Lexer\Autolink;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use League\Fractal;
class Note extends Fractal\TransformerAbstract class Note extends Fractal\TransformerAbstract
{ {
@ -16,25 +17,26 @@ class Note extends Fractal\TransformerAbstract
$webfinger = $mention->emailUrl(); $webfinger = $mention->emailUrl();
$name = Str::startsWith($webfinger, '@') ? $name = Str::startsWith($webfinger, '@') ?
$webfinger : $webfinger :
'@' . $webfinger; '@'.$webfinger;
return [ return [
'type' => 'Mention', 'type' => 'Mention',
'href' => $mention->permalink(), 'href' => $mention->permalink(),
'name' => $name 'name' => $name,
]; ];
})->toArray(); })->toArray();
if($status->in_reply_to_id != null) { if ($status->in_reply_to_id != null) {
$parent = $status->parent()->profile; $parent = $status->parent()->profile;
if($parent) { if ($parent) {
$webfinger = $parent->emailUrl(); $webfinger = $parent->emailUrl();
$name = Str::startsWith($webfinger, '@') ? $name = Str::startsWith($webfinger, '@') ?
$webfinger : $webfinger :
'@' . $webfinger; '@'.$webfinger;
$reply = [ $reply = [
'type' => 'Mention', 'type' => 'Mention',
'href' => $parent->permalink(), 'href' => $parent->permalink(),
'name' => $name 'name' => $name,
]; ];
array_push($mentions, $reply); array_push($mentions, $reply);
} }
@ -51,6 +53,7 @@ class Note extends Fractal\TransformerAbstract
$emojis = CustomEmoji::scan($status->caption, true) ?? []; $emojis = CustomEmoji::scan($status->caption, true) ?? [];
$emoji = array_merge($emojis, $mentions); $emoji = array_merge($emojis, $mentions);
$tags = array_merge($emoji, $hashtags); $tags = array_merge($emoji, $hashtags);
$content = $status->caption ? Autolink::create()->autolink($status->caption) : null;
return [ return [
'@context' => [ '@context' => [
@ -63,33 +66,33 @@ class Note extends Fractal\TransformerAbstract
'pixelfed' => 'http://pixelfed.org/ns#', 'pixelfed' => 'http://pixelfed.org/ns#',
'commentsEnabled' => [ 'commentsEnabled' => [
'@id' => 'pixelfed:commentsEnabled', '@id' => 'pixelfed:commentsEnabled',
'@type' => 'schema:Boolean' '@type' => 'schema:Boolean',
], ],
'capabilities' => [ 'capabilities' => [
'@id' => 'pixelfed:capabilities', '@id' => 'pixelfed:capabilities',
'@container' => '@set' '@container' => '@set',
], ],
'announce' => [ 'announce' => [
'@id' => 'pixelfed:canAnnounce', '@id' => 'pixelfed:canAnnounce',
'@type' => '@id' '@type' => '@id',
], ],
'like' => [ 'like' => [
'@id' => 'pixelfed:canLike', '@id' => 'pixelfed:canLike',
'@type' => '@id' '@type' => '@id',
], ],
'reply' => [ 'reply' => [
'@id' => 'pixelfed:canReply', '@id' => 'pixelfed:canReply',
'@type' => '@id' '@type' => '@id',
], ],
'toot' => 'http://joinmastodon.org/ns#', 'toot' => 'http://joinmastodon.org/ns#',
'Emoji' => 'toot:Emoji', 'Emoji' => 'toot:Emoji',
'blurhash' => 'toot:blurhash', 'blurhash' => 'toot:blurhash',
] ],
], ],
'id' => $status->url(), 'id' => $status->url(),
'type' => 'Note', 'type' => 'Note',
'summary' => $status->is_nsfw ? $status->cw_summary : null, 'summary' => $status->is_nsfw ? $status->cw_summary : null,
'content' => $status->rendered ?? $status->caption, 'content' => $content,
'inReplyTo' => $status->in_reply_to_id ? $status->parent()->url() : null, 'inReplyTo' => $status->in_reply_to_id ? $status->parent()->url() : null,
'published' => $status->created_at->toAtomString(), 'published' => $status->created_at->toAtomString(),
'url' => $status->url(), 'url' => $status->url(),
@ -104,30 +107,31 @@ class Note extends Fractal\TransformerAbstract
'url' => $media->url(), 'url' => $media->url(),
'name' => $media->caption, 'name' => $media->caption,
]; ];
if($media->blurhash) { if ($media->blurhash) {
$res['blurhash'] = $media->blurhash; $res['blurhash'] = $media->blurhash;
} }
if($media->width) { if ($media->width) {
$res['width'] = $media->width; $res['width'] = $media->width;
} }
if($media->height) { if ($media->height) {
$res['height'] = $media->height; $res['height'] = $media->height;
} }
return $res; return $res;
})->toArray(), })->toArray(),
'tag' => $tags, 'tag' => $tags,
'commentsEnabled' => (bool) !$status->comments_disabled, 'commentsEnabled' => (bool) ! $status->comments_disabled,
'capabilities' => [ 'capabilities' => [
'announce' => 'https://www.w3.org/ns/activitystreams#Public', 'announce' => 'https://www.w3.org/ns/activitystreams#Public',
'like' => 'https://www.w3.org/ns/activitystreams#Public', 'like' => 'https://www.w3.org/ns/activitystreams#Public',
'reply' => $status->comments_disabled == true ? '[]' : 'https://www.w3.org/ns/activitystreams#Public' 'reply' => $status->comments_disabled == true ? '[]' : 'https://www.w3.org/ns/activitystreams#Public',
], ],
'location' => $status->place_id ? [ 'location' => $status->place_id ? [
'type' => 'Place', 'type' => 'Place',
'name' => $status->place->name, 'name' => $status->place->name,
'longitude' => $status->place->long, 'longitude' => $status->place->long,
'latitude' => $status->place->lat, 'latitude' => $status->place->lat,
'country' => $status->place->country 'country' => $status->place->country,
] : null, ] : null,
]; ];
} }

View file

@ -3,8 +3,9 @@
namespace App\Transformer\ActivityPub\Verb; namespace App\Transformer\ActivityPub\Verb;
use App\Status; use App\Status;
use League\Fractal; use App\Util\Lexer\Autolink;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use League\Fractal;
class Question extends Fractal\TransformerAbstract class Question extends Fractal\TransformerAbstract
{ {
@ -14,11 +15,12 @@ class Question extends Fractal\TransformerAbstract
$webfinger = $mention->emailUrl(); $webfinger = $mention->emailUrl();
$name = Str::startsWith($webfinger, '@') ? $name = Str::startsWith($webfinger, '@') ?
$webfinger : $webfinger :
'@' . $webfinger; '@'.$webfinger;
return [ return [
'type' => 'Mention', 'type' => 'Mention',
'href' => $mention->permalink(), 'href' => $mention->permalink(),
'name' => $name 'name' => $name,
]; ];
})->toArray(); })->toArray();
@ -30,6 +32,7 @@ class Question extends Fractal\TransformerAbstract
]; ];
})->toArray(); })->toArray();
$tags = array_merge($mentions, $hashtags); $tags = array_merge($mentions, $hashtags);
$content = $status->caption ? Autolink::create()->autolink($status->caption) : null;
return [ return [
'@context' => [ '@context' => [
@ -42,32 +45,32 @@ class Question extends Fractal\TransformerAbstract
'pixelfed' => 'http://pixelfed.org/ns#', 'pixelfed' => 'http://pixelfed.org/ns#',
'commentsEnabled' => [ 'commentsEnabled' => [
'@id' => 'pixelfed:commentsEnabled', '@id' => 'pixelfed:commentsEnabled',
'@type' => 'schema:Boolean' '@type' => 'schema:Boolean',
], ],
'capabilities' => [ 'capabilities' => [
'@id' => 'pixelfed:capabilities', '@id' => 'pixelfed:capabilities',
'@container' => '@set' '@container' => '@set',
], ],
'announce' => [ 'announce' => [
'@id' => 'pixelfed:canAnnounce', '@id' => 'pixelfed:canAnnounce',
'@type' => '@id' '@type' => '@id',
], ],
'like' => [ 'like' => [
'@id' => 'pixelfed:canLike', '@id' => 'pixelfed:canLike',
'@type' => '@id' '@type' => '@id',
], ],
'reply' => [ 'reply' => [
'@id' => 'pixelfed:canReply', '@id' => 'pixelfed:canReply',
'@type' => '@id' '@type' => '@id',
], ],
'toot' => 'http://joinmastodon.org/ns#', 'toot' => 'http://joinmastodon.org/ns#',
'Emoji' => 'toot:Emoji' 'Emoji' => 'toot:Emoji',
] ],
], ],
'id' => $status->url(), 'id' => $status->url(),
'type' => 'Question', 'type' => 'Question',
'summary' => null, 'summary' => null,
'content' => $status->rendered ?? $status->caption, 'content' => $content,
'inReplyTo' => $status->in_reply_to_id ? $status->parent()->url() : null, 'inReplyTo' => $status->in_reply_to_id ? $status->parent()->url() : null,
'published' => $status->created_at->toAtomString(), 'published' => $status->created_at->toAtomString(),
'url' => $status->url(), 'url' => $status->url(),
@ -77,30 +80,30 @@ class Question extends Fractal\TransformerAbstract
'sensitive' => (bool) $status->is_nsfw, 'sensitive' => (bool) $status->is_nsfw,
'attachment' => [], 'attachment' => [],
'tag' => $tags, 'tag' => $tags,
'commentsEnabled' => (bool) !$status->comments_disabled, 'commentsEnabled' => (bool) ! $status->comments_disabled,
'capabilities' => [ 'capabilities' => [
'announce' => 'https://www.w3.org/ns/activitystreams#Public', 'announce' => 'https://www.w3.org/ns/activitystreams#Public',
'like' => 'https://www.w3.org/ns/activitystreams#Public', 'like' => 'https://www.w3.org/ns/activitystreams#Public',
'reply' => $status->comments_disabled == true ? '[]' : 'https://www.w3.org/ns/activitystreams#Public' 'reply' => $status->comments_disabled == true ? '[]' : 'https://www.w3.org/ns/activitystreams#Public',
], ],
'location' => $status->place_id ? [ 'location' => $status->place_id ? [
'type' => 'Place', 'type' => 'Place',
'name' => $status->place->name, 'name' => $status->place->name,
'longitude' => $status->place->long, 'longitude' => $status->place->long,
'latitude' => $status->place->lat, 'latitude' => $status->place->lat,
'country' => $status->place->country 'country' => $status->place->country,
] : null, ] : null,
'endTime' => $status->poll->expires_at->toAtomString(), 'endTime' => $status->poll->expires_at->toAtomString(),
'oneOf' => collect($status->poll->poll_options)->map(function($option, $index) use($status) { 'oneOf' => collect($status->poll->poll_options)->map(function ($option, $index) use ($status) {
return [ return [
'type' => 'Note', 'type' => 'Note',
'name' => $option, 'name' => $option,
'replies' => [ 'replies' => [
'type' => 'Collection', 'type' => 'Collection',
'totalItems' => $status->poll->cached_tallies[$index] 'totalItems' => $status->poll->cached_tallies[$index],
] ],
]; ];
}) }),
]; ];
} }
} }

View file

@ -2,10 +2,11 @@
namespace App\Transformer\ActivityPub\Verb; namespace App\Transformer\ActivityPub\Verb;
use App\Status;
use League\Fractal;
use App\Models\CustomEmoji; use App\Models\CustomEmoji;
use App\Status;
use App\Util\Lexer\Autolink;
use Illuminate\Support\Str; use Illuminate\Support\Str;
use League\Fractal;
class UpdateNote extends Fractal\TransformerAbstract class UpdateNote extends Fractal\TransformerAbstract
{ {
@ -15,25 +16,26 @@ class UpdateNote extends Fractal\TransformerAbstract
$webfinger = $mention->emailUrl(); $webfinger = $mention->emailUrl();
$name = Str::startsWith($webfinger, '@') ? $name = Str::startsWith($webfinger, '@') ?
$webfinger : $webfinger :
'@' . $webfinger; '@'.$webfinger;
return [ return [
'type' => 'Mention', 'type' => 'Mention',
'href' => $mention->permalink(), 'href' => $mention->permalink(),
'name' => $name 'name' => $name,
]; ];
})->toArray(); })->toArray();
if($status->in_reply_to_id != null) { if ($status->in_reply_to_id != null) {
$parent = $status->parent()->profile; $parent = $status->parent()->profile;
if($parent) { if ($parent) {
$webfinger = $parent->emailUrl(); $webfinger = $parent->emailUrl();
$name = Str::startsWith($webfinger, '@') ? $name = Str::startsWith($webfinger, '@') ?
$webfinger : $webfinger :
'@' . $webfinger; '@'.$webfinger;
$reply = [ $reply = [
'type' => 'Mention', 'type' => 'Mention',
'href' => $parent->permalink(), 'href' => $parent->permalink(),
'name' => $name 'name' => $name,
]; ];
$mentions = array_merge($reply, $mentions); $mentions = array_merge($reply, $mentions);
} }
@ -51,6 +53,7 @@ class UpdateNote extends Fractal\TransformerAbstract
$emoji = array_merge($emojis, $mentions); $emoji = array_merge($emojis, $mentions);
$tags = array_merge($emoji, $hashtags); $tags = array_merge($emoji, $hashtags);
$content = $status->caption ? Autolink::create()->autolink($status->caption) : null;
$latestEdit = $status->edits()->latest()->first(); $latestEdit = $status->edits()->latest()->first();
return [ return [
@ -64,29 +67,29 @@ class UpdateNote extends Fractal\TransformerAbstract
'pixelfed' => 'http://pixelfed.org/ns#', 'pixelfed' => 'http://pixelfed.org/ns#',
'commentsEnabled' => [ 'commentsEnabled' => [
'@id' => 'pixelfed:commentsEnabled', '@id' => 'pixelfed:commentsEnabled',
'@type' => 'schema:Boolean' '@type' => 'schema:Boolean',
], ],
'capabilities' => [ 'capabilities' => [
'@id' => 'pixelfed:capabilities', '@id' => 'pixelfed:capabilities',
'@container' => '@set' '@container' => '@set',
], ],
'announce' => [ 'announce' => [
'@id' => 'pixelfed:canAnnounce', '@id' => 'pixelfed:canAnnounce',
'@type' => '@id' '@type' => '@id',
], ],
'like' => [ 'like' => [
'@id' => 'pixelfed:canLike', '@id' => 'pixelfed:canLike',
'@type' => '@id' '@type' => '@id',
], ],
'reply' => [ 'reply' => [
'@id' => 'pixelfed:canReply', '@id' => 'pixelfed:canReply',
'@type' => '@id' '@type' => '@id',
], ],
'toot' => 'http://joinmastodon.org/ns#', 'toot' => 'http://joinmastodon.org/ns#',
'Emoji' => 'toot:Emoji' 'Emoji' => 'toot:Emoji',
]
], ],
'id' => $status->permalink('#updates/' . $latestEdit->id), ],
'id' => $status->permalink('#updates/'.$latestEdit->id),
'type' => 'Update', 'type' => 'Update',
'actor' => $status->profile->permalink(), 'actor' => $status->profile->permalink(),
'published' => $latestEdit->created_at->toAtomString(), 'published' => $latestEdit->created_at->toAtomString(),
@ -96,7 +99,7 @@ class UpdateNote extends Fractal\TransformerAbstract
'id' => $status->url(), 'id' => $status->url(),
'type' => 'Note', 'type' => 'Note',
'summary' => $status->is_nsfw ? $status->cw_summary : null, 'summary' => $status->is_nsfw ? $status->cw_summary : null,
'content' => $status->rendered ?? $status->caption, 'content' => $content,
'inReplyTo' => $status->in_reply_to_id ? $status->parent()->url() : null, 'inReplyTo' => $status->in_reply_to_id ? $status->parent()->url() : null,
'published' => $status->created_at->toAtomString(), 'published' => $status->created_at->toAtomString(),
'url' => $status->url(), 'url' => $status->url(),
@ -113,21 +116,21 @@ class UpdateNote extends Fractal\TransformerAbstract
]; ];
})->toArray(), })->toArray(),
'tag' => $tags, 'tag' => $tags,
'commentsEnabled' => (bool) !$status->comments_disabled, 'commentsEnabled' => (bool) ! $status->comments_disabled,
'updated' => $latestEdit->created_at->toAtomString(), 'updated' => $latestEdit->created_at->toAtomString(),
'capabilities' => [ 'capabilities' => [
'announce' => 'https://www.w3.org/ns/activitystreams#Public', 'announce' => 'https://www.w3.org/ns/activitystreams#Public',
'like' => 'https://www.w3.org/ns/activitystreams#Public', 'like' => 'https://www.w3.org/ns/activitystreams#Public',
'reply' => $status->comments_disabled == true ? '[]' : 'https://www.w3.org/ns/activitystreams#Public' 'reply' => $status->comments_disabled == true ? '[]' : 'https://www.w3.org/ns/activitystreams#Public',
], ],
'location' => $status->place_id ? [ 'location' => $status->place_id ? [
'type' => 'Place', 'type' => 'Place',
'name' => $status->place->name, 'name' => $status->place->name,
'longitude' => $status->place->long, 'longitude' => $status->place->long,
'latitude' => $status->place->lat, 'latitude' => $status->place->lat,
'country' => $status->place->country 'country' => $status->place->country,
] : null, ] : null,
] ],
]; ];
} }
} }

View file

@ -2,17 +2,19 @@
namespace App\Transformer\Api\Mastodon\v1; namespace App\Transformer\Api\Mastodon\v1;
use App\Status;
use League\Fractal;
use Cache;
use App\Services\MediaService; use App\Services\MediaService;
use App\Services\ProfileService; use App\Services\ProfileService;
use App\Services\StatusHashtagService; use App\Services\StatusHashtagService;
use App\Status;
use App\Util\Lexer\Autolink;
use League\Fractal;
class StatusTransformer extends Fractal\TransformerAbstract class StatusTransformer extends Fractal\TransformerAbstract
{ {
public function transform(Status $status) public function transform(Status $status)
{ {
$content = $status->caption ? Autolink::create()->autolink($status->caption) : null;
return [ return [
'id' => (string) $status->id, 'id' => (string) $status->id,
'created_at' => $status->created_at->toJSON(), 'created_at' => $status->created_at->toJSON(),
@ -31,11 +33,11 @@ class StatusTransformer extends Fractal\TransformerAbstract
'favourited' => $status->liked(), 'favourited' => $status->liked(),
'muted' => false, 'muted' => false,
'bookmarked' => false, 'bookmarked' => false,
'content' => $status->rendered ?? $status->caption ?? '', 'content' => $content,
'reblog' => null, 'reblog' => null,
'application' => [ 'application' => [
'name' => 'web', 'name' => 'web',
'website' => null 'website' => null,
], ],
'mentions' => [], 'mentions' => [],
'emojis' => [], 'emojis' => [],

View file

@ -2,21 +2,20 @@
namespace App\Transformer\Api; namespace App\Transformer\Api;
use App\Status; use App\Models\CustomEmoji;
use League\Fractal;
use Cache;
use App\Services\AccountService; use App\Services\AccountService;
use App\Services\HashidService; use App\Services\HashidService;
use App\Services\LikeService; use App\Services\LikeService;
use App\Services\MediaService; use App\Services\MediaService;
use App\Services\MediaTagService; use App\Services\MediaTagService;
use App\Services\StatusService; use App\Services\PollService;
use App\Services\StatusHashtagService; use App\Services\StatusHashtagService;
use App\Services\StatusLabelService; use App\Services\StatusLabelService;
use App\Services\StatusMentionService; use App\Services\StatusMentionService;
use App\Services\PollService; use App\Services\StatusService;
use App\Models\CustomEmoji; use App\Status;
use App\Util\Lexer\Autolink; use App\Util\Lexer\Autolink;
use League\Fractal;
class StatusStatelessTransformer extends Fractal\TransformerAbstract class StatusStatelessTransformer extends Fractal\TransformerAbstract
{ {
@ -24,9 +23,7 @@ class StatusStatelessTransformer extends Fractal\TransformerAbstract
{ {
$taggedPeople = MediaTagService::get($status->id); $taggedPeople = MediaTagService::get($status->id);
$poll = $status->type === 'poll' ? PollService::get($status->id) : null; $poll = $status->type === 'poll' ? PollService::get($status->id) : null;
$rendered = config('exp.autolink') ? $rendered = $status->caption ? Autolink::create()->autolink($status->caption) : null;
( $status->caption ? Autolink::create()->autolink($status->caption) : '' ) :
( $status->rendered ?? $status->caption );
return [ return [
'_v' => 1, '_v' => 1,
@ -52,7 +49,7 @@ class StatusStatelessTransformer extends Fractal\TransformerAbstract
'visibility' => $status->scope ?? $status->visibility, 'visibility' => $status->scope ?? $status->visibility,
'application' => [ 'application' => [
'name' => 'web', 'name' => 'web',
'website' => null 'website' => null,
], ],
'language' => null, 'language' => null,
'mentions' => StatusMentionService::get($status->id), 'mentions' => StatusMentionService::get($status->id),

View file

@ -2,24 +2,21 @@
namespace App\Transformer\Api; namespace App\Transformer\Api;
use App\Like; use App\Models\CustomEmoji;
use App\Status; use App\Services\BookmarkService;
use League\Fractal;
use Cache;
use App\Services\HashidService; use App\Services\HashidService;
use App\Services\LikeService; use App\Services\LikeService;
use App\Services\MediaService; use App\Services\MediaService;
use App\Services\MediaTagService; use App\Services\MediaTagService;
use App\Services\StatusService; use App\Services\PollService;
use App\Services\ProfileService;
use App\Services\StatusHashtagService; use App\Services\StatusHashtagService;
use App\Services\StatusLabelService; use App\Services\StatusLabelService;
use App\Services\StatusMentionService; use App\Services\StatusMentionService;
use App\Services\ProfileService; use App\Services\StatusService;
use Illuminate\Support\Str; use App\Status;
use App\Services\PollService;
use App\Models\CustomEmoji;
use App\Services\BookmarkService;
use App\Util\Lexer\Autolink; use App\Util\Lexer\Autolink;
use League\Fractal;
class StatusTransformer extends Fractal\TransformerAbstract class StatusTransformer extends Fractal\TransformerAbstract
{ {
@ -28,9 +25,7 @@ class StatusTransformer extends Fractal\TransformerAbstract
$pid = request()->user()->profile_id; $pid = request()->user()->profile_id;
$taggedPeople = MediaTagService::get($status->id); $taggedPeople = MediaTagService::get($status->id);
$poll = $status->type === 'poll' ? PollService::get($status->id, $pid) : null; $poll = $status->type === 'poll' ? PollService::get($status->id, $pid) : null;
$rendered = config('exp.autolink') ? $content = $status->caption ? Autolink::create()->autolink($status->caption) : null;
( $status->caption ? Autolink::create()->autolink($status->caption) : '' ) :
( $status->rendered ?? $status->caption );
return [ return [
'_v' => 1, '_v' => 1,
@ -41,7 +36,7 @@ class StatusTransformer extends Fractal\TransformerAbstract
'in_reply_to_id' => (string) $status->in_reply_to_id, 'in_reply_to_id' => (string) $status->in_reply_to_id,
'in_reply_to_account_id' => (string) $status->in_reply_to_profile_id, 'in_reply_to_account_id' => (string) $status->in_reply_to_profile_id,
'reblog' => $status->reblog_of_id ? StatusService::get($status->reblog_of_id) : null, 'reblog' => $status->reblog_of_id ? StatusService::get($status->reblog_of_id) : null,
'content' => $rendered, 'content' => $content,
'content_text' => $status->caption, 'content_text' => $status->caption,
'created_at' => str_replace('+00:00', 'Z', $status->created_at->format(DATE_RFC3339_EXTENDED)), 'created_at' => str_replace('+00:00', 'Z', $status->created_at->format(DATE_RFC3339_EXTENDED)),
'emojis' => CustomEmoji::scan($status->caption), 'emojis' => CustomEmoji::scan($status->caption),
@ -55,7 +50,7 @@ class StatusTransformer extends Fractal\TransformerAbstract
'visibility' => $status->scope ?? $status->visibility, 'visibility' => $status->scope ?? $status->visibility,
'application' => [ 'application' => [
'name' => 'web', 'name' => 'web',
'website' => null 'website' => null,
], ],
'language' => null, 'language' => null,
'mentions' => StatusMentionService::get($status->id), 'mentions' => StatusMentionService::get($status->id),