Classes/Main/PaCustomReport.Class.ps1

class PaCustomReport {
    [string]$Name
    [string]$Description
    [string]$Database
    [string]$SortBy
    [string[]]$Columns
    [string]$TimeFrame
    [int]$EntriesShown
    [int]$Groups
    [string]$Query

    ###################################### Methods #######################################
    # GetColumnType
    [string] GetColumnType([string]$Column) {
        $AggregateColumns  = @()
        $AggregateColumns += 'src'
        $AggregateColumns += 'srcuser'
        $AggregateColumns += 'dst'
        $AggregateColumns += 'dstuser'
        $AggregateColumns += 'action'
        $AggregateColumns += 'threatid'
        $AggregateColumns += 'quarter-hour-of-receive_time'


        $ValueColumns  = @()
        $ValueColumns += 'count'
        $ValueColumns += 'bytes'
        $ValueColumns += 'sessions'

        if ($ValueColumns -contains $Column) {
            $ColumnType = 'value'
        } elseif ($AggregateColumns -contains $Column) {
            $ColumnType = 'aggregate'
        } else {
            Throw "PaCustomReport: Unrecognized column: $Column"
        }

        return $ColumnType
    }

    # invokeReportGetQuery
    [Xml] ToXml() {
        [xml]$Doc = New-Object System.Xml.XmlDocument
        $root = $Doc.CreateNode("element","reports",$null)
        
        # Start Entry Node
        $EntryNode = $Doc.CreateNode("element","entry",$null)
        $EntryNode.SetAttribute("name",$this.Name)

        # Start Type Node
        $TypeNode = $Doc.CreateNode("element","type",$null)

        # Start DatabaseNode
        $DatabaseShortName = $this.TranslateDatabaseName($this.Database,"short")
        $DatabaseNode      = $Doc.CreateNode("element",$DatabaseShortName,$null)
        
        # Create Aggregate/Member Nodes
        $AggregateNode = $Doc.CreateNode("element",'aggregate-by',$null)
        $ValueNode     = $Doc.CreateNode("element",'values',$null)

        # Columns
        foreach ($c in $this.Columns) {
            $MemberNode = $Doc.CreateNode("element",'member',$null)
            $MemberNode.InnerText = $c
            switch ($this.GetColumnType($c)) {
                'aggregate' {
                    $AggregateNode.AppendChild($MemberNode)
                    continue
                }
                'value' {
                    $ValueNode.AppendChild($MemberNode)
                    continue
                }
            }
        }

        if ($this.SortBy) {
            # Create SortBy Node
            $SortByNode = $Doc.CreateNode("element",'sortby',$null)
            $SortByNode.InnerText = $this.SortBy
            $DatabaseNode.AppendChild($SortByNode)
        }

        # Add aggregate/value nodes to database node
        $DatabaseNode.AppendChild($AggregateNode)
        $DatabaseNode.AppendChild($ValueNode)
        
        # add Database to type
        $TypeNode.AppendChild($DatabaseNode)

        # Add Type to Entry Node
        $EntryNode.AppendChild($TypeNode)

        # Create/Add TimeFrame to Entry
        $TimeFrameNode = $Doc.CreateNode("element",'period',$null)
        $TimeFrameNode.InnerText = $this.TimeFrame
        $EntryNode.AppendChild($TimeFrameNode)

        # Create/Add EntriesShown to Entry
        $EntriesShownNode = $Doc.CreateNode("element",'topn',$null)
        $EntriesShownNode.InnerText = $this.EntriesShown
        $EntryNode.AppendChild($EntriesShownNode)

        # Create/Add Groups to Entry
        $GroupsNode = $Doc.CreateNode("element",'topm',$null)
        $GroupsNode.InnerText = $this.Groups
        $EntryNode.AppendChild($GroupsNode)

        # Create/Add Description to Entry
        $GroupsNode = $Doc.CreateNode("element",'description',$null)
        $GroupsNode.InnerText = $this.Description
        $EntryNode.AppendChild($GroupsNode)

        # Create/Add Description to Entry
        $GroupsNode = $Doc.CreateNode("element",'caption',$null)
        $GroupsNode.InnerText = $this.Name
        $EntryNode.AppendChild($GroupsNode)

        if ($this.Query) {
            # Create/Add Query to Entry
            $QueryNode = $Doc.CreateNode("element",'query',$null)
            $QueryNode.InnerText = $this.Query
            $EntryNode.AppendChild($QueryNode)
        }

        # Append Entry to Root and Root to Doc
        $root.AppendChild($EntryNode)
        $Doc.AppendChild($root)

        return $Doc
    }

    # Translate Database strings
    [string] TranslateDatabaseName([string]$Name,[string]$DesiredType) {
        $DatabaseTranslations = @{}
        $DatabaseTranslations.trsum = "Traffic Summary"
        $DatabaseTranslations.thsum = "Threat Summary"

        $TranslatedName = $null
        if (($DatabaseTranslations.Keys -contains $Name) -and ($DesiredType -eq "Friendly")) {
            $TranslatedName = $DatabaseTranslations.$Name
        } elseif (($DatabaseTranslations.Values -contains $Name) -and ($DesiredType -eq "Short")) {
            $TranslatedName = $DatabaseTranslations.Keys | Where-Object { $DatabaseTranslations["$_"] -eq $Name }
        } else {
            Throw "Invalid Database Name: $Name"
        }

        return $TranslatedName
    }

    ##################################### Initiators #####################################
    # Initiator
    PaCustomReport([string]$Name) {
        $this.Name = $Name
    }
}