Ver código fonte

Add CollectionService

Daniel Supernault 3 anos atrás
pai
commit
aba0c97cee
1 arquivos alterados com 141 adições e 0 exclusões
  1. 141 0
      app/Services/CollectionService.php

+ 141 - 0
app/Services/CollectionService.php

@@ -0,0 +1,141 @@
+<?php
+
+namespace App\Services;
+
+use App\Collection;
+use App\CollectionItem;
+use Illuminate\Support\Facades\Cache;
+use Illuminate\Support\Facades\Redis;
+
+class CollectionService
+{
+	const CACHE_KEY = 'pf:services:collections:';
+
+	public static function getItems($id, $start = 0, $stop = 10)
+	{
+		if(self::count($id)) {
+			return Redis::zrangebyscore(self::CACHE_KEY . 'items:' . $id, $start, $stop);
+		}
+
+		return self::coldBootItems($id);
+	}
+
+	public static function addItem($id, $sid, $score)
+	{
+		Redis::zadd(self::CACHE_KEY . 'items:' . $id, $score, $sid);
+	}
+
+	public static function removeItem($id, $sid)
+	{
+		Redis::zrem(self::CACHE_KEY . 'items:' . $id, $sid);
+	}
+
+	public static function clearItems($id)
+	{
+		Redis::del(self::CACHE_KEY . 'items:' . $id);
+	}
+
+	public static function coldBootItems($id)
+	{
+		return Cache::remember(self::CACHE_KEY . 'items:' . $id, 86400, function() use($id) {
+			return CollectionItem::whereCollectionId($id)
+				->orderBy('order')
+				->get()
+				->each(function($item) use ($id) {
+					self::addItem($id, $item->object_id, $item->order);
+				})
+				->map(function($item) {
+					return (string) $item->object_id;
+				})
+				->values()
+				->toArray();
+		});
+	}
+
+	public static function count($id)
+	{
+		$count = Redis::zcard(self::CACHE_KEY . 'items:' . $id);
+		if(!$count) {
+			self::coldBootItems($id);
+			$count = Redis::zcard(self::CACHE_KEY . 'items:' . $id);
+		}
+		return $count;
+	}
+
+	public static function getCollection($id)
+	{
+		$collection = Cache::remember(self::CACHE_KEY . 'get:' . $id, 86400, function() use($id) {
+			$collection = Collection::find($id);
+			if(!$collection) {
+				return false;
+			}
+			$account = AccountService::get($collection->profile_id);
+			if(!$account) {
+				return false;
+			}
+			return [
+				'id' => (string) $collection->id,
+				'pid' => (string) $collection->profile_id,
+				'username' => $account['username'],
+				'visibility' => $collection->visibility,
+				'title' => $collection->title,
+				'description' => $collection->description,
+				'thumb' => self::getThumb($id),
+				'url' => $collection->url(),
+				'published_at' => $collection->published_at
+			];
+		});
+
+		if($collection) {
+			$collection['post_count'] = self::count($id);
+		}
+
+		return $collection;
+	}
+
+	public static function setCollection($id, $collection)
+	{
+		$account = AccountService::get($collection->profile_id);
+		if(!$account) {
+			return false;
+		}
+		$res = [
+			'id' => (string) $collection->id,
+			'pid' => (string) $collection->profile_id,
+			'username' => $account['username'],
+			'visibility' => $collection->visibility,
+			'title' => $collection->title,
+			'description' => $collection->description,
+			'thumb' => self::getThumb($id),
+			'url' => $collection->url(),
+			'published_at' => $collection->published_at
+		];
+		Cache::put(self::CACHE_KEY . 'get:' . $id, $res, 86400);
+		$res['post_count'] = self::count($id);
+		return $res;
+	}
+
+	public static function deleteCollection($id)
+	{
+		Redis::del(self::CACHE_KEY . 'items:' . $id);
+		Cache::forget(self::CACHE_KEY . 'get:' . $id);
+	}
+
+	public static function getThumb($id)
+	{
+		$item = self::getItems($id, 0, 1);
+		if(!$item || empty($item)) {
+			return '/storage/no-preview.png';
+		}
+		$status = StatusService::get($item[0]);
+		if(!$status) {
+			return '/storage/no-preview.png';
+		}
+
+		if(!isset($status['media_attachments']) || empty($status['media_attachments'])) {
+			return '/storage/no-preview.png';
+		}
+
+		return $status['media_attachments'][0]['url'];
+	}
+}