Browse Source

Update StatusTransformers, remove includes and use cached services

Daniel Supernault 4 years ago
parent
commit
09d5198c55

+ 40 - 0
app/Services/MediaService.php

@@ -0,0 +1,40 @@
+<?php
+
+namespace App\Services;
+
+use Cache;
+use Illuminate\Support\Facades\Redis;
+use App\Media;
+use App\Status;
+use League\Fractal;
+use League\Fractal\Serializer\ArraySerializer;
+use League\Fractal\Pagination\IlluminatePaginatorAdapter;
+use App\Transformer\Api\MediaTransformer;
+
+class MediaService
+{
+	const CACHE_KEY = 'status:transformer:media:attachments:';
+
+	public static function get($statusId)
+	{
+		return Cache::remember(self::CACHE_KEY.$statusId, 129600, function() use($statusId) {
+			$status = Status::find($statusId);
+			if(!$status) {
+				return [];
+			}
+			if(in_array($status->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);
+	}
+}

+ 18 - 0
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();
+		});
+	}
 }

+ 6 - 31
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());
-			}
-		});
-	}
 }

+ 6 - 31
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());
-			}
-		});
-	}
 }