Module/Include/DevOpsHelper.ps1

function Get-DevOpsActivityOrganisation {
    param (
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Organisation,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]$Project,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]$Repository,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]$PATToken
    )
    $Projects = GetProjectsInOrganisation -Organisation $Organisation -PATToken $PATToken

    $Output = @()
    $Current = 0;
    
    foreach ($nProject in $Projects) {
        $Current += 1
        $Done = ($Current / $Projects.Count) * 100
        $Done = ([Math]::Round($Done, 0))

        if ($Project -ne '') {
            if ($nProject.name -ne $Project) {
                continue;
            }
        }

        $Repositories = GetRepositorysForProject -Organisation $Organisation -Project $nProject.name -PATToken $PATToken

        Write-Progress -Activity ("Collecting commit activity for Organisation {0}" -f $Organisation) -Status "$Done% Complete:" -PercentComplete $Done
        
        foreach ($nRepository in $Repositories) {
            if ($Repository -ne '') {
                if ($nRepository.name -ne $Repositoriy) {
                    continue;
                }
            }

            $Commits = GetCommitsFromRepository -Organisation $Organisation -Project $nProject.name -RepositoryId $nRepository.id -PATToken $PATToken
            $Commit = $Commits | Select-Object -First 1
            
            $CommitCount = $Commits | Measure-Object -Maximum

            $item = New-Object PSObject
            $item | Add-Member -type NoteProperty -Name 'Project' -Value $nProject.name;
            $item | Add-Member -type NoteProperty -Name 'Repository' -Value $nRepository.name;        
            $item | Add-Member -type NoteProperty -Name 'Id' -Value $commit.Id;
            $item | Add-Member -type NoteProperty -Name 'Author' -Value $Commit.Author;
            $item | Add-Member -type NoteProperty -Name 'Date' -Value $Commit.Date;
            $item | Add-Member -type NoteProperty -Name 'CommitCount' -Value $CommitCount.Count;

            if (-not $Commit.Id -eq '') {
                $Output += $item
            }

            Write-Progress -Activity ("Collecting commit activity for Organisation {0}" -f $Organisation) -Status "$Done% Complete:" -PercentComplete $Done
        }  
    }
    $Output
}
function GetProjectsInOrganisation {
    param (
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Organisation,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]$PATToken
    )

    $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken
    
    $Parameters = @{
        Method      = "GET"
        Uri         = "https://dev.azure.com/$Organisation/_apis/projects?api-version=6.0"
        Headers     = $Header
        ContentType = "application/json"
        Body        = $BodyJson
    }
    
    $results = Invoke-RestMethod @Parameters

    $value = $results | Select-Object -Property value | ConvertTo-Json
    $projects = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value
    return($projects)

    #$value = $results | Select-Object -Property value | ConvertTo-Json
    #$projects = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value
    
    #$projects | Select-Object -Property name, id | Sort-Object -Property lastUpdateTime -Descending
}

function GetRepositorysForProject {
    param (
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Organisation,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Project,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]$Repository,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]$PATToken
    )

    $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken
    
    $Parameters = @{
        Method      = "GET"
        Uri         = "https://dev.azure.com/$Organisation/$Project/_apis/git/repositories?api-version=6.1-preview.1"
        Headers     = $Header
        ContentType = "application/json"
        Body        = $BodyJson
    }
    
    
    $results = Invoke-RestMethod @Parameters
    $value = $results | Select-Object -Property value | ConvertTo-Json
    $repos = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value
    return($repos)
}

function GetCommitsFromRepository {
    Param (
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Organisation,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Project,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$RepositoryId,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $false)]
        [string]$PATToken
    )

    $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken
    
    $Parameters = @{
        Method      = "GET"
        Uri         = "https://dev.azure.com/$Organisation/$Project/_apis/git/repositories/$RepositoryId/commits?api-version=6.1-preview.1"
        Headers     = $Header
        ContentType = "application/json"
        Body        = $BodyJson
    }

    $commits = @()
    $results = Invoke-RestMethod @Parameters
    $value = $results | Select-Object -Property value | ConvertTo-Json
    $repoCommits = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value

    foreach ($commit in $repoCommits) {
        $commitdata = $commit.author | ConvertFrom-String -Delimiter ';'
    
        $commitauthor = $commitdata.P1 | ConvertFrom-String -Delimiter '='
        $commitauthor = $commitauthor.P2.TrimStart('@{');

        $commitdate = $commitdata.P3 | ConvertFrom-String -Delimiter '='
        $commitdate = $commitdate.P2.TrimEnd('}')
        $commitdate = [DateTime]$commitdate
        $commitdate = $commitdate.ToShortDateString()

        $item = New-Object PSObject
        $item | Add-Member -type NoteProperty -Name 'Project' -Value $Project;
        $item | Add-Member -type NoteProperty -Name 'RepositoryId' -Value $RepositoryId;        
        $item | Add-Member -type NoteProperty -Name 'Id' -Value $commit.commitId;
        $item | Add-Member -type NoteProperty -Name 'Author' -Value $commitauthor;
        $item | Add-Member -type NoteProperty -Name 'Date' -Value $commitdate;
        $item | Add-Member -type NoteProperty -Name 'Comment' -Value $commit.comment;

        $commits += $item        
    }
    return($commits);
}

