*/ #[NoDiscard] public function getAll(): PaginatedDataCollection { $users = User::query() ->with([ 'roles:id,name', 'roles.apps:id,name', 'roles.permissions:id,name', 'restrictedPermissions', ]) ->orderBy('id') ->paginate(); return UserIndexData::collect($users, PaginatedDataCollection::class); } /** * Get the restricted permission IDs for a user. * * @return array */ public function getRestrictedPermissionIds(int $userId): array { if ($userId <= 0) { return []; } return RestrictedUserPermission::query() ->where('user_id', $userId) ->pluck('permission_id') ->toArray(); } /** * Assign roles to a user. */ public function assignRoles(int $userId, array $roleIds): void { if ($userId <= 0) { throw new InvalidArgumentException('Invalid id'); } DB::transaction(function () use ($userId, $roleIds): void { $user = User::query()->findOrFail($userId); $user->syncRoles($roleIds); }); } /** * Sync restricted permissions for a user. * * @param DataCollection $deactivatedPermissions * * @throws Throwable */ public function syncRestrictedPermissions(int $userId, DataCollection $deactivatedPermissions): void { if ($userId <= 0) { throw new InvalidArgumentException('Invalid user ID'); } $payload = $deactivatedPermissions->toCollection()->map(fn ($data) => [ 'user_id' => $userId, 'role_id' => $data->roleId, 'permission_id' => $data->permissionId, ])->toArray(); DB::transaction(function () use ($userId, $payload): void { RestrictedUserPermission::query() ->where('user_id', $userId) ->delete(); if (! empty($payload)) { RestrictedUserPermission::query()->insert($payload); } }); } /** * @throws InvalidArgumentException when id is invalid. * @throws Throwable when an error occurs during the deletion. */ public function delete(int $id): void { if ($id <= 0) { throw new InvalidArgumentException('Invalid id'); } DB::transaction(function () use ($id): void { User::query()->findOrFail($id)->delete(); }); } }