From 6e0d1ef41b774d6bcc6ed50b090a659a1396038e Mon Sep 17 00:00:00 2001 From: Daniel Supernault Date: Wed, 12 Jun 2024 02:58:25 -0600 Subject: [PATCH] Update cache --- app/Http/Controllers/Api/ApiV1Controller.php | 2 +- .../Controllers/Api/InstanceApiController.php | 10 +- app/Http/Controllers/SiteController.php | 4 +- app/Services/AdminStatsService.php | 239 +++++++++--------- app/Services/StatusService.php | 7 + 5 files changed, 133 insertions(+), 129 deletions(-) diff --git a/app/Http/Controllers/Api/ApiV1Controller.php b/app/Http/Controllers/Api/ApiV1Controller.php index 83451b74b..f6f6c6a39 100644 --- a/app/Http/Controllers/Api/ApiV1Controller.php +++ b/app/Http/Controllers/Api/ApiV1Controller.php @@ -1649,7 +1649,7 @@ class ApiV1Controller extends Controller $stats = Cache::remember('api:v1:instance-data:stats', 43200, function () { return [ 'user_count' => User::count(), - 'status_count' => Status::whereNull('uri')->count(), + 'status_count' => StatusService::totalLocalStatuses(), 'domain_count' => Instance::count(), ]; }); diff --git a/app/Http/Controllers/Api/InstanceApiController.php b/app/Http/Controllers/Api/InstanceApiController.php index 6edd27de3..37b597a31 100644 --- a/app/Http/Controllers/Api/InstanceApiController.php +++ b/app/Http/Controllers/Api/InstanceApiController.php @@ -4,8 +4,9 @@ namespace App\Http\Controllers\Api; use Illuminate\Http\Request; use App\Http\Controllers\Controller; -use App\{Profile, Status, User}; +use App\{Profile, Instance, Status, User}; use Cache; +use App\Services\StatusService; class InstanceApiController extends Controller { @@ -40,11 +41,8 @@ class InstanceApiController extends Controller { 'urls' => [], 'stats' => [ 'user_count' => User::count(), - 'status_count' => Status::whereNull('uri')->count(), - 'domain_count' => Profile::whereNotNull('domain') - ->groupBy('domain') - ->pluck('domain') - ->count() + 'status_count' => StatusService::totalLocalStatuses(), + 'domain_count' => Instance::count() ], 'thumbnail' => '', 'languages' => [], diff --git a/app/Http/Controllers/SiteController.php b/app/Http/Controllers/SiteController.php index 5e205d64d..8c13e0b59 100644 --- a/app/Http/Controllers/SiteController.php +++ b/app/Http/Controllers/SiteController.php @@ -5,7 +5,7 @@ namespace App\Http\Controllers; use App\Page; use App\Profile; use App\Services\FollowerService; -use App\Status; +use App\Services\StatusService; use App\User; use App\Util\ActivityPub\Helpers; use App\Util\Localization\Localization; @@ -60,7 +60,7 @@ class SiteController extends Controller { return Cache::remember('site.about_v2', now()->addMinutes(15), function () { $user_count = number_format(User::count()); - $post_count = number_format(Status::count()); + $post_count = number_format(StatusService::totalLocalStatuses()); $rules = config_cache('app.rules') ? json_decode(config_cache('app.rules'), true) : null; return view('site.about', compact('rules', 'user_count', 'post_count'))->render(); diff --git a/app/Services/AdminStatsService.php b/app/Services/AdminStatsService.php index 9e345355a..9acbb3c6e 100644 --- a/app/Services/AdminStatsService.php +++ b/app/Services/AdminStatsService.php @@ -2,47 +2,43 @@ namespace App\Services; -use Cache; -use DB; +use App\Avatar; +use App\Contact; +use App\FailedJob; +use App\Instance; +use App\Media; +use App\Profile; +use App\Report; +use App\Status; +use App\User; use App\Util\Lexer\PrettyNumber; -use App\{ - Avatar, - Contact, - FailedJob, - Hashtag, - Instance, - Media, - Like, - Profile, - Report, - Status, - User -}; -use \DateInterval; -use \DatePeriod; +use Cache; +use DateInterval; +use DatePeriod; +use DB; class AdminStatsService { - public static function get() - { - return array_merge( - self::recentData(), - self::additionalData(), - self::postsGraph() - ); - } - - public static function summary() - { - return array_merge( - self::recentData(), - self::additionalDataSummary(), - ); - } - - public static function storage() + public static function get() { - return Cache::remember('admin:dashboard:storage:stats', 120000, function() { + return array_merge( + self::recentData(), + self::additionalData(), + self::postsGraph() + ); + } + + public static function summary() + { + return array_merge( + self::recentData(), + self::additionalDataSummary(), + ); + } + + public static function storage() + { + return Cache::remember('admin:dashboard:storage:stats', 120000, function () { $res = []; $res['last_updated'] = str_replace('+00:00', 'Z', now()->format(DATE_RFC3339_EXTENDED)); @@ -53,7 +49,7 @@ class AdminStatsService 'count' => $avatars, 'local_count' => $avatarsLocal, 'cloud_count' => ($avatars - $avatarsLocal), - 'total_sum' => Avatar::sum('size') + 'total_sum' => Avatar::sum('size'), ]; $media = Media::count(); @@ -77,97 +73,100 @@ class AdminStatsService }); } - protected static function recentData() - { - $day = config('database.default') == 'pgsql' ? 'DATE_PART(\'day\',' : 'day('; - $ttl = now()->addMinutes(15); - return Cache::remember('admin:dashboard:home:data:v0:15min', $ttl, function() use ($day) { - return [ - 'contact' => PrettyNumber::convert(Contact::whereNull('read_at')->count()), - 'contact_monthly' => PrettyNumber::convert(Contact::whereNull('read_at')->where('created_at', '>', now()->subMonth())->count()), - 'reports' => PrettyNumber::convert(Report::whereNull('admin_seen')->count()), - 'reports_monthly' => PrettyNumber::convert(Report::whereNull('admin_seen')->where('created_at', '>', now()->subMonth())->count()), - ]; - }); - } + protected static function recentData() + { + $day = config('database.default') == 'pgsql' ? 'DATE_PART(\'day\',' : 'day('; + $ttl = now()->addMinutes(15); - protected static function additionalData() - { - $day = config('database.default') == 'pgsql' ? 'DATE_PART(\'day\',' : 'day('; - $ttl = now()->addHours(24); - return Cache::remember('admin:dashboard:home:data:v0:24hr', $ttl, function() use ($day) { - return [ - 'failedjobs' => PrettyNumber::convert(FailedJob::where('failed_at', '>=', \Carbon\Carbon::now()->subDay())->count()), - 'statuses' => PrettyNumber::convert(Status::count()), - 'statuses_monthly' => PrettyNumber::convert(Status::where('created_at', '>', now()->subMonth())->count()), - 'profiles' => PrettyNumber::convert(Profile::count()), - 'users' => PrettyNumber::convert(User::count()), - 'users_monthly' => PrettyNumber::convert(User::where('created_at', '>', now()->subMonth())->count()), - 'instances' => PrettyNumber::convert(Instance::count()), - 'media' => PrettyNumber::convert(Media::count()), - 'storage' => Media::sum('size'), - ]; - }); - } + return Cache::remember('admin:dashboard:home:data:v0:15min', $ttl, function () { + return [ + 'contact' => PrettyNumber::convert(Contact::whereNull('read_at')->count()), + 'contact_monthly' => PrettyNumber::convert(Contact::whereNull('read_at')->where('created_at', '>', now()->subMonth())->count()), + 'reports' => PrettyNumber::convert(Report::whereNull('admin_seen')->count()), + 'reports_monthly' => PrettyNumber::convert(Report::whereNull('admin_seen')->where('created_at', '>', now()->subMonth())->count()), + ]; + }); + } - protected static function additionalDataSummary() - { - $ttl = now()->addHours(24); - return Cache::remember('admin:dashboard:home:data-summary:v0:24hr', $ttl, function() { - return [ - 'statuses' => PrettyNumber::convert(Status::count()), - 'profiles' => PrettyNumber::convert(Profile::count()), - 'users' => PrettyNumber::convert(User::count()), - 'instances' => PrettyNumber::convert(Instance::count()), - ]; - }); - } + protected static function additionalData() + { + $day = config('database.default') == 'pgsql' ? 'DATE_PART(\'day\',' : 'day('; + $ttl = now()->addHours(24); - protected static function postsGraph() - { - $ttl = now()->addHours(12); - return Cache::remember('admin:dashboard:home:data-postsGraph:v0.1:24hr', $ttl, function() { - $gb = config('database.default') == 'pgsql' ? ['statuses.id', 'created_at'] : DB::raw('Date(created_at)'); - $s = Status::selectRaw('Date(created_at) as date, count(statuses.id) as count') - ->where('created_at', '>=', now()->subWeek()) - ->groupBy($gb) - ->orderBy('created_at', 'DESC') - ->pluck('count', 'date'); + return Cache::remember('admin:dashboard:home:data:v0:24hr', $ttl, function () { + return [ + 'failedjobs' => PrettyNumber::convert(FailedJob::where('failed_at', '>=', \Carbon\Carbon::now()->subDay())->count()), + 'statuses' => PrettyNumber::convert(intval(StatusService::totalLocalStatuses())), + 'statuses_monthly' => PrettyNumber::convert(Status::where('created_at', '>', now()->subMonth())->count()), + 'profiles' => PrettyNumber::convert(Profile::count()), + 'users' => PrettyNumber::convert(User::count()), + 'users_monthly' => PrettyNumber::convert(User::where('created_at', '>', now()->subMonth())->count()), + 'instances' => PrettyNumber::convert(Instance::count()), + 'media' => PrettyNumber::convert(Media::count()), + 'storage' => Media::sum('size'), + ]; + }); + } - $begin = now()->subWeek(); - $end = now(); - $interval = new DateInterval('P1D'); - $daterange = new DatePeriod($begin, $interval ,$end); - $dates = []; - foreach($daterange as $date){ - $dates[$date->format("Y-m-d")] = 0; - } + protected static function additionalDataSummary() + { + $ttl = now()->addHours(24); - $dates = collect($dates)->merge($s); + return Cache::remember('admin:dashboard:home:data-summary:v0:24hr', $ttl, function () { + return [ + 'statuses' => PrettyNumber::convert(intval(StatusService::totalLocalStatuses())), + 'profiles' => PrettyNumber::convert(Profile::count()), + 'users' => PrettyNumber::convert(User::count()), + 'instances' => PrettyNumber::convert(Instance::count()), + ]; + }); + } - $s = Status::selectRaw('Date(created_at) as date, count(statuses.id) as count') - ->where('created_at', '>=', now()->subWeeks(2)) - ->where('created_at', '<=', now()->subWeeks(1)) - ->groupBy($gb) - ->orderBy('created_at', 'DESC') - ->pluck('count', 'date'); + protected static function postsGraph() + { + $ttl = now()->addHours(12); - $begin = now()->subWeeks(2); - $end = now()->subWeeks(1); - $interval = new DateInterval('P1D'); - $daterange = new DatePeriod($begin, $interval ,$end); - $lw = []; - foreach($daterange as $date){ - $lw[$date->format("Y-m-d")] = 0; - } + return Cache::remember('admin:dashboard:home:data-postsGraph:v0.1:24hr', $ttl, function () { + $gb = config('database.default') == 'pgsql' ? ['statuses.id', 'created_at'] : DB::raw('Date(created_at)'); + $s = Status::selectRaw('Date(created_at) as date, count(statuses.id) as count') + ->where('created_at', '>=', now()->subWeek()) + ->groupBy($gb) + ->orderBy('created_at', 'DESC') + ->pluck('count', 'date'); - $lw = collect($lw)->merge($s); + $begin = now()->subWeek(); + $end = now(); + $interval = new DateInterval('P1D'); + $daterange = new DatePeriod($begin, $interval, $end); + $dates = []; + foreach ($daterange as $date) { + $dates[$date->format('Y-m-d')] = 0; + } - return [ - 'posts_this_week' => $dates->values(), - 'posts_last_week' => $lw->values(), - ]; - }); - } + $dates = collect($dates)->merge($s); + $s = Status::selectRaw('Date(created_at) as date, count(statuses.id) as count') + ->where('created_at', '>=', now()->subWeeks(2)) + ->where('created_at', '<=', now()->subWeeks(1)) + ->groupBy($gb) + ->orderBy('created_at', 'DESC') + ->pluck('count', 'date'); + + $begin = now()->subWeeks(2); + $end = now()->subWeeks(1); + $interval = new DateInterval('P1D'); + $daterange = new DatePeriod($begin, $interval, $end); + $lw = []; + foreach ($daterange as $date) { + $lw[$date->format('Y-m-d')] = 0; + } + + $lw = collect($lw)->merge($s); + + return [ + 'posts_this_week' => $dates->values(), + 'posts_last_week' => $lw->values(), + ]; + }); + } } diff --git a/app/Services/StatusService.php b/app/Services/StatusService.php index 4051bede4..44f33fcb9 100644 --- a/app/Services/StatusService.php +++ b/app/Services/StatusService.php @@ -191,4 +191,11 @@ class StatusService BookmarkService::get($pid, $id) : false; } + + public static function totalLocalStatuses() + { + return Cache::remember(self::CACHE_KEY . 'totalpub', 14400, function() { + return Status::whereNull('url')->count(); + }); + } }