ExportedFunctions/Grant-AnsibleRole.ps1

function Grant-AnsibleRole {
    [CmdletBinding(SupportsShouldProcess=$true)]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute("PSAvoidGlobalVars", "Global:DefaultAnsibleTower")]
    param(
        [Parameter(Position=1,Mandatory=$true)]
        [object]$Team,

        [Parameter(Position=2,Mandatory=$true)]
        [object]$Role,

        [switch]$Force,

        $AnsibleTower = $Global:DefaultAnsibleTower
    )
    process {
        switch ($Team.GetType().Fullname) {
            "AnsibleTower.Team" {
                $AnsibleTower = $Team.AnsibleTower
            }
            "System.Int32" {
                $Team = Get-AnsibleTeam -Id $Team -AnsibleTower $AnsibleTower
            }
            "System.String" {
                $TeamSearch = @{}
                if($Team.Contains("/")) {
                    $TeamSearch["Organization"] = $Team.Split("/")[0]
                    $TeamSearch["Name"] = $Team.Split("/")[1]
                } else {
                    $TeamSearch["Name"] = $Team
                }
                $Team = Get-AnsibleTeam @TeamSearch -AnsibleTower $AnsibleTower

                if($Team.Count -gt 1) {
                    $TeamList = ($Team | ForEach-Object {
                        "$($_.organization)/$($_.Name)"
                    }) -join ", "
                    if(!$Force -and !$PSCmdlet.ShouldContinue("Grant role to multiple teams? (Use -Force to bypass prompt)", "Multiple teams found: $TeamList")) {
                        return
                    }
                }
            }
            default {
                Write-Error -Message "Unknown type passed as -Team ($Team). Supported values are String, Int32, and AnsibleTower.Team." -ErrorAction Stop
                return
            }
        }

        if(!$Team) {
            Write-Error -Message "No team was located using the specified search parameter." -ErrorAction Stop
            return
        }

        switch ($Role.GetType().Fullname) {
            "AnsibleTower.Role" {
                # Nothing needed
            }
            "System.Int32" {
                $Role = Get-AnsibleRole -Id $Role -AnsibleTower $AnsibleTower
            }
            "System.String" {
                $Role = Get-AnsibleRole -Team $TeamId -Name $Role -AnsibleTower $AnsibleTower
            }
            default {
                Write-Error "Unknown type passed as -Role ($Role). Supported values are String, Int32, and AnsibleTower.Role." -ErrorAction Stop
                return
            }
        }

        if(!$Role) {
            Write-Error -Message "No role was located using the specified search parameter." -ErrorAction Stop
            return
        }

        $Team | ForEach-Object {
            $ThisTeam = $_
            $Role | ForEach-Object {
                $ThisRole = $_
                if($PSCmdlet.ShouldProcess("$($ThisRole.Resource_type)/$($ThisRole.resource_name)", "Grant $($ThisRole.Name) to $($ThisTeam.Organization)/$($ThisTeam.Name)")) {
                    Invoke-PostAnsibleInternalJsonResult -ItemType teams -ItemId $ThisTeam.Id -ItemSubItem roles -InputObject @{ id = $ThisRole.Id } -AnsibleTower $AnsibleTower
                }
            }
        }
    }
}