Public/Set-DuneResourceProvider.ps1

<#
.SYNOPSIS
Update properties of a resource provider.

.DESCRIPTION
Updates editable properties of a `DuneResourceProvider`. Provide the provider by `Id` or supply a `DuneResourceProvider` object via pipeline. Only modified properties are sent to the API. Observes `ShouldProcess`.

.PARAMETER Id
The GUID of the resource provider to update. Use the `Id` parameter set.

.PARAMETER ResourceProvider
A `DuneResourceProvider` object supplied via pipeline to update. Use the `Object` parameter set.

.PARAMETER DisplayName
New display name for the resource provider.

.PARAMETER Description
New description for the resource provider.

.PARAMETER DefaultEnvironment
The default environment (from `Environments` enum) for new resources created by this provider.

.PARAMETER AllowedEnvironments
Array of allowed environments for this resource provider.

.EXAMPLE
PS> Set-DuneResourceProvider -Id 3d8f6b5a-... -DisplayName "Azure Provider"
Updates the display name of the resource provider.

.EXAMPLE
PS> Get-DuneResourceProvider -Name "azure" | Set-DuneResourceProvider -AllowedEnvironments Prod,Dev
Pipeline example updating allowed environments.
#>

function Set-DuneResourceProvider {
    [CmdletBinding(
        SupportsShouldProcess,
        ConfirmImpact = 'None',
        DefaultParameterSetName = "Id"
    )]
    param (
        [Parameter(Mandatory, ParameterSetName = "Id")]
        [guid]$Id,

        [Parameter(Mandatory, ValueFromPipeline, ParameterSetName = "Object")]
        [DuneResourceProvider]$ResourceProvider,

        [Parameter()]
        [string]$DisplayName,

        [Parameter()]
        [string]$Description,

        [Parameter()]
        [Environments]$DefaultEnvironment,

        [Parameter()]
        [Environments[]]$AllowedEnvironments
    )

    begin {}

    process {
        Write-Debug "$($MyInvocation.MyCommand)|process|$($PSCmdlet.ParameterSetName)"
        if ($PSCmdlet.ParameterSetName -eq "Id") {
            $ResourceProvider = Get-DuneResourceProvider -Id $ResourceProvider.Id
        }
        $PropertyUpdates = @()
        $ModifiedProperties = $PSBoundParameters.Keys | Where-Object { $_ -ne "ResourceProvider" }
        if (-not $ModifiedProperties) {
            return
        }
        foreach ($Item in $ModifiedProperties) {
            if ($Item -eq 'DefaultEnvironment') {
                $PSBoundParameters.$Item = $PSBoundParameters.$Item.ToString()
            }
            if (
                ($ResourceProvider | Get-Member -MemberType Property).Name -contains $Item -and
                $PSBoundParameters.$Item -ne $ResourceProvider.$Item
            ) {
                $ResourceProvider.$Item = $PSBoundParameters.$Item
                $PropertyUpdates += $PSBoundParameters.$Item
            }
        }
        if ($PropertyUpdates.Count -gt 0) {
            $Body = ConvertTo-Hashtable $ResourceProvider
            $Uri = 'resourceproviders/{0}' -f $ResourceProvider.Id
            if ($PSCmdlet.ShouldProcess($($PropertyUpdates | ConvertTo-Json -Depth 16 -Compress))) {
                $Null = Invoke-DuneApiRequest -Uri $Uri -Method PUT -Body $Body
            }
        }
    }

    end {}
}