123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239 |
- <?php
- namespace App\Http\Controllers;
- use Illuminate\Http\Request;
- use Auth;
- use App\AccountLog;
- use App\Follower;
- use App\Like;
- use App\Status;
- use App\StatusHashtag;
- use Illuminate\Support\Facades\Cache;
- class SeasonalController extends Controller
- {
- public function __construct()
- {
- $this->middleware('auth');
- }
- public function yearInReview()
- {
- abort_if(now()->gt('2021-03-01 00:00:00'), 404);
- abort_if(config('database.default') != 'mysql', 404);
- $profile = Auth::user()->profile;
- return view('account.yir', compact('profile'));
- }
- public function getData(Request $request)
- {
- abort_if(now()->gt('2021-03-01 00:00:00'), 404);
- abort_if(config('database.default') != 'mysql', 404);
- $uid = $request->user()->id;
- $pid = $request->user()->profile_id;
- $epoch = '2020-01-01 00:00:00';
- $epochStart = '2020-01-01 00:00:00';
- $epochEnd = '2020-12-31 23:59:59';
- $siteKey = 'seasonal:my2020:shared';
- $siteTtl = now()->addMonths(3);
- $userKey = 'seasonal:my2020:user:' . $uid;
- $userTtl = now()->addMonths(3);
- $shared = Cache::remember($siteKey, $siteTtl, function() use($epochStart, $epochEnd) {
- return [
- 'average' => [
- 'posts' => round(Status::selectRaw('*, count(profile_id) as count')
- ->whereNull('uri')
- ->whereIn('type', ['photo','photo:album','video','video:album','photo:video:album'])
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->groupBy('profile_id')
- ->pluck('count')
- ->avg()),
- 'likes' => round(Like::selectRaw('*, count(profile_id) as count')
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->groupBy('profile_id')
- ->pluck('count')
- ->avg()),
- ],
- 'popular' => [
- 'hashtag' => StatusHashtag::selectRaw('*,count(hashtag_id) as count')
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->groupBy('hashtag_id')
- ->orderByDesc('count')
- ->take(1)
- ->get()
- ->map(function($sh) {
- return [
- 'name' => $sh->hashtag->name,
- 'count' => $sh->count
- ];
- })
- ->first(),
- 'post' => Status::whereScope('public')
- ->where('likes_count', '>', 1)
- ->whereIsNsfw(false)
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->orderByDesc('likes_count')
- ->take(1)
- ->get()
- ->map(function($status) {
- return [
- 'id' => (string) $status->id,
- 'username' => (string) $status->profile->username,
- 'created_at' => $status->created_at->format('M d, Y'),
- 'type' => $status->type,
- 'url' => $status->url(),
- 'thumb' => $status->thumb(),
- 'likes_count' => $status->likes_count,
- 'reblogs_count' => $status->reblogs_count,
- 'reply_count' => $status->reply_count ?? 0,
- ];
- })
- ->first(),
- 'places' => Status::selectRaw('*, count(place_id) as count')
- ->whereNotNull('place_id')
- ->having('count', '>', 1)
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->groupBy('place_id')
- ->orderByDesc('count')
- ->take(1)
- ->get()
- ->map(function($sh) {
- return [
- 'name' => $sh->place->getName(),
- 'url' => $sh->place->url(),
- 'count' => $sh->count
- ];
- })
- ->first()
- ],
- ];
- });
- $res = Cache::remember($userKey, $userTtl, function() use($uid, $pid, $epochStart, $epochEnd, $request) {
- return [
- 'account' => [
- 'user_id' => $request->user()->id,
- 'created_at' => $request->user()->created_at->format('M d, Y'),
- 'created_this_year' => $request->user()->created_at->gt('2020-01-01 00:00:00'),
- 'created_months_ago' => $request->user()->created_at->diffInMonths(now()),
- 'followers_this_year' => Follower::whereFollowingId($pid)
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->count(),
- 'followed_this_year' => Follower::whereProfileId($pid)
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->count(),
- 'most_popular' => Status::whereProfileId($pid)
- ->where('likes_count', '>', 1)
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->orderByDesc('likes_count')
- ->take(1)
- ->get()
- ->map(function($status) {
- return [
- 'id' => (string) $status->id,
- 'username' => (string) $status->profile->username,
- 'created_at' => $status->created_at->format('M d, Y'),
- 'type' => $status->type,
- 'url' => $status->url(),
- 'thumb' => $status->thumb(),
- 'likes_count' => $status->likes_count,
- 'reblogs_count' => $status->reblogs_count,
- 'reply_count' => $status->reply_count ?? 0,
- ];
- })
- ->first(),
- 'posts_count' => Status::whereProfileId($pid)
- ->whereIn('type', ['photo','photo:album','video','video:album','photo:video:album'])
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->count(),
- 'likes_count' => Like::whereProfileId($pid)
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->count(),
- 'hashtag' => StatusHashtag::selectRaw('*, count(hashtag_id) as count')
- ->whereProfileId($pid)
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->groupBy('profile_id')
- ->orderByDesc('count')
- ->take(1)
- ->get()
- ->map(function($sh) {
- return [
- 'name' => $sh->hashtag->name,
- 'count' => $sh->count
- ];
- })
- ->first(),
- 'places' => Status::selectRaw('*, count(place_id) as count')
- ->whereNotNull('place_id')
- ->having('count', '>', 1)
- ->whereProfileId($pid)
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->groupBy('place_id')
- ->orderByDesc('count')
- ->take(1)
- ->get()
- ->map(function($sh) {
- return [
- 'name' => $sh->place->getName(),
- 'url' => $sh->place->url(),
- 'count' => $sh->count
- ];
- })
- ->first(),
- 'places_total' => Status::whereProfileId($pid)
- ->where('created_at', '>', $epochStart)
- ->where('created_at', '<', $epochEnd)
- ->whereNotNull('place_id')
- ->count()
- ]
- ];
- });
- return response()->json(array_merge($res, $shared));
- }
- public function store(Request $request)
- {
- abort_if(now()->gt('2021-03-01 00:00:00'), 404);
- abort_if(config('database.default') != 'mysql', 404);
- $user = $request->user();
- $log = AccountLog::firstOrCreate([
- [
- 'item_type' => 'App\User',
- 'item_id' => $user->id,
- 'user_id' => $user->id,
- 'action' => 'seasonal.my2020.view'
- ],
- [
- 'ip_address' => $request->ip(),
- 'user_agent' => $request->userAgent()
- ]
- ]);
- return response()->json(200);
- }
- }
|