singleloginsystem/app/Services/AdminDashboardService.php
= 1a7134419c Refactor: Improve dependency injection for dashboard components and enhance SAML logging
- Removed inline data definitions from multiple dashboard components for roles, users, and connected apps, replacing them with service-based computed properties.
- Added comprehensive debug and error-level logging throughout `SamlIdpService` and related controllers to improve traceability of SAML flows.
- Cleaned up and centralized SAML-related logic, improving maintainability and error handling consistency.
- Deleted unused `hr-permission.blade.php` component to reduce code redundancy.
2026-06-01 13:05:59 +00:00

148 lines
4.9 KiB
PHP

<?php
declare(strict_types=1);
namespace App\Services;
use App\Data\Ui\Dashboard\{DashboardStatsData, LatestUserData};
use App\Data\Ui\ManageRoles\{RoleData, ServiceData};
use App\Data\Users\UserData;
use App\Enums\RolesStatusEnum;
use App\Models\{ConnectedApp, RestrictedUserPermission, Role, User};
use Spatie\LaravelData\DataCollection;
final class AdminDashboardService
{
/**
* Get statistics for the dashboard.
*/
public function getStats(): DashboardStatsData
{
$totalUsers = User::query()->count();
$activeRoles = Role::query()->count();
$servicesCount = ConnectedApp::query()->count();
$revokedTodayCount = RestrictedUserPermission::query()
->whereDate('created_at', today())
->count();
return new DashboardStatsData(
totalUsers: $totalUsers,
activeRoles: $activeRoles,
servicesCount: $servicesCount,
revokedTodayCount: $revokedTodayCount,
);
}
/**
* Get all roles mapped to DTOs for the roles manager.
*
* @return DataCollection<int, RoleData>
*/
public function getRoles(): DataCollection
{
$roles = Role::query()
->visible()
->with(['users', 'apps'])
->get();
$mappedRoles = $roles->map(function ($role) {
/** @var Role $role */
/** @var \Illuminate\Database\Eloquent\Collection<int, User> $users */
$users = $role->users;
/** @var \Illuminate\Database\Eloquent\Collection<int, ConnectedApp> $apps */
$apps = $role->apps;
return new RoleData(
name: $role->name,
users: UserData::collect($users->map(fn ($user) => new UserData(
name: $user->name,
email: $user->email,
active: true,
)), DataCollection::class),
services: ServiceData::collect($apps->map(fn ($app) => new ServiceData(
name: $app->name,
)), DataCollection::class),
status: RolesStatusEnum::Active,
);
});
return RoleData::collect($mappedRoles, DataCollection::class);
}
/**
* Get the latest registered users.
*
* @return DataCollection<int, LatestUserData>
*/
public function getLatestUsers(): DataCollection
{
$users = User::query()
->with(['roles'])
->orderBy('created_at', 'desc')
->take(5)
->get();
$mappedUsers = $users->map(function ($user) {
/** @var User $user */
/** @var \Illuminate\Database\Eloquent\Collection<int, Role> $roles */
$roles = $user->roles;
return new LatestUserData(
name: $user->name,
email: $user->email,
initials: $user->initials(),
registeredAt: $user->created_at ? $user->created_at->diffForHumans() : 'unknown',
roles: RoleData::collect($roles->map(fn ($role) => new RoleData(
name: $role->name,
users: UserData::collect([], DataCollection::class),
services: ServiceData::collect([], DataCollection::class),
status: RolesStatusEnum::Active,
)), DataCollection::class),
);
});
return LatestUserData::collect($mappedUsers, DataCollection::class);
}
/**
* Get all user role and service assignments.
*
* @return DataCollection<int, UserData>
*/
public function getUserAssignments(): DataCollection
{
$users = User::query()
->with(['roles.apps'])
->orderBy('id')
->get();
$mappedUsers = $users->map(function ($user) {
/** @var User $user */
/** @var \Illuminate\Database\Eloquent\Collection<int, Role> $roles */
$roles = $user->roles;
return new UserData(
name: $user->name,
email: $user->email,
active: true,
roles: RoleData::collect($roles->map(function ($role) {
/** @var Role $role */
/** @var \Illuminate\Database\Eloquent\Collection<int, ConnectedApp> $apps */
$apps = $role->apps;
return new RoleData(
name: $role->name,
users: UserData::collect([], DataCollection::class),
services: ServiceData::collect($apps->map(fn ($app) => new ServiceData(
name: $app->name,
)), DataCollection::class),
status: RolesStatusEnum::Active,
);
}), DataCollection::class),
);
});
return UserData::collect($mappedUsers, DataCollection::class);
}
}