- 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.
148 lines
4.9 KiB
PHP
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);
|
|
}
|
|
}
|