Framework/Core/SVT/AzureDevOpsResourceResolver.ps1

Set-StrictMode -Version Latest

class AzureDevOpsResourceResolver: Resolver
{
    [SVTResource[]] $SVTResources = @();
    [string] $ResourcePath;
    [string] $organizationName
    hidden [string[]] $ProjectNames = @();
    hidden [string[]] $BuildNames = @();
    hidden [string[]] $ReleaseNames = @();
    [int] $SVTResourcesFoundCount=0;
    AzureDevOpsResourceResolver([string]$organizationName,$ProjectNames,$BuildNames,$ReleaseNames): Base($organizationName)
    {
        $this.organizationName = $organizationName

        if(-not [string]::IsNullOrEmpty($ProjectNames))
        {
            $this.ProjectNames += $this.ConvertToStringArray($ProjectNames);

            if ($this.ProjectNames.Count -eq 0)
            {
                throw [SuppressedException] "The parameter 'ProjectNames' does not contain any string."
            }
        }    

        if(-not [string]::IsNullOrEmpty($BuildNames))
        {
            $this.BuildNames += $this.ConvertToStringArray($BuildNames);
            if ($this.BuildNames.Count -eq 0)
            {
                throw [SuppressedException] "The parameter 'BuildNames' does not contain any string."
            }
        }

        if(-not [string]::IsNullOrEmpty($ReleaseNames))
        {
            $this.ReleaseNames += $this.ConvertToStringArray($ReleaseNames);
            if ($this.ReleaseNames.Count -eq 0)
            {
                throw [SuppressedException] "The parameter 'ReleaseNames' does not contain any string."
            }
        }
    }

