123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162 |
- <?php
- namespace App\Services;
- use Illuminate\Support\Facades\Cache;
- use Illuminate\Support\Facades\Redis;
- use Illuminate\Support\Facades\Storage;
- use App\Story;
- use App\StoryView;
- class StoryService
- {
- const STORY_KEY = 'pf:services:stories:v1:';
- public static function get($id)
- {
- $account = AccountService::get($id);
- if(!$account) {
- return false;
- }
- $res = [
- 'profile' => [
- 'id' => (string) $account['id'],
- 'avatar' => $account['avatar'],
- 'username' => $account['username'],
- 'url' => $account['url']
- ]
- ];
- $res['stories'] = self::getStories($id);
- return $res;
- }
- public static function getById($id)
- {
- return Cache::remember(self::STORY_KEY . 'by-id:id-' . $id, 3600, function() use ($id) {
- return Story::find($id);
- });
- }
- public static function delById($id)
- {
- return Cache::forget(self::STORY_KEY . 'by-id:id-' . $id);
- }
- public static function getStories($id, $pid)
- {
- return Story::whereProfileId($id)
- ->latest()
- ->get()
- ->map(function($s) use($pid) {
- return [
- 'id' => (string) $s->id,
- 'type' => $s->type,
- 'duration' => 10,
- 'seen' => in_array($pid, self::views($s->id)),
- 'created_at' => $s->created_at->toAtomString(),
- 'expires_at' => $s->expires_at->toAtomString(),
- 'media' => url(Storage::url($s->path)),
- 'can_reply' => (bool) $s->can_reply,
- 'can_react' => (bool) $s->can_react,
- 'poll' => $s->type == 'poll' ? PollService::storyPoll($s->id) : null
- ];
- })
- ->toArray();
- }
- public static function views($id)
- {
- return StoryView::whereStoryId($id)
- ->pluck('profile_id')
- ->toArray();
- }
- public static function hasSeen($pid, $sid)
- {
- $key = self::STORY_KEY . 'seen:' . $pid . ':' . $sid;
- return Cache::remember($key, 3600, function() use($pid, $sid) {
- return StoryView::whereStoryId($sid)
- ->whereProfileId($pid)
- ->exists();
- });
- }
- public static function latest($pid)
- {
- return Cache::remember(self::STORY_KEY . 'latest:pid-' . $pid, 3600, function() use ($pid) {
- return Story::whereProfileId($pid)
- ->latest()
- ->first()
- ->id;
- });
- }
- public static function delLatest($pid)
- {
- return Cache::forget(self::STORY_KEY . 'latest:pid-' . $pid);
- }
- public static function addSeen($pid, $sid)
- {
- return Cache::put(self::STORY_KEY . 'seen:' . $pid . ':' . $sid, true, 86400);
- }
- public static function adminStats()
- {
- return Cache::remember('pf:admin:stories:stats', 300, function() {
- $total = Story::count();
- return [
- 'active' => [
- 'today' => Story::whereDate('created_at', now()->today())->count(),
- 'month' => Story::whereMonth('created_at', now()->month)->whereYear('created_at', now()->year)->count()
- ],
- 'total' => $total,
- 'remote' => [
- 'today' => Story::whereLocal(false)->whereDate('created_at', now()->today())->count(),
- 'month' => Story::whereLocal(false)->whereMonth('created_at', now()->month)->whereYear('created_at', now()->year)->count()
- ],
- 'storage' => [
- 'sum' => (int) Story::sum('size'),
- 'average' => (int) Story::avg('size')
- ],
- 'avg_spu' => $total ? (int) ($total / Story::groupBy('profile_id')->pluck('profile_id')->count()) : 'N/A',
- 'avg_duration' => (int) floor(Story::avg('duration')),
- 'avg_type' => $total ? Story::selectRaw('type, count(id) as count')->groupBy('type')->orderByDesc('count')->first()->type : 'N/A'
- ];
- });
- }
- public static function rotateQueue()
- {
- return Redis::smembers('pf:stories:rotate-queue');
- }
- public static function addRotateQueue($id)
- {
- return Redis::sadd('pf:stories:rotate-queue', $id);
- }
- public static function removeRotateQueue($id)
- {
- self::delById($id);
- return Redis::srem('pf:stories:rotate-queue', $id);
- }
- public static function reactIncrement($storyId, $profileId)
- {
- $key = 'pf:stories:react-counter:storyid-' . $storyId . ':profileid-' . $profileId;
- if(Redis::get($key) == null) {
- Redis::setex($key, 86400, 1);
- } else {
- return Redis::incr($key);
- }
- }
- public static function reactCounter($storyId, $profileId)
- {
- $key = 'pf:stories:react-counter:storyid-' . $storyId . ':profileid-' . $profileId;
- return (int) Redis::get($key) ?? 0;
- }
- }
|