AdoBauTaskGen.psm1

function ConvertFrom-MarkdownToHtml {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory)]
        [string]
        $Markdown
    )

    $Uri = "https://api.github.com/markdown"

    $ApiRequestBody = @{
        text = $Markdown
        mode = "markdown"
    }

    $Response = Invoke-WebRequest -Uri $Uri -Method Post -Body ($ApiRequestBody | ConvertTo-Json)


    if ($Response.StatusCode -eq 200) {
        return $Response.Content
    }
    else {
        return $Markdown
    }
}
function Get-FullTitle {
    [CmdletBinding(DefaultParameterSetName = "Frequency")]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = "Frequency")]
        [Parameter(Mandatory = $true, ParameterSetName = "Specific")]
        [string]
        $Title,

        [Parameter(Mandatory = $true, ParameterSetName = "Frequency")]
        [ValidateSet("Daily","Weekly","Monthly","Quarterly","Half-Yearly","Yearly")]
        [string]
        $Frequency,

        [Parameter(Mandatory = $true, ParameterSetName = "Specific")]
        [int]
        $RunDate
    )

    $Today = Get-Date

    if ($RunDate) {
        $CompleteTitle ="$RunDate $(Get-Date $Today -UFormat %b): $Title"
    }
    elseif ($Frequency -eq "Daily") {
        $CompleteTitle = "$($Today.DayOfWeek): $Title"
    }
    elseif ($Frequency -eq "Weekly") {
        $CompleteTitle ="Week $(Get-Date $Today -UFormat %V): $Title"
    }
    elseif ($Frequency -eq "Monthly") {
        $CompleteTitle ="$(Get-Date $Today -UFormat %B): $Title"
    }
    elseif ($Frequency -eq "Quarterly") {
        $CompleteTitle ="Q$([math]::Ceiling($Today.Month / 3)): $Title"
    }
    elseif ($Frequency -eq "Half-Yearly") {
        $CompleteTitle ="H$([math]::Ceiling($Today.Month / 6)): $Title"
    }
    elseif ($Frequency -eq "Yearly") {
        $CompleteTitle ="$($Today.Year): $Title"
    }
    return $CompleteTitle
}
function Add-AdoBauTask {
    [CmdletBinding(DefaultParameterSetName = "Frequency")]
    param (
        [Parameter(Mandatory = $true,ParameterSetName = "Frequency")]
        [Parameter(Mandatory = $true,ParameterSetName = "Specific")]
        [string]
        $Title,

        [Parameter(Mandatory = $true,ParameterSetName = "Frequency")]
        [Parameter(Mandatory = $true,ParameterSetName = "Specific")]
        [string]
        $Description,

        [Parameter(Mandatory = $true,ParameterSetName = "Frequency")]
        [Parameter(Mandatory = $true,ParameterSetName = "Specific")]
        [int]
        $ParentId,

        [Parameter(Mandatory = $true,ParameterSetName = "Frequency")]
        [ValidateSet("Daily","Weekly","Monthly","Quarterly","Half-Yearly","Yearly")]
        [string]
        $Frequency,

        [Parameter(Mandatory = $true,ParameterSetName = "Specific")]
        [int]
        $RunDate
    )

    $ParentTask = Get-VSTeamWorkItem -Id $ParentId
    $AreaPath = $ParentTask.AreaPath
    $IterationPath = $ParentTask.IterationPath
    $ProjectName = $ParentTask.TeamProject

    $HtmlDescription = ConvertFrom-MarkdownToHtml -Markdown $Description

    $GetFullTitleArgs = @{ Title = $Title }

    if ($RunDate) {
        $GetFullTitleArgs.RunDate = $RunDate
    }
    else {
        $GetFullTitleArgs.Frequency = $Frequency
    }

    $FullTitle = Get-FullTitle @GetFullTitleArgs

    $AddVSTeamWorkItemArgs = @{
        Title = $FullTitle
        Description = $HtmlDescription
        IterationPath = $IterationPath
        AdditionalFields = @{
            "System.AreaPath" = $AreaPath
        }
        ParentId = $ParentId
        WorkItemType = "Task"
        ProjectName = $ProjectName
    }
    Add-VSTeamWorkItem @AddVSTeamWorkItemArgs
}
function Set-AdoConnection {
    [CmdletBinding(SupportsShouldProcess)]
    param (
        [Parameter(Mandatory)]
        [string]
        $Url,

        [Parameter(Mandatory)]
        [string]
        $Project,

        [Parameter(Mandatory)]
        [string]
        $PersonalAccessToken
    )

    Set-VSTeamAccount -Account $Url -PersonalAccessToken $PersonalAccessToken
    Set-VSTeamDefaultProject -Project $Project
}