Selaa lähdekoodia

Add NotificationService

Daniel Supernault 6 vuotta sitten
vanhempi
commit
b3a9587756
1 muutettua tiedostoa jossa 98 lisäystä ja 0 poistoa
  1. 98 0
      app/Services/NotificationService.php

+ 98 - 0
app/Services/NotificationService.php

@@ -0,0 +1,98 @@
+<?php
+
+namespace App\Services;
+
+use Cache, Redis;
+use App\{
+	Notification,
+	Profile
+};
+use App\Transformer\Api\NotificationTransformer;
+use League\Fractal;
+use League\Fractal\Serializer\ArraySerializer;
+use League\Fractal\Pagination\IlluminatePaginatorAdapter;
+
+class NotificationService {
+
+	const CACHE_KEY = 'pf:services:notifications:ids:';
+
+	public static function get($id, $start = 0, $stop = 300)
+	{
+		$res = collect([]);
+		$key = self::CACHE_KEY . $id;
+		$stop = $stop > 300 ? 300 : $stop;
+		$ids = Redis::zrangebyscore($key, $start, $stop);
+		if(empty($ids)) {
+			$ids = self::coldGet($id, $start, $stop);
+		}
+		foreach($ids as $id) {
+			$res->push(self::getNotification($id));
+		}
+		return $res;
+	}
+
+	public static function coldGet($id, $start = 0, $stop = 300)
+	{
+		$stop = $stop > 300 ? 300 : $stop;
+		$ids = Notification::whereProfileId($id)
+			->latest()
+			->skip($start)
+			->take($stop)
+			->pluck('id');
+		foreach($ids as $key) {
+			self::set($id, $key);
+		}
+		return $ids;
+	}
+
+	public static function set($id, $val)
+	{
+		return Redis::zadd(self::CACHE_KEY . $id, $val, $val);
+	}
+
+	public static function del($id, $val)
+	{
+		return Redis::zrem(self::CACHE_KEY . $id, $val);
+	}
+
+	public static function add($id, $val)
+	{
+		return self::set($id, $val);
+	}
+
+	public static function rem($id, $val)
+	{
+		return self::del($id, $val);
+	}
+
+	public static function count($id)
+	{
+		return Redis::zcount(self::CACHE_KEY . $id, '-inf', '+inf');
+	}
+
+	public static function getNotification($id)
+	{
+		return Cache::remember('service:notification:'.$id, now()->addDays(7), function() use($id) {
+			$n = Notification::findOrFail($id);
+			$fractal = new Fractal\Manager();
+			$fractal->setSerializer(new ArraySerializer());
+			$resource = new Fractal\Resource\Item($n, new NotificationTransformer());
+			return $fractal->createData($resource)->toArray();
+		});
+	} 
+
+	public static function warmCache($id, $stop = 100, $force = false)
+	{
+		if(self::count($id) == 0 || $force == true) {
+			$ids = Notification::whereProfileId($id)
+				->latest()
+				->limit($stop)
+				->pluck('id');
+			foreach($ids as $key) {
+				self::set($id, $key);
+			}
+			return 1;
+		}
+		return 0;
+	}
+}