From 09d5198c5546ee224263350ef7eef70d77a1adab Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Sat, 24 Jul 2021 23:10:44 -0600 Subject: [PATCH] Update StatusTransformers, remove includes and use cached services --- app/Services/MediaService.php | 40 +++++++++++++++++++ app/Services/StatusHashtagService.php | 18 +++++++++ .../Api/StatusStatelessTransformer.php | 37 +++-------------- app/Transformer/Api/StatusTransformer.php | 37 +++-------------- 4 files changed, 70 insertions(+), 62 deletions(-) create mode 100644 app/Services/MediaService.php diff --git a/app/Services/MediaService.php b/app/Services/MediaService.php new file mode 100644 index 000000000..f1230c7d8 --- /dev/null +++ b/app/Services/MediaService.php @@ -0,0 +1,40 @@ +type, ['photo', 'video', 'video:album', 'photo:album', 'loop', 'photo:video:album'])) { + $media = Media::whereStatusId($status->id)->orderBy('order')->get(); + $fractal = new Fractal\Manager(); + $fractal->setSerializer(new ArraySerializer()); + $resource = new Fractal\Resource\Collection($media, new MediaTransformer()); + return $fractal->createData($resource)->toArray(); + } + return []; + }); + } + + public static function del($statusId) + { + return Cache::forget(self::CACHE_KEY . $statusId); + } +} diff --git a/app/Services/StatusHashtagService.php b/app/Services/StatusHashtagService.php index 6863c1d05..d0d8b2550 100644 --- a/app/Services/StatusHashtagService.php +++ b/app/Services/StatusHashtagService.php @@ -6,6 +6,7 @@ use Cache; use Illuminate\Support\Facades\Redis; use App\{Status, StatusHashtag}; use App\Transformer\Api\StatusHashtagTransformer; +use App\Transformer\Api\HashtagTransformer; use League\Fractal; use League\Fractal\Serializer\ArraySerializer; use League\Fractal\Pagination\IlluminatePaginatorAdapter; @@ -78,4 +79,21 @@ class StatusHashtagService { { return ['status' => StatusService::get($statusId)]; } + + public static function statusTags($statusId) + { + $key = 'pf:services:sh:id:' . $statusId; + + return Cache::remember($key, 604800, function() use($statusId) { + $status = Status::find($statusId); + if(!$status) { + return []; + } + + $fractal = new Fractal\Manager(); + $fractal->setSerializer(new ArraySerializer()); + $resource = new Fractal\Resource\Collection($status->hashtags, new HashtagTransformer()); + return $fractal->createData($resource)->toArray(); + }); + } } diff --git a/app/Transformer/Api/StatusStatelessTransformer.php b/app/Transformer/Api/StatusStatelessTransformer.php index b3ba463da..fe433d988 100644 --- a/app/Transformer/Api/StatusStatelessTransformer.php +++ b/app/Transformer/Api/StatusStatelessTransformer.php @@ -7,18 +7,14 @@ use League\Fractal; use Cache; use App\Services\HashidService; use App\Services\LikeService; +use App\Services\MediaService; use App\Services\MediaTagService; +use App\Services\StatusHashtagService; use App\Services\StatusLabelService; use App\Services\ProfileService; class StatusStatelessTransformer extends Fractal\TransformerAbstract { - protected $defaultIncludes = [ - 'account', - 'tags', - 'media_attachments', - ]; - public function transform(Status $status) { $taggedPeople = MediaTagService::get($status->id); @@ -62,31 +58,10 @@ class StatusStatelessTransformer extends Fractal\TransformerAbstract 'local' => (bool) $status->local, 'taggedPeople' => $taggedPeople, 'label' => StatusLabelService::get($status), - 'liked_by' => LikeService::likedBy($status) + 'liked_by' => LikeService::likedBy($status), + 'media_attachments' => MediaService::get($status->id), + 'account' => ProfileService::get($status->profile_id), + 'tags' => StatusHashtagService::statusTags($status->id) ]; } - - public function includeAccount(Status $status) - { - $account = $status->profile; - - return $this->item($account, new AccountTransformer()); - } - - public function includeTags(Status $status) - { - $tags = $status->hashtags; - - return $this->collection($tags, new HashtagTransformer()); - } - - public function includeMediaAttachments(Status $status) - { - return Cache::remember('status:transformer:media:attachments:'.$status->id, now()->addMinutes(3), function() use($status) { - if(in_array($status->type, ['photo', 'video', 'video:album', 'photo:album', 'loop', 'photo:video:album'])) { - $media = $status->media()->orderBy('order')->get(); - return $this->collection($media, new MediaTransformer()); - } - }); - } } diff --git a/app/Transformer/Api/StatusTransformer.php b/app/Transformer/Api/StatusTransformer.php index 4ff621872..481d55a62 100644 --- a/app/Transformer/Api/StatusTransformer.php +++ b/app/Transformer/Api/StatusTransformer.php @@ -8,19 +8,15 @@ use League\Fractal; use Cache; use App\Services\HashidService; use App\Services\LikeService; +use App\Services\MediaService; use App\Services\MediaTagService; +use App\Services\StatusHashtagService; use App\Services\StatusLabelService; use App\Services\ProfileService; use Illuminate\Support\Str; class StatusTransformer extends Fractal\TransformerAbstract { - protected $defaultIncludes = [ - 'account', - 'tags', - 'media_attachments', - ]; - public function transform(Status $status) { $taggedPeople = MediaTagService::get($status->id); @@ -64,31 +60,10 @@ class StatusTransformer extends Fractal\TransformerAbstract 'local' => (bool) $status->local, 'taggedPeople' => $taggedPeople, 'label' => StatusLabelService::get($status), - 'liked_by' => LikeService::likedBy($status) + 'liked_by' => LikeService::likedBy($status), + 'media_attachments' => MediaService::get($status->id), + 'account' => ProfileService::get($status->profile_id), + 'tags' => StatusHashtagService::statusTags($status->id) ]; } - - public function includeAccount(Status $status) - { - $account = $status->profile; - - return $this->item($account, new AccountTransformer()); - } - - public function includeTags(Status $status) - { - $tags = $status->hashtags; - - return $this->collection($tags, new HashtagTransformer()); - } - - public function includeMediaAttachments(Status $status) - { - return Cache::remember('status:transformer:media:attachments:'.$status->id, now()->addMinutes(14), function() use($status) { - if(in_array($status->type, ['photo', 'video', 'video:album', 'photo:album', 'loop', 'photo:video:album'])) { - $media = $status->media()->orderBy('order')->get(); - return $this->collection($media, new MediaTransformer()); - } - }); - } }