Plugins/Builtin/Public/Approve-PendingCommand.ps1


function Approve-PendingCommand {
    <#
    .SYNOPSIS
        Approved a command for execution.
    .PARAMETER Id
        The command exeution context ID of a command awaiting approval.
    .EXAMPLE
        !approve -id f087f1fd

        Approve the command with ID f087f1fd. The command will immediately be released and executed.
    #>

    [PoshBot.BotCommand(
        Aliases = ('ack', 'approve', 'approvecommand')
    )]
    [cmdletbinding()]
    param(
        [parameter(Mandatory)]
        $Bot,

        [parameter(Mandatory, Position = 0)]
        [string]$Id
    )

    $context = $Bot.DeferredCommandExecutionContexts[$Id]
    if ($context) {
        $callingUserId = $global:PoshBotContext.From
        if (-not $global:PoshBotContext.FromName) {
            $callingUserName = $Bot.RoleManager.ResolveUserIdToUserName($callingUserId)
        } else {
            $callingUserName = $global:PoshBotContext.FromName
        }
        $originalCommandCallingUser = $context.ParsedCommand.From

        if ($callingUserId -ne $originalCommandCallingUser) {
            # Validate calling user is in an approval group for this command
            $approvalGroups = $Bot.Executor.GetApprovalGroups($context)
            $callingUserGroups = $Bot.RoleManager.GetUserGroups($callingUserId).Name
            if ($null -eq $callingUserGroups) { $callingUserGroups = @() }

            $compareParams = @{
                ReferenceObject = $approvalGroups
                DifferenceObject = $callingUserGroups
                PassThru = $true
                IncludeEqual = $true
                ExcludeDifferent = $true
            }
            $inApprovalGroup = (Compare-Object @compareParams).Count -gt 0

            if ($inApprovalGroup) {
                $context.ApprovalState = 2 # [ApprovalState]::Approved
                $context.Approver.Id = $callingUserId
                $context.Approver.Name = $callingUserName
                $Bot.ProcessedDeferredContextQueue.Enqueue($context)

                New-PoshBotCardResponse -Type Normal -Text "Command [$Id] - [$($context.ParsedCommand.CommandString)] approved by [$callingUserName]"
            } else {
                New-PoshBotCardResponse -Type Warning -Text "Sorry. Only someone in approval group(s) [$($approvalGroups -join ', ')] can approve this command."
            }
        } else {
            New-PoshBotCardResponse -Type Warning -Text 'Nice try. Self-approving is not allowed.'
        }
    } else {
        New-PoshBotCardResponse -Type Warning -Text "Unknown approval ID [$Id]"
    }
}