FastTrack-TransactionQuery.psm1

<#
    GDPR Transaction Query for determining the status of a request created through the MSFT GDPR REST API's
#>

Add-Type -AssemblyName System.Web -ErrorAction SilentlyContinue

Function Get-ResponseError {
    param([System.Net.HttpWebResponse]$Response)
    $streamReader = New-Object System.IO.StreamReader($Response.GetResponseStream())
    $streamReader.BaseStream.Position = 0
    $streamReader.DiscardBufferedData()
    $body = ConvertFrom-Json($streamReader.ReadToEnd())
    Add-Member -InputObject $body -MemberType NoteProperty -Name "StatusCode" -Value $_.Exception.Response.StatusCode
    $body
}
Function Invoke-GetRequest {
    param([String]$Uri, [hashtable]$Headers)
    $response = try {
        Invoke-RestMethod -Method GET -Uri $Uri -ContentType 'application/json' -Headers $Headers
    } catch {
        Get-ResponseError $_.Exception.Response
    }

    return $response
}

function Eval-StatusValue
{
    param
    (
        [int] $status
    )
    $returnStatus = ""
    switch($status)
    {
        0 { $returnStatus = "Created" }
        1 { $returnStatus = "Completed" }
        2 { $returnStatus = "Failed" }
        3 { $returnStatus = "InProgress" }
        4 { $returnStatus = "OnHold" }
    }
    return $returnStatus
}

<#
.SYNOPSIS
    Get status of submitted transaction(s)
.DESCRIPTION
    This cmdlet gets the status of a single transaction, or all transactions submitted for your organization.
 
    In order to use this cmdlet, you must first login using the Login-FastTrackAcount cmdlet.
     
    To get the status of a single transaction, submit the transazcion ID with the -TransactionId parameter.
    To get all transactions for your organization, leave out the -TransactionId parameter.
.PARAMETER TransactionID
    Transaction Id to get the status. Leave parameter empty to get all transactions.
#>

Function Get-FastTrackMigrationTransactionStatus {
    param
        (
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [string] $TransactionID,
            [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
            [ValidateSet("dev","uat","prod")]
            [string] $EnvironmentMode = "prod"
        )

        if($global:MsoAdminProperties.Count -eq 0)
        {
            Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function."
            return    
        }

        try
        {
            [string] $ApiKey = $global:MsftApiKey
            $header = @{}
            $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)
            $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
            $header.Add("Accept","application/json")
            $query = ""

            if ($TransactionID -ne [string]::Empty)
            {
                $query += "transactionId=$TransactionID&environmentType=$global:MsoComOrGov"
            }
            else
            {
                $query += "environmentType=$global:MsoComOrGov"
            }

            if($EnvironmentMode -eq "UAT")
            {
                #$transactionStatus = Invoke-GetRequest -Uri ([string]::Format("https://msft-csi-{0}.azurewebsites.net/api/transaction/{1}/Details",$EnvironmentMode, $TransactionID)) -Headers $header
                $transactionStatus = Invoke-GetRequest -Uri ([string]::Format("https://msft-csi-{0}.azurewebsites.net/api/{1}/transactions?$query",$EnvironmentMode, $global:MsoAdminProperties["MSO-CompanyTenantInfo"])) -Headers $header
            }
            else
            {
                #$transactionStatus = Invoke-GetRequest -Uri ([string]::Format("https://msft-cssp-{0}.azurewebsites.net/api/transaction/{1}/Details", $EnvironmentMode, $TransactionID)) -Headers:$header
                $transactionStatus = Invoke-GetRequest -Uri ([string]::Format("https://msft-cssp-{0}.azurewebsites.net/api/{1}/transactions?$query", $EnvironmentMode, $global:MsoAdminProperties["MSO-CompanyTenantInfo"])) -Headers:$header
            }
            
            if($transactionStatus -eq $null -or $transactionStatus -eq 'null')
            {
                Write-Warning "Transaction ID $TransactionID was not found"
            }
            else
            {
                Foreach ($i in $transactionStatus)
                {                    
                    $i.Status = (Eval-StatusValue -status:$i.Status)                            
                }
                return $transactionStatus    
            }
        }
        catch
        {
            Write-Error $_.Exception.ToString()
        }
}

function Get-FastTrackTransactionDetail {
    param (
        [Parameter(Mandatory = $true, ValueFromPipeline = $true)]
        [string] $TransactionID,
        [Parameter(Mandatory=$false,ValueFromPipeline=$true)]
        [string] $EnvironmentMode
        )

    if($global:MsoAdminProperties.Count -eq 0)
        {
            Write-Warning "Unable to retrieve Office 365 credentials! :: Please call [Login-FastTrackAccount] function."
            Exit
        }

    [string] $ApiKey = $global:MsftApiKey

    $header = @{}
    $header.Add("API_KEY", $ApiKey)
    $header.Add("ACCESS_TOKEN",$global:MsftAccessToken)
    $header.Add("TENANT_ID",$global:MsoAdminProperties["MSO-CompanyTenantInfo"])
    Write-Host "Sending Transaction Request..."

    $response = Invoke-GetRequest -Uri ([System.String]::Format("https://msft-cssp-{0}.azurewebsites.net/api/transaction/{1}/html", $EnvironmentMode, $TransactionID)) -Headers $header

    if($response.StatusCode -ne $null)
    {
        # Error?
        Write-Warning "Request failed! : $($response.StatusCode) - Error Message: $($response)"
    }
    else
    {
        Write-Host "Get request completed"
    }

    return $response
}