Public/Authoral/Get-AdoPullRequestsCreatedLastWeek.ps1


function Get-AdoPullRequestsCreatedLastWeek {
    <#
.SYNOPSIS
Obtém pull requests criados em repositórios do Azure DevOps dentro de uma janela recente.

.PARAMETER Organization
Nome da organização no Azure DevOps.

.PARAMETER Project
Nome do projeto no Azure DevOps.

.PARAMETER Repositories
Lista de repositórios que serão consultados.

.PARAMETER Pat
Personal Access Token usado na autenticação Basic. Por padrão, usa a variável de ambiente PAT.

.PARAMETER Status
Status dos pull requests retornados: all, active, completed ou abandoned.

.PARAMETER DaysBack
Quantidade de dias retroativos usada para calcular a data mínima de criação.

.OUTPUTS
PSCustomObject com repositório, identificador, título, descrição, status, autor, data de criação, branches e URL do pull request.
#>

    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [string] $Organization,
        [Parameter(Mandatory)]
        [string] $Project,
        [Parameter(Mandatory)]
        [string[]] $Repositories,
        [string] $Pat = $env:PAT,
        [ValidateSet('all', 'active', 'completed', 'abandoned')]
        [string] $Status = 'all',
        [int] $DaysBack = 7
    )
    if ([string]::IsNullOrWhiteSpace($Pat)) {
        throw "Informe o PAT via -Pat ou variável de ambiente PAT."
    }
    $token = [Convert]::ToBase64String([Text.Encoding]::ASCII.GetBytes(":$Pat"))
    $headers = @{ Authorization = "Basic $token"; Accept = "application/json" }
    $since = (Get-Date).AddDays(-$DaysBack).ToUniversalTime().ToString("o")
    foreach ($repo in $Repositories) {
        $skip = 0
        $top = 100
        do {
            $query = @{
                "api-version"                       = "7.1"
                "searchCriteria.status"             = $Status
                "searchCriteria.minTime"            = $since
                "searchCriteria.queryTimeRangeType" = "Created"
                "`$top"                             = $top
                "`$skip"                            = $skip
            }
            $queryString = ($query.GetEnumerator() | ForEach-Object {
                    "{0}={1}" -f [uri]::EscapeDataString($_.Key), [uri]::EscapeDataString([string]$_.Value)
                }) -join "&"

            $repoEncoded = [uri]::EscapeDataString($repo)
            $projectEncoded = [uri]::EscapeDataString($Project)
            $uri = "https://dev.azure.com/$Organization/$projectEncoded/_apis/git/repositories/$repoEncoded/pullrequests?$queryString"

            $response = Invoke-RestMethod -Method Get -Uri $uri -Headers $headers

            foreach ($pr in $response.value) {
                [pscustomobject]@{
                    Repository    = $repo
                    PullRequestId = $pr.pullRequestId
                    Title         = $pr.title
                    Description   = $pr.description
                    Status        = $pr.status
                    CreatedBy     = $pr.createdBy.displayName
                    CreationDate  = [datetime]$pr.creationDate
                    SourceBranch  = $pr.sourceRefName -replace '^refs/heads/', ''
                    TargetBranch  = $pr.targetRefName -replace '^refs/heads/', ''
                    Url           =
                    "https://dev.azure.com/$Organization/$project/_git/$repo/pullrequest/$($pr.pullRequestId)"
                }
            }

            $skip += $top
        } while ($response.value.Count -eq $top)
    }
}