blue-twilight/app/Http/Controllers/Gallery/StatisticsController.php

230 lines
6.5 KiB
PHP

<?php
namespace App\Http\Controllers\Gallery;
use App\Facade\Theme;
use App\Http\Controllers\Controller;
use App\Photo;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
class StatisticsController extends Controller
{
public function albumSizeByPhotosChart(Request $request)
{
$stats = DB::table('photos')
->join('albums', 'albums.id', '=', 'photos.album_id')
->groupBy('albums.name')
->select('albums.name', DB::raw('count(photos.id) as photo_count'))
->orderBy('photo_count', 'desc')
->limit(10)
->get();
$labels = [];
$data = [];
foreach ($stats as $stat)
{
$labels[] = $stat->name;
$data[] = $stat->photo_count;
}
return response()->json([
'labels' => $labels,
'backgrounds' => $this->rotateColoursForData($data),
'data' => $data
]);
}
public function albumSizeByPhotoSizeChart(Request $request)
{
$stats = DB::table('photos')
->join('albums', 'albums.id', '=', 'photos.album_id')
->groupBy('albums.name')
->select('albums.name', DB::raw('sum(photos.file_size) as photo_size'))
->orderBy('photo_size', 'desc')
->limit(10)
->get();
$labels = [];
$data = [];
foreach ($stats as $stat)
{
$labels[] = $stat->name;
$data[] = ceil($stat->photo_size / 1024 / 1024);
}
return response()->json([
'labels' => $labels,
'backgrounds' => $this->rotateColoursForData($data),
'data' => $data
]);
}
public function camerasChart(Request $request)
{
$stats = DB::table('photos')
->where([
['camera_make', '!=', ''],
['camera_model', '!=', '']
])
->groupBy('camera_make', 'camera_model')
->select('camera_make', 'camera_model', DB::raw('count(*) as photo_count'))
->orderBy('photo_count', 'desc')
->get();
$labels = [];
$data = [];
foreach ($stats as $stat)
{
// Remove the model from the make if it starts with it
// E.g. CANON - CANON EOS 1200D becomes just CANON EOS 1200D
if (substr($stat->camera_model, 0, strlen($stat->camera_make)) == $stat->camera_make)
{
$stat->camera_make = trim(substr($stat->camera_make, strlen($stat->camera_make)));
}
$labels[] = sprintf('%s %s', $stat->camera_make, $stat->camera_model);
$data[] = $stat->photo_count;
}
return response()->json([
'labels' => $labels,
'backgrounds' => $this->rotateColoursForData($data),
'data' => $data
]);
}
public function fileSizeChart(Request $request)
{
$labels = [
trans('gallery.statistics.file_sizes_legend.small'),
trans('gallery.statistics.file_sizes_legend.medium'),
trans('gallery.statistics.file_sizes_legend.large'),
trans('gallery.statistics.file_sizes_legend.huge')
];
$data = [0, 0, 0, 0];
$stats = DB::table('photos');
$stats->chunk(100, function($photos) use (&$data)
{
foreach ($photos as $photo)
{
if ($photo->file_size < (1 * 1024 * 1024))
{
$data[0]++;
}
else if ($photo->file_size < (3 * 1024 * 1024))
{
$data[1]++;
}
else if ($photo->file_size < (5 * 1024 * 1024))
{
$data[2]++;
}
else if ($photo->file_size >= (5 * 1024 * 1024))
{
$data[3]++;
}
}
});
return response()->json([
'labels' => $labels,
'backgrounds' => $this->rotateColoursForData($data),
'data' => $data
]);
}
public function index(Request $request)
{
return Theme::render('gallery.statistics');
}
public function photosTaken12Months(Request $request)
{
$labels = [];
$data = [];
foreach ($this->last12MonthsDates() as $date)
{
$fromDate = sprintf('%04d-%02d-01 00:00:00', $date[0], $date[1]);
$toDate = sprintf('%04d-%02d-%02d 23:59:59', $date[0], $date[1], cal_days_in_month(CAL_GREGORIAN, $date[1], $date[0]));
$photoCount = Photo::whereBetween('taken_at', array($fromDate, $toDate))->count();
$labels[] = date('M Y', strtotime($fromDate));
$data[] = $photoCount;
}
return response()->json([
'labels' => array_reverse($labels),
'data' => array_reverse($data)
]);
}
public function photosUploaded12Months(Request $request)
{
$labels = [];
$data = [];
foreach ($this->last12MonthsDates() as $date)
{
$fromDate = sprintf('%04d-%02d-01 00:00:00', $date[0], $date[1]);
$toDate = sprintf('%04d-%02d-%02d 23:59:59', $date[0], $date[1], cal_days_in_month(CAL_GREGORIAN, $date[1], $date[0]));
$photoCount = Photo::whereBetween('created_at', array($fromDate, $toDate))->count();
$labels[] = date('M Y', strtotime($fromDate));
$data[] = $photoCount;
}
return response()->json([
'labels' => array_reverse($labels),
'data' => array_reverse($data)
]);
}
private function last12MonthsDates()
{
$year = intval(date('Y'));
$month = intval(date('m'));
$datesNeeded = [];
while (count($datesNeeded) < 12)
{
$datesNeeded[] = [$year, $month];
$month--;
if ($month == 0)
{
$month = 12;
$year--;
}
}
return $datesNeeded;
}
private function rotateColoursForData(array $data = [])
{
$colours = ['#0F2240', '#174E79', '#287598', '#46BBB5', '#35DCAD'];
$result = [];
$lastIndex = 0;
for ($i = 0; $i < count($data); $i++)
{
$result[] = $colours[$lastIndex];
$lastIndex++;
if ($lastIndex >= count($colours))
{
$lastIndex = 0;
}
}
return $result;
}
}