function Get-ProjectServiceEndpoints {
    param (
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Organisation,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Project,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$PATToken
    )

    $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken
    
    $Parameters = @{
        Method      = "GET"
        Uri         = "https://dev.azure.com/$Organisation/$Project/_apis/serviceendpoint/endpoints?api-version=6.0-preview.4"
        Headers     = $Header
        ContentType = "application/json"
        Body        = $BodyJson
    }
    
    $results = Invoke-RestMethod @Parameters
    $value = $results | Select-Object -Property value | ConvertTo-Json
    $result = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value
    return($result)
}

function New-ProjectGitHubServiceEndpoint {
    param (
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Organisation,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Project,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$PATToken
    )

    $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken
    
    $ProjectInfo = GetProjectsInOrganisation -Organisation 'BrightComSolutions' -PATToken $PATToken | Where-Object name -eq 'Gardenstore'

    $BodyJson = @'
    {
        "data": {},
        "name": "github.com_BrightCom-dev",
        "type": "GitHub",
        "url": "https://github.com",
        "authorization": {
            "parameters": {
                "AccessToken": "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"
            },
            "scheme": "Token"
        },
        "isShared": false,
        "isReady": true,
        "serviceEndpointProjectReferences": [
        {
            "projectReference": {
                "id": "",
                "name": ""
            },
            "name": "github.com_BrightCom-dev"
        }
        ]
    }
'@


    $BodyJson = $BodyJson | ConvertFrom-Json

    $BodyJson.serviceEndpointProjectReferences[0].projectReference[0].id = $ProjectInfo.id
    $BodyJson.serviceEndpointProjectReferences[0].projectReference[0].name = $ProjectInfo.name

    $BodyJson = $BodyJson | ConvertTo-Json -Depth 3

    #send the mail through Sendgrid
    $Parameters = @{
        Method      = "POST"
        Uri         = "https://dev.azure.com/$Organisation/$Project/_apis/serviceendpoint/endpoints?api-version=6.0-preview.4"
        Headers     = $Header
        ContentType = "application/json"
        Body        = $BodyJson
    }
    
    $results = Invoke-RestMethod @Parameters
    $value = $results | Select-Object -Property value | ConvertTo-Json
    $result = $value | ConvertFrom-Json | Select-Object -Property value -ExpandProperty value
    return($result)
}

function New-DevOpsWorkItemTask {
    param (
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Organisation,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Project,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$Title,
        [Parameter(ValueFromPipelineByPropertyName, Mandatory = $true)]
        [string]$PATToken
    )

    $Header = Get-BasicAuthHeader -userName 'mathias@brightcom.se' -PATToken $PATToken
    
    $BodyJson = @"
    [
        {
            "op": "add",
            "path": "/fields/System.Title",
            "from": null,
            "value": "$Title"
        },
        {
            "op": "add",
            "path": "/fields/System.State",
            "from": null,
            "value": "New"
        },
        {
            "op": "add",
            "path": "/fields/System.AssignedTo",
            "from": null,
            "value": "mathias@brightcom.se"
        },
        {
            "op": "add",
            "path": "/fields/System.AreaPath",
            "from": null,
            "value": "BrightCom Solutions\\BCS Infrastructure"
        },
        {
            "op": "add",
            "path": "/relations/-",
            "value": {
              "rel": "System.LinkTypes.Hierarchy-Reverse",
              "url": "https://dev.azure.com/fabrikam/_apis/wit/workItems/598",
              "attributes": {
                "comment": "Making a new link for the dependency"
              }
            }
          }
    ]
"@

    
    $Uri = ('https://dev.azure.com/{0}/{1}/_apis/wit/workitems/$Task?api-version=5.0' -f $Organisation, $Project)

    $Parameters = @{
        Method      = "POST"
        Uri         = $Uri
        Headers     = $Header
        ContentType = "application/json-patch+json"
        Body        = $BodyJson
    }
    
    $results = Invoke-RestMethod @Parameters
    return($results)
}