Public/Set-SPSAeriesConfiguration.ps1

Function Set-SPSAeriesConfiguration{
    <#
    .SYNOPSIS
        Set the configuration to use for the SPSAeries Module
    .DESCRIPTION
        Set the configuration to use for the SPSAeries Module
    .EXAMPLE
        Set-SPSAeriesConfiguration -Name SchoolName
        Set the configuration to SchoolName
    .PARAMETER
    .INPUTS
    .OUTPUTS
    .NOTES
    .LINK
    #>

        [CmdletBinding()] #Enable all the default paramters, including -Verbose
        Param(
            [Parameter(Mandatory=$true,
                ValueFromPipeline=$true,
                ValueFromPipelineByPropertyName=$true,
                # HelpMessage='HelpMessage',
                Position=0)]
            [String]$Name
        )
    
        Begin{
            Write-Verbose -Message "Starting $($MyInvocation.InvocationName) with $($PsCmdlet.ParameterSetName) parameterset..."
            Write-Verbose -Message "Parameters are $($PSBoundParameters | Select-Object -Property *)"
            
        }
        Process{
            # Retry logic for the entire configuration process
            $maxRetries = 5
            $retryDelaySeconds = 5
            $attempt = 0
            $maxAttempts = $maxRetries + 1
            $configSuccess = $false
            
            while (-not $configSuccess -and $attempt -lt $maxAttempts) {
                $attempt++
                
                try {
                    if ($attempt -gt 1) {
                        Write-Verbose "Retry attempt $($attempt - 1) of $maxRetries after waiting $retryDelaySeconds seconds..."
                        Start-Sleep -Seconds $retryDelaySeconds
                    }
                    
                    Write-Verbose -Message "Changing Config from $($Script:SPSAeriesConfigName) to $($Name) (Attempt $attempt of $maxAttempts)"
                    $Script:SPSAeriesConfigName = $Name

                    $Script:SPSAeriesConfigDir = "$Env:USERPROFILE\AppData\Local\powershell\SPSAeries\$Name"
                    Write-Verbose -Message "Config dir: $SPSAeriesConfigDir"

                    $Script:Config = Get-Content -Raw -Path "$Script:SPSAeriesConfigDir\config.json" | ConvertFrom-Json
                    Write-Verbose -Message "Importing config.json"

                    $Script:APIKey = Import-Clixml -Path "$Script:SPSAeriesConfigDir\apikey.xml"
                    Write-Verbose -Message "Importing apikey.xml"

                    $Script:SQLCreds = Import-Clixml -Path "$Script:SPSAeriesConfigDir\sqlcreds.xml"
                    Write-Verbose -Message "Importing sqlcreds.xml"

                    Write-Verbose "Config: $Config"
                    Write-Verbose "URL: $($Config.APIURL)"

                    # Initializes the official AeriesApi module
                    Write-Verbose "Initializing AeriesApi..."
                    Initialize-AeriesApi -URL $Config.APIURL -Certificate $APIKey.GetNetworkCredential().Password
                    Write-Verbose "AeriesApi initialized successfully."

                    # Create URL Path after initialization so we have the root API url in case we need to make any unique API calls of our own
                    $uri = New-Object System.Uri($Config.APIURL)
                    $Script:Config.APIURL = New-Object System.Uri($uri, "api/v5/")
                    
                    # If we reach here, configuration was successful
                    $configSuccess = $true
                    Write-Verbose "Configuration '$Name' set successfully."
                }
                catch {
                    if ($attempt -lt $maxAttempts) {
                        Write-Verbose "Error setting configuration: $($_.Exception.Message). Retrying... (Attempt $attempt of $maxAttempts)"
                    } else {
                        # Final attempt failed, throw a detailed error
                        $errorMessage = "Failed to set Aeries configuration for '$Name' after $maxRetries retry attempts: $($_.Exception.Message)"
                        if ($_.Exception.InnerException) {
                            $errorMessage += "`nInner Exception: $($_.Exception.InnerException.Message)"
                        }
                        Write-Error -Message $errorMessage -ErrorAction Stop
                    }
                }
            }
        }
        End{
            Write-Verbose -Message "Ending $($MyInvocation.InvocationName)..."
        }
    }