Files
Atomcms-edit/app/Http/Controllers/User/ProfileController.php
T
root 1acd96b78a Optimize queries: fix N+1, SELECT *, and missing eager loading
N+1 fixes:
- Add withCount('furniture') to rare categories sidebar (prevents N queries)
- Add tags and user.permission eager load in ArticleController
- Add rooms and photos.user eager load in ProfileController
- Add user eager load in MediaApiController (API was returning null user data)

SELECT * fixes:
- Replace WebsitePermission::all()->pluck() with direct pluck()
- Replace WebsiteHousekeepingPermission::all()->pluck() with direct pluck()
- Add select(['id', 'public_name']) to ItemBase query in furniItems()
- Add select(['id', 'name']) to help categories query
- Add select(['id', 'name', 'code']) to languages query

Memory/performance:
- Replace full collection load with aggregate queries in getRareStatistics()
- Add limit(50) to open tickets query in TicketController
2026-06-29 18:50:32 +02:00

84 lines
2.7 KiB
PHP
Executable File

<?php
namespace App\Http\Controllers\User;
use App\Http\Controllers\Controller;
use App\Models\Miscellaneous\WebsiteSetting;
use App\Models\User;
use Illuminate\Contracts\View\View;
use Illuminate\Support\Carbon;
class ProfileController extends Controller
{
public function __invoke(User $user): View
{
$user->load([
'friends.friend:id,username,look',
'guilds.guild:id,name,badge',
'profileGuestbook.user:id,username,look',
'photos.user:id,username,look',
'rooms',
'badges',
]);
$settings = WebsiteSetting::whereIn('key', ['profile_show_stats', 'profile_show_online_status'])
->pluck('value', 'key');
$showStats = (bool) ($settings['profile_show_stats'] ?? '1');
$showOnline = (bool) ($settings['profile_show_online_status'] ?? '1');
return view('user.profile', [
'user' => $user,
'friends' => $user->friends->take(10),
'groups' => $user->guilds->take(5),
'guestbook' => $user->profileGuestbook->take(5),
'photos' => $user->photos->take(3),
'badges' => $user->badges->take(3),
'showStats' => $showStats,
'showOnline' => $showOnline,
'accountAge' => $this->getAccountAge($user->account_created),
'lastLogin' => $this->getLastLogin($user->last_login),
'totalFriends' => $user->friends()->count(),
'totalGuilds' => $user->guilds()->count(),
]);
}
private function getAccountAge(int $timestamp): string
{
$created = Carbon::createFromTimestamp($timestamp);
if ($created->diffInYears() >= 1) {
return $created->diffInYears() . ' ' . str('year')->plural($created->diffInYears());
}
if ($created->diffInMonths() >= 1) {
return $created->diffInMonths() . ' ' . str('month')->plural($created->diffInMonths());
}
if ($created->diffInWeeks() >= 1) {
return $created->diffInWeeks() . ' ' . str('week')->plural($created->diffInWeeks());
}
return $created->diffInDays() . ' ' . str('day')->plural($created->diffInDays());
}
private function getLastLogin(int $timestamp): string
{
$lastLogin = Carbon::createFromTimestamp($timestamp);
$diffInMinutes = $lastLogin->diffInMinutes();
if ($diffInMinutes < 1) {
return 'Just now';
}
if ($diffInMinutes < 60) {
return $lastLogin->diffForHumans();
}
if ($diffInMinutes < 10080) {
return $lastLogin->diffForHumans();
}
return $lastLogin->format('d M Y');
}
}