    [void] LoadAzureResources()
    {
        
        #Call APIS for Organization,User/Builds/Releases/ServiceConnections
        #Select Org/User by default...
        $svtResource = [SVTResource]::new();
        $svtResource.ResourceName = $this.organizationName;
        $svtResource.ResourceType = "AzureDevOps.Organization";
        $svtResource.ResourceId = "Organization/$($this.organizationName)/"
        $svtResource.ResourceTypeMapping = ([SVTMapping]::AzSKDevOpsResourceMapping |
                                        Where-Object { $_.ResourceType -eq $svtResource.ResourceType } |
                                        Select-Object -First 1)
        $this.SVTResources +=$svtResource

        $svtResource = [SVTResource]::new();
        $svtResource.ResourceName = $this.organizationName;
        $svtResource.ResourceType = "AzureDevOps.User";
        $svtResource.ResourceId = "Organization/$($this.organizationName)/User"
        $svtResource.ResourceTypeMapping = ([SVTMapping]::AzSKDevOpsResourceMapping |
                                        Where-Object { $_.ResourceType -eq $svtResource.ResourceType } |
                                        Select-Object -First 1)
        $this.SVTResources +=$svtResource

        #Get project resources
        $apiURL = "https://dev.azure.com/{0}/_apis/projects?api-version=4.1" -f $($this.SubscriptionContext.SubscriptionName);
        $responseObj = [WebRequestHelper]::InvokeGetWebRequest($apiURL) ;

        $responseObj  | Where-Object { $this.ProjectNames.Count -eq 0 -or $this.ProjectNames -contains $_.name  } | ForEach-Object {
            $projectName = $_.name
            $svtResource = [SVTResource]::new();
            $svtResource.ResourceName = $_.name;
            $svtResource.ResourceGroupName = $this.organizationName
            $svtResource.ResourceType = "AzureDevOps.Project";
            $svtResource.ResourceId = $_.url
            $svtResource.ResourceTypeMapping = ([SVTMapping]::AzSKDevOpsResourceMapping |
                                            Where-Object { $_.ResourceType -eq $svtResource.ResourceType } |
                                            Select-Object -First 1)
            
            $this.SVTResources +=$svtResource

            $serviceEndpointURL = "https://dev.azure.com/{0}/{1}/_apis/serviceendpoint/endpoints?api-version=4.1-preview.1" -f $($this.organizationName),$($projectName);
            $serviceEndpointObj = [WebRequestHelper]::InvokeGetWebRequest($serviceEndpointURL)
            
            if(([Helpers]::CheckMember($serviceEndpointObj,"count") -and $serviceEndpointObj[0].count -gt 0) -or  (($serviceEndpointObj | Measure-Object).Count -gt 0 -and [Helpers]::CheckMember($serviceEndpointObj[0],"name")))
            {
                $svtResource = [SVTResource]::new();
                $svtResource.ResourceName = "ServiceConnections";
                $svtResource.ResourceGroupName =$_.name;
                $svtResource.ResourceType = "AzureDevOps.ServiceConnection";
                $svtResource.ResourceId = "Organization/$($this.organizationName)/Project/ServiceConnection"
                $svtResource.ResourceTypeMapping = ([SVTMapping]::AzSKDevOpsResourceMapping |
                                                Where-Object { $_.ResourceType -eq $svtResource.ResourceType } |
                                                Select-Object -First 1)
                $this.SVTResources +=$svtResource
            }

            $buildDefnURL = "https://dev.azure.com/{0}/{1}/_apis/build/definitions?api-version=4.1" -f $($this.SubscriptionContext.SubscriptionName), $_.name;
            $buildDefnsObj = [WebRequestHelper]::InvokeGetWebRequest($buildDefnURL) 
            if(([Helpers]::CheckMember($buildDefnsObj,"count") -and $buildDefnsObj[0].count -gt 0) -or  (($buildDefnsObj | Measure-Object).Count -gt 0 -and [Helpers]::CheckMember($buildDefnsObj[0],"name")))
            {
                $buildDefnsObj | Where-Object { $this.BuildNames.Count -eq 0 -or $this.BuildNames -contains $_.name  } | ForEach-Object {
                    $svtResource = [SVTResource]::new();
                    $svtResource.ResourceName = $_.name;
                    $svtResource.ResourceGroupName =$_.project.name;
                    $svtResource.ResourceType = "AzureDevOps.Build";
                    $svtResource.ResourceId = $_.url
                    $svtResource.ResourceTypeMapping = ([SVTMapping]::AzSKDevOpsResourceMapping |
                                                    Where-Object { $_.ResourceType -eq $svtResource.ResourceType } |
                                                    Select-Object -First 1)
                    $this.SVTResources +=$svtResource
                }
            }       

            $releaseDefnURL = "https://vsrm.dev.azure.com/{0}/{1}/_apis/release/definitions?api-version=4.1-preview.3" -f $($this.SubscriptionContext.SubscriptionName), $_.name;
            $releaseDefnsObj = [WebRequestHelper]::InvokeGetWebRequest($releaseDefnURL);
            if(([Helpers]::CheckMember($releaseDefnsObj,"count") -and $releaseDefnsObj[0].count -gt 0) -or  (($releaseDefnsObj | Measure-Object).Count -gt 0 -and [Helpers]::CheckMember($releaseDefnsObj[0],"name")))
            {
                $releaseDefnsObj | Where-Object { $this.ReleaseNames.Count -eq 0 -or $this.ReleaseNames -contains $_.name  } | ForEach-Object {
                    $svtResource = [SVTResource]::new();
                    $svtResource.ResourceName = $_.name;
                    $svtResource.ResourceGroupName =$projectName;
                    $svtResource.ResourceType = "AzureDevOps.Release";
                    $svtResource.ResourceId = $_.url
                    $svtResource.ResourceTypeMapping = ([SVTMapping]::AzSKDevOpsResourceMapping |
                                                    Where-Object { $_.ResourceType -eq $svtResource.ResourceType } |
                                                    Select-Object -First 1)
                    $this.SVTResources +=$svtResource
                }
            }        
        }
        $this.SVTResourcesFoundCount = $this.SVTResources.Count
    }
}