scripts/Copy-PSBicepApiManagementApiWithGUI.ps1

<#
    .Synopsis
        Copy an Api from a source Azure Api Management to a target Azure Api Management interactivelyà
 
    .Description
        Copy an Api from a source Azure Api Management to a target Azure Api Management. It shows
        a menu to help the user to select the source Api and the target Api Management. Ensure to be already logged
        to an Azure subscription using Connect-AzAccount
 
    .Example
        # Copy an Api from a source Api Management to a target one
        Copy-PSBicepApiManagementApiWithGUI
#>

function Copy-PSBicepApiManagementApiWithGUI()
{
    $ErrorActionPreference = 'Stop'

    try{
        Get-AzContext|Out-Null
    }
    catch{
        connect-azAccount|Out-Null
    }

    function Get-ApiManagement($env){
        Get-AzSubscription | Out-ConsoleGridView -Title "Select $env subscription" -OutputMode Single | Set-AzContext | Out-Null

        $Apim = Get-AzApiManagement | ForEach-Object{
            $obj = "" |Select-Object Name,ResourceGroup, Apim
            $obj.Name = $_.Name
            $obj.ResourceGroup = $_.ResourceGroupName
            $obj.apim = $_
            $obj
        } | Out-ConsoleGridView -Title "Select $env Api Management" -OutputMode Single
        if($null -eq $Apim)
        {
            throw "No Api management service selected"
        }
        $Apim.Apim
    }
    $SubscriptionIdFinder = [regex]'^/subscriptions/(.*?)/.*$'

    $sourceApiManagement = Get-ApiManagement -env 'source'
    $sourceSubscriptionId = $SubscriptionIdFinder.Replace($sourceApiManagement.Id,'$1')

    $sourceVersionSet = $null
    $Response = Read-Host -Prompt 'Do you want to export a single Api version or all versions of an Api? [ONE/all]'
    if($response -ne 'all')
    {
        $sourceApimcontext = New-AzApiManagementContext -ResourceId $sourceApiManagement.Id
        $sourceApiobj = Get-AzApiManagementApi -Context $sourceApimcontext | ForEach-Object{
            $obj = "" |Select-Object Name,Path,ApiVersion,ApiId,Api
            $obj.Name = $_.Name
            $obj.Path = $_.Path
            $obj.ApiVersion = $_.ApiVersion
            $obj.ApiId = $_.ApiId
            $obj.Api = $_
            $obj
        } | Out-ConsoleGridView -Title "Select source Api" -OutputMode Single

        if($null -eq $sourceApiobj)
        {
            throw "No Api selected"
        }

        $sourceApi = $sourceApiobj.Api
        $sourceelement = $sourceApi.ApiId
    }
    else{
        $sourceApimcontext = New-AzApiManagementContext -ResourceId $sourceApiManagement.Id
        $sourceVersionSetObj = Get-AzApiManagementApiVersionSet -Context $sourceApimcontext | ForEach-Object{
            $obj = "" |Select-Object Name,VersionSetId
            $obj.Name = $_.DisplayName
            $obj.VersionSetId = $_.ApiVersionSetId
            $obj
        } | Out-ConsoleGridView -Title "Select source Api Version set" -OutputMode Single

        if($null -eq $sourceVersionSetObj)
        {
            throw "No Api version selected"
        }

        $sourceVersionSet = $sourceVersionSetObj
        $sourceelement = $sourceVersionSet.VersionSetId

    }

    $targetFile = "$Env:temp\$($sourceelement).bicep"

    write-host "Source"
    write-host " Api Mamanagement"
    write-host " SubscriptionId: $sourceSubscriptionId"
    write-host " Resource Group: $($sourceApiManagement.ResourceGroupName)"
    write-host " Name: $($sourceApiManagement.Name)"

    if($null -ne $sourceVersionSet){
        write-host " Api version set"
        write-host " Name: $($sourceVersionSet.Name)"
        write-host " Id: $($sourceVersionSet.VersionSetId)"
    }
    else{
        write-host " Api"
        write-host " Name: $($sourceApi.Name)"
        write-host " Version: $($sourceApi.ApiVersion)"
        write-host " Id: $($sourceApi.ApiId)"
    }
    write-host ""
    write-host "Temporary target file: $targetFile"
    write-host ""
    if($null -ne $sourceVersionSet){
        write-host "Executing 'Export-PSBicepApiManagementApiVersionSet -SubscriptionId '$sourceSubscriptionId' -ResourceGroupName '$($sourceApiManagement.ResourceGroupName)' -ApiManagementName '$($sourceApiManagement.Name)' -ApiVersionSetId $($sourceVersionSet.VersionSetId) -TargetFile '$($targetFile)''"
        Export-PSBicepApiManagementApiVersionSet -SubscriptionId $sourceSubscriptionId -ResourceGroupName $sourceApiManagement.ResourceGroupName -ApiManagementName $sourceApiManagement.Name -ApiVersionSetId $sourceVersionSet.VersionSetId -TargetFile $targetFile
    }
    else{
        write-host "Executing 'Export-PSBicepApiManagementApi -SubscriptionId '$sourceSubscriptionId' -ResourceGroupName '$($sourceApiManagement.ResourceGroupName)' -ApiManagementName '$($sourceApiManagement.Name)' -ApiId '$($sourceApi.ApiId)' -TargetFile '$($targetFile)''"
        Export-PSBicepApiManagementApi -SubscriptionId $sourceSubscriptionId -ResourceGroupName $sourceApiManagement.ResourceGroupName -ApiManagementName $sourceApiManagement.Name -ApiId $sourceApi.ApiId -TargetFile $targetFile
    }
    $targetApiManagement = Get-ApiManagement -env 'target'
    $TargetSubscriptionId = $SubscriptionIdFinder.Replace($targetApiManagement.Id,'$1')

    write-host "Target"
    write-host " Api Mamanagement"
    write-host " SubscriptionId: $TargetSubscriptionId"
    write-host " Resource Group: $($targetApiManagement.ResourceGroupName)"
    write-host " Name: $($targetApiManagement.Name)"
    write-host ""

    write-host "Executing 'Import-PSBicepApiManagementApi -SubscriptionId '$TargetSubscriptionId' -ResourceGroupName '$($targetApiManagement.ResourceGroupName)' -ApiManagementName '$($targetApiManagement.Name)' -TargetFile '$($targetFile)''"
    Import-PSBicepApiManagementApi -SubscriptionId $TargetSubscriptionId -ResourceGroupName $targetApiManagement.ResourceGroupName -ApiManagementName $targetApiManagement.Name -TargetFile $targetFile

}