functions/Add-FMFirewallPolicy.ps1

function Add-FMFirewallPolicy {
    <#
    .SYNOPSIS
    Adds new firewall policies to the given ADOM and policy package.
 
    .DESCRIPTION
    Adds new firewall policies to the given ADOM and policy package. This
    function adds the policy to the End of the Package. If you need it elsewhere
    you have to use ""
 
    .PARAMETER Connection
    The API connection object.
 
    .PARAMETER ADOM
    The (non-default) ADOM for the requests.
 
    .PARAMETER Package
    The name of the policy package
 
    .PARAMETER Policy
    The new policy, generated e.g. by using New-FMObjAddress
 
    .PARAMETER After
    If used the policy will be added after the policy with the given ID
 
    .PARAMETER Before
    If used the policy will be added before the policy with the given ID
 
    .PARAMETER Overwrite
    If used and an policy with the given name already exists the data will be
    overwritten.
 
    .PARAMETER RevisionNote
    The change note which should be saved for this revision, see about_RevisionNote
 
      .PARAMETER EnableException
    Should Exceptions been thrown?
 
 
    .EXAMPLE
    #To Be Provided
 
    Later
    .NOTES
    General notes
    #>

    param (
        [parameter( ParameterSetName = "default")]
        #[parameter( ParameterSetName = "undocumentedAfter")]
        #[parameter( ParameterSetName = "undocumentedBefore")]
        $Connection = (Get-FMLastConnection),
        [parameter( ParameterSetName = "default")]
        #[parameter( ParameterSetName = "undocumentedAfter")]
        #[parameter( ParameterSetName = "undocumentedBefore")]
        [string]$ADOM,
        [parameter(mandatory = $true, ParameterSetName = "default")]
        [parameter(mandatory = $true, ParameterSetName = "undocumentedAfter")]
        [parameter( mandatory = $true, ParameterSetName = "undocumentedBefore")]
        [PSFramework.TabExpansion.PsfArgumentCompleterAttribute("FortigateManager.FirewallPackage")]
        [string]$Package,
        #[parameter( ParameterSetName = "undocumentedAfter")]
        [string]$After,
        #[parameter( ParameterSetName = "undocumentedBefore")]
        [string]$Before,
        [parameter(mandatory = $true, ValueFromPipeline = $true, ParameterSetName = "default")]
        # [parameter(mandatory = $true, ValueFromPipeline = $true, ParameterSetName = "undocumentedAfter")]
        # [parameter(mandatory = $true, ValueFromPipeline = $true, ParameterSetName = "undocumentedBefore")]
        [object[]]$Policy,
        [parameter( ParameterSetName = "default")]
        #[parameter( ParameterSetName = "undocumentedAfter")]
        #[parameter( ParameterSetName = "undocumentedBefore")]
        [switch]$Overwrite,
        [parameter( ParameterSetName = "default")]
        #[parameter( ParameterSetName = "undocumentedAfter")]
        #[parameter( ParameterSetName = "undocumentedBefore")]
        [string]$RevisionNote,
        [bool]$EnableException = $true
    )
    begin {
        $policyList = @()
        $explicitADOM = Resolve-FMAdom -Connection $Connection -Adom $ADOM
        Write-PSFMessage "`$explicitADOM=$explicitADOM"
        $validAttributes = Get-PSFConfigValue -FullName 'FortigateManager.ValidAttr.FirewallPolicy'
    }
    process {
        $Policy | ForEach-Object {
            $policyList += $_ | ConvertTo-PSFHashtable -Include $validAttributes
        }
    }
    end {
        $apiCallParameter = @{
            EnableException     = $EnableException
            RevisionNote        = $RevisionNote
            Connection          = $Connection
            LoggingAction       = "Add-FMFirewallPolicy"
            LoggingActionValues = @($policyList.count, $explicitADOM, $Package)
            method              = "add"
            Path                = "/pm/config/adom/$explicitADOM/pkg/$Package/firewall/policy"
            Parameter           = @{
                "data" = $policyList
            }
        }
        if ($Overwrite) {
            Write-PSFMessage "Existing data should be overwritten"
            $apiCallParameter.method = "set"
        }
        if (-not [string]::IsNullOrEmpty($After)) {
            Write-PSFMessage "Using undocumented after parameter"
            $apiCallParameter.Parameter.after = "$after"
        }
        if (-not [string]::IsNullOrEmpty($Before)) {
            Write-PSFMessage "Using undocumented before parameter"
            $apiCallParameter.Parameter.before = "$Before"
        }
        $result = Invoke-FMAPI @apiCallParameter
        if (-not $EnableException) {
            return ($null -ne $result)
        }
    }
}