/**
  * @throws \Exception
  * @return CommandResponse
  */
 public function execute()
 {
     $typeId = $this->_resourceType . '_id';
     $existing = Favourite::where($typeId, '=', $this->_resourceId)->whereUserId(Auth::user()->id)->first();
     $isFavourited = false;
     if ($existing) {
         $existing->delete();
     } else {
         $fav = new Favourite();
         $fav->{$typeId} = $this->_resourceId;
         $fav->user_id = Auth::user()->id;
         $fav->created_at = time();
         $fav->save();
         $isFavourited = true;
     }
     $resourceUser = ResourceUser::get(Auth::user()->id, $this->_resourceType, $this->_resourceId);
     $resourceUser->is_favourited = $isFavourited;
     $resourceUser->save();
     $resourceTable = $this->_resourceType . 's';
     // We do this to prevent a race condition. Sure I could simply increment the count columns and re-save back to the db
     // but that would require an additional SELECT and the operation would be non-atomic. If two log items are created
     // for the same resource at the same time, the cached values will still be correct with this method.
     DB::table($resourceTable)->whereId($this->_resourceId)->update(['favourite_count' => DB::raw('(
                 SELECT
                     COUNT(id)
                 FROM
                     favourites
                 WHERE ' . $typeId . ' = ' . $this->_resourceId . ')')]);
     return CommandResponse::succeed(['is_favourited' => $isFavourited]);
 }
Example #2
0
 public static function logItem($resourceType, $resourceId, $logType, $formatId = null)
 {
     $resourceIdColumn = $resourceType . '_id';
     $logItem = new ResourceLogItem();
     $logItem->{$resourceIdColumn} = $resourceId;
     $logItem->created_at = Carbon::now();
     $logItem->log_type = $logType;
     $logItem->track_format_id = $formatId;
     $logItem->ip_address = Request::getClientIp();
     if (Auth::check()) {
         $logItem->user_id = Auth::user()->id;
     }
     $logItem->save();
     $resourceTable = $resourceType . 's';
     $countColumn = '';
     if ($logType == self::VIEW) {
         $countColumn = 'view_count';
     } else {
         if ($logType == self::DOWNLOAD) {
             $countColumn = 'download_count';
         } else {
             if ($logType == self::PLAY) {
                 $countColumn = 'play_count';
             }
         }
     }
     // We do this to prevent a race condition. Sure I could simply increment the count columns and re-save back to the db
     // but that would require an additional SELECT and the operation would be non-atomic. If two log items are created
     // for the same resource at the same time, the cached values will still be correct with this method.
     DB::table($resourceTable)->whereId($resourceId)->update([$countColumn => DB::raw('(SELECT
                 COUNT(id)
             FROM
                 resource_log_items
             WHERE ' . $resourceIdColumn . ' = ' . $resourceId . '
             AND
                 log_type = ' . $logType . ')')]);
     if (Auth::check()) {
         $resourceUserId = ResourceUser::getId(Auth::user()->id, $resourceType, $resourceId);
         DB::table('resource_users')->whereId($resourceUserId)->update([$countColumn => DB::raw('(SELECT
                     COUNT(id)
                 FROM
                     resource_log_items
                 WHERE
                     user_id = ' . Auth::user()->id . '
                 AND ' . $resourceIdColumn . ' = ' . $resourceId . '
                 AND
                     log_type = ' . $logType . ')')]);
     }
 }
 /**
  * @throws \Exception
  * @return CommandResponse
  */
 public function execute()
 {
     $typeId = $this->_resourceType . '_id';
     $existing = Follower::where($typeId, '=', $this->_resourceId)->whereUserId(Auth::user()->id)->first();
     $isFollowed = false;
     if ($existing) {
         $existing->delete();
     } else {
         $follow = new Follower();
         $follow->{$typeId} = $this->_resourceId;
         $follow->user_id = Auth::user()->id;
         $follow->created_at = time();
         $follow->save();
         $isFollowed = true;
     }
     $resourceUser = ResourceUser::get(Auth::user()->id, $this->_resourceType, $this->_resourceId);
     $resourceUser->is_followed = $isFollowed;
     $resourceUser->save();
     return CommandResponse::succeed(['is_followed' => $isFollowed]);
 }
 /**
  * Execute the console command.
  *
  * @return mixed
  */
 public function handle()
 {
     // Get list of affected users
     $usernames = DB::table('users')->select(['username', DB::raw('COUNT(*) as count')])->whereNull('disabled_at')->whereNotNull('username')->groupBy(DB::raw('LOWER(username)'))->having('count', '>=', 2)->lists('username');
     foreach ($usernames as $username) {
         // Find the relevant accounts
         // ==========================
         /** @var Collection $accounts */
         $accounts = User::where('username', $username)->orderBy('created_at', 'ASC')->get();
         $firstAccount = $accounts[0];
         $accounts->forget(0);
         $accountIds = $accounts->pluck('id');
         // Reassign content
         // ================
         // This is done with the less-efficient-than-raw-SQL Eloquent
         // methods to generate appropriate revision logs.
         $this->info('Merging duplicates for: ' . $firstAccount->username);
         DB::transaction(function () use($accounts, $accountIds, $firstAccount) {
             foreach (Album::whereIn('user_id', $accountIds)->get() as $album) {
                 $album->user_id = $firstAccount->id;
                 $album->save();
             }
             foreach (Comment::whereIn('user_id', $accountIds)->get() as $comment) {
                 $comment->user_id = $firstAccount->id;
                 $comment->save();
             }
             foreach (Favourite::whereIn('user_id', $accountIds)->get() as $favourite) {
                 $favourite->user_id = $firstAccount->id;
                 $favourite->save();
             }
             foreach (Follower::whereIn('artist_id', $accountIds)->get() as $follow) {
                 $follow->artist_id = $firstAccount->id;
                 $follow->save();
             }
             foreach (Image::whereIn('uploaded_by', $accountIds)->get() as $image) {
                 $image->uploaded_by = $firstAccount->id;
                 $image->save();
             }
             foreach (Image::whereIn('uploaded_by', $accountIds)->get() as $image) {
                 $image->uploaded_by = $firstAccount->id;
                 $image->save();
             }
             DB::table('oauth2_tokens')->whereIn('user_id', $accountIds)->update(['user_id' => $firstAccount->id]);
             foreach (PinnedPlaylist::whereIn('user_id', $accountIds)->get() as $playlist) {
                 $playlist->user_id = $firstAccount->id;
                 $playlist->save();
             }
             foreach (Playlist::whereIn('user_id', $accountIds)->get() as $playlist) {
                 $playlist->user_id = $firstAccount->id;
                 $playlist->save();
             }
             foreach (ResourceLogItem::whereIn('user_id', $accountIds)->get() as $item) {
                 $item->user_id = $firstAccount->id;
                 $item->save();
             }
             foreach (ResourceUser::whereIn('user_id', $accountIds)->get() as $item) {
                 $item->user_id = $firstAccount->id;
                 $item->save();
             }
             foreach (Track::whereIn('user_id', $accountIds)->get() as $track) {
                 $track->user_id = $firstAccount->id;
                 $track->save();
             }
             foreach ($accounts as $account) {
                 $account->disabled_at = Carbon::now();
                 $account->save();
             }
         });
     }
 }