plugins/InxmailPro/Public/XPro/Get-Mailing.ps1


function Get-Mailing {
    [CmdletBinding(DefaultParameterSetName = 'Collection')]
    param (

        # Query parameters

         [Parameter(Mandatory=$true, ParameterSetName = 'Single')][Int]$Id

        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')]
         [ValidateSet("REGULAR_MAILING", "ACTION_MAILING", "TIME_TRIGGER_MAILING", "SUBSCRIPTION_TRIGGER_MAILING", "SPLIT_TEST_MAILING", IgnoreCase = $false)]
         [Array]$Type = [Array]@()             # REGULAR_MAILING|ACTION_MAILING|TIME_TRIGGER_MAILING|SUBSCRIPTION_TRIGGER_MAILING|SPLIT_TEST_MAILING - multiple values are allowed
        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')]
         [Array]$ListIds = [Array]@()             # REGULAR_MAILING|ACTION_MAILING|TIME_TRIGGER_MAILING|SUBSCRIPTION_TRIGGER_MAILING|SPLIT_TEST_MAILING - multiple values are allowed
        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')][Switch]$IsApproved = $false      # Only approved mailings
        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')][Switch]$ReadyToSend = $false     # Only mailings ready to send
        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')][Switch]$HasSending = $false      # Only mailings with sends

        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')][String]$CreatedAfter = ""        # string like 2024-06-16
        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')][String]$CreatedBefore = ""       # string like 2024-06-16
        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')][String]$ModifiedAfter = ""       # string like 2024-06-16
        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')][String]$ModifiedBefore = ""      # string like 2024-06-16
        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')][String]$SentAfter = ""           # string like 2024-06-16

        # Generic
        ,[Parameter(Mandatory=$false, ParameterSetName = 'Collection')][Switch]$All = $false             # Return all mailings through paging

        ,[Parameter(Mandatory=$false, ParameterSetName = 'Single')]
         [Parameter(Mandatory=$false, ParameterSetName = 'Collection')]
         [Switch]$IncludeLinks = $false  # Should the links also be included?

    )

    begin {

        switch ($PSCmdlet.ParameterSetName) {

            'Single' {

                # Create params
                $params = [Hashtable]@{
                    "Object" = "mailings"
                    "Method" = "GET"
                    "Path" = $Id
                }

                break
            }

            'Collection' {

                #-----------------------------------------------
                # DEFINE QUERY
                #-----------------------------------------------

                <#
                    [x] createdAfter
                    [x] createdBefore
                    [x] modifiedAfter
                    [x] modifiedBefore
                    [x] sentAfter
                    [x] types
                    [x] listIds
                    [x] readyToSend
                    [x] isApproved
                    [x] hasSending
                    [ ] embedded
                #>


                $query = [PSCustomObject]@{}

                # Set the approval status
                If ( $IsApproved -eq $true ) {
                    $query | Add-Member -MemberType NoteProperty -Name "isApproved" -Value "true"
                }

                # Set the approval status
                If ( $ReadyToSend -eq $true ) {
                    $query | Add-Member -MemberType NoteProperty -Name "readyToSend" -Value "true"
                }

                # Set the approval status
                If ( $HasSending -eq $true ) {
                    $query | Add-Member -MemberType NoteProperty -Name "hasSending" -Value "true"
                }

                # Set the type filter
                If ( $Type.Count -gt 0 ) {
                    $query | Add-Member -MemberType NoteProperty -Name "types" -Value ( $Type -join "," )
                }

                # Set the list filter
                If ( $ListIds.Count -gt 0 ) {
                    $query | Add-Member -MemberType NoteProperty -Name "listIds" -Value ( $ListIds -join "," )
                }

                # Check the date
                If ( $CreatedAfter -ne "" ) {
                    $f = [Datetime]::Today
                    If ( [Datetime]::TryParse($CreatedAfter,[ref]$f) -eq $true ) {
                        $query | Add-Member -MemberType NoteProperty -Name "createdAfter" -Value $f.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ", [cultureinfo]::InvariantCulture) # 2024-06-18T08:24:36Z
                    } else {
                        throw "CreatedAfter is not valid"
                    }
                } else {
                    # Set nothing
                }

                # Check the date
                If ( $CreatedBefore -ne "" ) {
                    $f = [Datetime]::Today
                    If ( [Datetime]::TryParse($CreatedBefore,[ref]$f) -eq $true ) {
                        $query | Add-Member -MemberType NoteProperty -Name "createdBefore" -Value $f.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ", [cultureinfo]::InvariantCulture) # 2024-06-18T08:24:36Z
                    } else {
                        throw "CreatedBefore is not valid"
                    }
                } else {
                    # Set nothing
                }

                # Check the date
                If ( $ModifiedAfter -ne "" ) {
                    $f = [Datetime]::Today
                    If ( [Datetime]::TryParse($ModifiedAfter,[ref]$f) -eq $true ) {
                        $query | Add-Member -MemberType NoteProperty -Name "modifiedAfter" -Value $f.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ", [cultureinfo]::InvariantCulture) # 2024-06-18T08:24:36Z
                    } else {
                        throw "ModifiedAfter is not valid"
                    }
                } else {
                    # Set nothing
                }

                # Check the date
                If ( $ModifiedBefore -ne "" ) {
                    $f = [Datetime]::Today
                    If ( [Datetime]::TryParse($ModifiedBefore,[ref]$f) -eq $true ) {
                        $query | Add-Member -MemberType NoteProperty -Name "modifiedBefore" -Value $f.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ", [cultureinfo]::InvariantCulture) # 2024-06-18T08:24:36Z
                    } else {
                        throw "ModifiedBefore is not valid"
                    }
                } else {
                    # Set nothing
                }

                # Check the date
                If ( $SentAfter -ne "" ) {
                    $f = [Datetime]::Today
                    If ( [Datetime]::TryParse($SentAfter,[ref]$f) -eq $true ) {
                        $query | Add-Member -MemberType NoteProperty -Name "sentAfter" -Value $f.ToUniversalTime().ToString("yyyy-MM-ddTHH:mm:ssZ", [cultureinfo]::InvariantCulture) # 2024-06-18T08:24:36Z
                    } else {
                        throw "SentAfter is not valid"
                    }
                } else {
                    # Set nothing
                }


                #-----------------------------------------------
                # CALL PARAMETERS
                #-----------------------------------------------

                # Create params
                $params = [Hashtable]@{
                    "Object" = "mailings"
                    "Method" = "GET"
                    "Query" = $query
                    "PageSize" = 100
                }

                # Add paging
                If ( $All -eq $true ) {
                    $params.Add("Paging", $true)
                }

                break
            }
        }

        # add verbose flag, if set
        If ( $PSBoundParameters["Verbose"].IsPresent -eq $true ) {
            $params.Add("Verbose", $true)
        }

    }

    process {



        # Request mailings
        $mailings = Invoke-XPro @params

        # Exclude mailings
        # If ( $Type.Count -gt 0 ) {
        # $mailingsToFilter = $mailings."_embedded"."inx:mailings" | Where-Object { $_.type -in $type }
        # } else {
        # $mailingsToFilter = $mailings."_embedded"."inx:mailings"
        # }

        # Return
        switch ($PSCmdlet.ParameterSetName) {

            'Single' {

                # return
                If ( $IncludeLinks -eq $true ) {
                    $mailings
                } else {
                    $mailings | Select-Object * -ExcludeProperty "_links"
                }

                break
            }

            'Collection' {

                $mailingsToFilter = $mailings."_embedded"."inx:mailings"

                # return
                If ( $IncludeLinks -eq $true ) {
                    $mailingsToFilter
                } else {
                    $mailingsToFilter | Select-Object * -ExcludeProperty "_links"
                }

                break
            }
        }


    }

    end {

    }

}