first(); if (is_null($user)) { App::abort(404); return null; } $this->authorizeForUser($this->getUser(), 'view', $user); $albums = $this->getAlbumsForUser($user); $albumIDs = $this->getAlbumIDsForUser($user); $cameras = $this->getCamerasUsedInAlbums($albumIDs); $activity = $this->getActivityDatesInAlbums($albumIDs); return Theme::render('gallery.user_profile', [ 'activity_taken' => $this->constructActivityGrid($activity['taken']), 'activity_uploaded' => $this->constructActivityGrid($activity['uploaded']), 'albums' => $albums, 'cameras' => $cameras, 'user' => $user ]); } private function constructActivityGrid(Collection $collection) { $results = []; $lastYearFrom = new \DateTime(); $lastYearFrom->sub(new \DateInterval('P1Y')); $lastYearFrom->add(new \DateInterval('P1D')); $today = new \DateTime(); $current = clone $lastYearFrom; while ($current < $today) { $year = intval($current->format('Y')); $month = intval($current->format('m')); $date = intval($current->format('d')); if (!isset($results[$year])) { $results[$year] = []; } if (!isset($results[$year][$month])) { $results[$year][$month] = []; } if (!isset($results[$year][$month][$date])) { $results[$year][$month][$date] = 0; } $current->add(new \DateInterval('P1D')); } // Now update the totals from the collection foreach ($collection as $photoInfo) { $date = \DateTime::createFromFormat('Y-m-d', $photoInfo->the_date); $year = intval($date->format('Y')); $month = intval($date->format('m')); $date = intval($date->format('d')); $results[$year][$month][$date] = $photoInfo->photos_count; } // Replace the month names foreach ($results as $year => &$months) { foreach ($months as $month => $dates) { $monthDate = \DateTime::createFromFormat('m', $month); $months[$monthDate->format('M')] = $dates; unset($months[$month]); } } return $results; } private function getActivityDatesInAlbums(array $albumIDs) { $createdAt = DB::table('photos') ->whereIn('album_id', $albumIDs) ->whereRaw(DB::raw('DATE(created_at) > DATE(DATE_SUB(NOW(), INTERVAL 1 year))')) ->select([ DB::raw('DATE(created_at) AS the_date'), DB::raw('COUNT(photos.id) AS photos_count') ]) ->groupBy(DB::raw('DATE(created_at)')) ->orderBy(DB::raw('DATE(created_at)')) ->get(); $takenAt = DB::table('photos') ->whereIn('album_id', $albumIDs) ->whereRaw(DB::raw('DATE(taken_at) > DATE(DATE_SUB(NOW(), INTERVAL 1 year))')) ->select([ DB::raw('DATE(taken_at) AS the_date'), DB::raw('COUNT(photos.id) AS photos_count') ]) ->groupBy(DB::raw('DATE(taken_at)')) ->orderBy(DB::raw('DATE(taken_at)')) ->get(); return ['uploaded' => $createdAt, 'taken' => $takenAt]; } private function getAlbumsForUser(User $user) { return DbHelper::getAlbumsForCurrentUser_NonPaged() ->where('user_id', $user->id) ->paginate(UserConfig::get('items_per_page')); } private function getAlbumIDsForUser(User $user) { $results = []; $albums = DbHelper::getAlbumsForCurrentUser_NonPaged() ->where('user_id', $user->id) ->select('albums.id') ->get(); foreach ($albums as $album) { $results[] = intval($album->id); } return $results; } private function getCamerasUsedInAlbums(array $albumIDs) { return DB::table('photos') ->whereIn('album_id', $albumIDs) ->where([ ['camera_make', '!=', ''], ['camera_model', '!=', ''] ]) ->groupBy('camera_make', 'camera_model', 'camera_software') ->select('camera_make', 'camera_model', 'camera_software', DB::raw('count(*) as photo_count')) ->orderBy('photo_count', 'desc') ->orderBy('camera_make') ->orderBy('camera_model') ->orderBy('camera_software') ->get(); } }