AdminStatsService.php 5.5 KB

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