Functions/Private/Commands/Invoke-CommandsRetry.ps1

Function Invoke-CommandsRetry {
    begin {
        $RetryCommands = @()
        $userArray = Get-UserJsonData
        $queuedCommands = Get-JCQueuedCommands
        $SearchFilter = @{
            searchTerm = 'RadiusCert-Install'
            fields     = @('name')
        }
        $commandResults = Search-JcSdkCommandResult -SearchFilter $SearchFilter
        $groupedCommandResults = $commandResults | Sort-Object -Property responseTime -Descending | Group-Object name, SystemId
        $mostRecentCommandResults = $groupedCommandResults | ForEach-Object { $_.Group | Select-Object -First 1 }
    }
    process {
        # Prompt to rerun commands that have failed or expired
        Foreach ($user in ($userArray) | Where-Object { $_.commandAssociations -ne $null }) {
            $userIndex = $userArray.userId.IndexOf($user.userID)
            $failedCommands = $mostRecentCommandResults | Where-Object DataExitCode -NE 0
            $commands = $user.commandAssociations
            # foreach command in the command object
            foreach ($command in $commands) {
                if ($queuedCommands.command -contains $command.commandId) {
                    Write-Host "[status] $($command.commandName) is currently $([char]0x1b)[93mPENDING"
                    continue
                } else {
                    if (($failedCommands.workflowId -contains $command.commandId) -or ($command.commandPreviouslyRun -eq $false) -or ($QueuedCommands.command -notcontains $command.commandId -and $finishedCommands.workflowId -notcontains $command.commandId)) {
                        try {
                            # invoke each user's command on their set systems:
                            invoke-commandByUserid -userID $user.userId
                            # update user table info per command
                            (($user.commandAssociations) | Where-Object { $_.commandId -eq $command.commandId }).commandPreviouslyRun = $true
                            (($user.commandAssociations) | Where-Object { $_.commandId -eq $command.commandId }).commandQueued = $true
                            $user.certInfo.deployed = $true
                            $user.certInfo.deploymentDate = (Get-Date -Format "o")
                            Set-UserTable -index $userIndex -certInfoObject $user.certInfo -commandAssociationsObject $user.commandAssociations
                            # track retried commands
                            $RetryCommands += $command.commandId
                        } catch {
                            Write-Error "$($command.commandName) could not be invoked"
                        }
                    }
                }
            }
        }
    }
    end {
        return $RetryCommands
    }
}