AdminStatsService.php 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. <?php
  2. namespace App\Services;
  3. use App\Avatar;
  4. use App\Contact;
  5. use App\FailedJob;
  6. use App\Instance;
  7. use App\Media;
  8. use App\Profile;
  9. use App\Report;
  10. use App\Status;
  11. use App\User;
  12. use App\Util\Lexer\PrettyNumber;
  13. use Cache;
  14. use DateInterval;
  15. use DatePeriod;
  16. use DB;
  17. class AdminStatsService
  18. {
  19. public static function get()
  20. {
  21. return array_merge(
  22. self::recentData(),
  23. self::additionalData(),
  24. self::postsGraph()
  25. );
  26. }
  27. public static function summary()
  28. {
  29. return array_merge(
  30. self::recentData(),
  31. self::additionalDataSummary(),
  32. );
  33. }
  34. public static function storage()
  35. {
  36. return Cache::remember('admin:dashboard:storage:stats', 120000, function () {
  37. $res = [];
  38. $res['last_updated'] = str_replace('+00:00', 'Z', now()->format(DATE_RFC3339_EXTENDED));
  39. $avatars = Avatar::count();
  40. $avatarsLocal = Avatar::whereNull('cdn_url')->count();
  41. $res['avatar'] = [
  42. 'count' => $avatars,
  43. 'local_count' => $avatarsLocal,
  44. 'cloud_count' => ($avatars - $avatarsLocal),
  45. 'total_sum' => Avatar::sum('size'),
  46. ];
  47. $media = Media::count();
  48. $mediaSum = Media::sum('size');
  49. $mediaLocalSum = Media::whereNotNull('user_id')->sum('size');
  50. $mediaLocal = Media::whereNotNull('user_id')->count();
  51. $res['media'] = [
  52. 'count' => $media,
  53. 'local_count' => $mediaLocal,
  54. 'cloud_count' => ($media - $mediaLocal),
  55. 'total_sum' => $mediaSum,
  56. 'local_sum' => $mediaLocalSum,
  57. 'local_30d' => Media::whereNotNull('user_id')->where('created_at', '>', now()->subDays(30))->sum('size'),
  58. 'cloud_30d' => Media::whereNull('user_id')->where('created_at', '>', now()->subDays(30))->sum('size'),
  59. 'cloud_sum' => ($mediaSum - $mediaLocalSum),
  60. 'avg_size' => Media::avg('size'),
  61. 'avg_mime' => Media::groupBy('mime')->orderByRaw('COUNT(*) DESC')->first()->mime,
  62. ];
  63. return $res;
  64. });
  65. }
  66. protected static function recentData()
  67. {
  68. $day = config('database.default') == 'pgsql' ? 'DATE_PART(\'day\',' : 'day(';
  69. $ttl = now()->addMinutes(15);
  70. return Cache::remember('admin:dashboard:home:data:v0:15min', $ttl, function () {
  71. return [
  72. 'contact' => PrettyNumber::convert(Contact::whereNull('read_at')->count()),
  73. 'contact_monthly' => PrettyNumber::convert(Contact::whereNull('read_at')->where('created_at', '>', now()->subMonth())->count()),
  74. 'reports' => PrettyNumber::convert(Report::whereNull('admin_seen')->count()),
  75. 'reports_monthly' => PrettyNumber::convert(Report::whereNull('admin_seen')->where('created_at', '>', now()->subMonth())->count()),
  76. ];
  77. });
  78. }
  79. protected static function additionalData()
  80. {
  81. $ttl = now()->addHours(24);
  82. return Cache::remember('admin:dashboard:home:data:v0:24hr', $ttl, function () {
  83. return [
  84. 'failedjobs' => PrettyNumber::convert(FailedJob::where('failed_at', '>=', \Carbon\Carbon::now()->subDay())->count()),
  85. 'statuses' => PrettyNumber::convert(intval(StatusService::totalLocalStatuses())),
  86. 'statuses_monthly' => PrettyNumber::convert(Status::where('created_at', '>', now()->subMonth())->count()),
  87. 'profiles' => PrettyNumber::convert(Profile::count()),
  88. 'users' => PrettyNumber::convert(User::whereNull('status')->count()),
  89. 'users_monthly' => PrettyNumber::convert(User::where('created_at', '>', now()->subMonth())->whereNull('status')->count()),
  90. 'instances' => PrettyNumber::convert(Instance::count()),
  91. 'media' => PrettyNumber::convert(Media::count()),
  92. 'storage' => Media::sum('size'),
  93. ];
  94. });
  95. }
  96. protected static function additionalDataSummary()
  97. {
  98. $ttl = now()->addHours(24);
  99. return Cache::remember('admin:dashboard:home:data-summary:v0:24hr', $ttl, function () {
  100. return [
  101. 'statuses' => PrettyNumber::convert(intval(StatusService::totalLocalStatuses())),
  102. 'profiles' => PrettyNumber::convert(Profile::count()),
  103. 'users' => PrettyNumber::convert(User::whereNull('status')->count()),
  104. 'instances' => PrettyNumber::convert(Instance::count()),
  105. ];
  106. });
  107. }
  108. protected static function postsGraph()
  109. {
  110. $ttl = now()->addHours(12);
  111. return Cache::remember('admin:dashboard:home:data-postsGraph:v0.1:24hr', $ttl, function () {
  112. $gb = config('database.default') == 'pgsql' ? ['statuses.id', 'created_at'] : DB::raw('Date(created_at)');
  113. $s = Status::selectRaw('Date(created_at) as date, count(statuses.id) as count')
  114. ->where('created_at', '>=', now()->subWeek())
  115. ->groupBy($gb)
  116. ->orderBy('created_at', 'DESC')
  117. ->pluck('count', 'date');
  118. $begin = now()->subWeek();
  119. $end = now();
  120. $interval = new DateInterval('P1D');
  121. $daterange = new DatePeriod($begin, $interval, $end);
  122. $dates = [];
  123. foreach ($daterange as $date) {
  124. $dates[$date->format('Y-m-d')] = 0;
  125. }
  126. $dates = collect($dates)->merge($s);
  127. $s = Status::selectRaw('Date(created_at) as date, count(statuses.id) as count')
  128. ->where('created_at', '>=', now()->subWeeks(2))
  129. ->where('created_at', '<=', now()->subWeeks(1))
  130. ->groupBy($gb)
  131. ->orderBy('created_at', 'DESC')
  132. ->pluck('count', 'date');
  133. $begin = now()->subWeeks(2);
  134. $end = now()->subWeeks(1);
  135. $interval = new DateInterval('P1D');
  136. $daterange = new DatePeriod($begin, $interval, $end);
  137. $lw = [];
  138. foreach ($daterange as $date) {
  139. $lw[$date->format('Y-m-d')] = 0;
  140. }
  141. $lw = collect($lw)->merge($s);
  142. return [
  143. 'posts_this_week' => $dates->values(),
  144. 'posts_last_week' => $lw->values(),
  145. ];
  146. });
  147. }
  148. }