Public/Folders/Get-HuduFolder.ps1

<#
.SYNOPSIS
    Retrieves one or more folders from the connected Hudu instance.
 
.DESCRIPTION
    With -Id, retrieves a single folder by ID, returning $null instead of throwing if the ID
    doesn't exist (Hudu responds with an HTTP 404 in that case). Without -Id, retrieves every
    folder matching the supplied filters, across all pages.
 
.PARAMETER Id
    ID of a single folder to retrieve.
 
.PARAMETER Name
    Filters results to folders matching the given name.
 
.PARAMETER CompanyId
    Filters results to folders belonging to the given company ID.
 
.PARAMETER InCompany
    Returns only company-specific folders, excluding global knowledge base folders.
 
.PARAMETER FolderType
    Filters results by folder type: 'article' or 'photo'.
 
.EXAMPLE
    Get-HuduFolder -Id 12
 
    Returns the folder with ID 12, or $null if it doesn't exist.
 
.EXAMPLE
    Get-HuduFolder -CompanyId 5 -FolderType 'article'
 
    Returns every article folder belonging to company 5.
 
.OUTPUTS
    Boyles.PowerShell.Hudu.Models.HuduFolder
 
.OUTPUTS
    Boyles.PowerShell.Hudu.Models.HuduFolder[]
#>

function Get-HuduFolder {
    [CmdletBinding(DefaultParameterSetName = 'All')]
    [OutputType([Boyles.PowerShell.Hudu.Models.HuduFolder])]
    [OutputType([Boyles.PowerShell.Hudu.Models.HuduFolder[]])]
    param (
        [Parameter(Mandatory, ParameterSetName = 'Single')]
        [ValidateRange(1, [int]::MaxValue)]
        [QueryIgnore()]
        [int] $Id,

        [Parameter(ParameterSetName = 'All')]
        [ValidateNotNullOrEmpty()]
        [QueryProperty('name')]
        [string] $Name,

        [Parameter(ParameterSetName = 'All')]
        [ValidateRange(1, [int]::MaxValue)]
        [QueryProperty('company_id')]
        [int] $CompanyId,

        [Parameter(ParameterSetName = 'All')]
        [QueryProperty('in_company')]
        [switch] $InCompany,

        [Parameter(ParameterSetName = 'All')]
        [ValidateSet('article', 'photo')]
        [QueryProperty('folder_type')]
        [string] $FolderType
    )

    $client = Get-HuduClientInternal

    if ($PSCmdlet.ParameterSetName -eq 'Single') {

        try {
            [Boyles.PowerShell.Hudu.Models.HuduFolder] $folder = $Client.GetFolder($Id)
            return $folder
        } catch {
            $message = $_.Exception.Message
            if ($message -like '*HTTP 404*') {
                return $null # ID wasn't found. Hudu returns a 404 error
            } else {
                throw $_
            }
        }

    }

    $query = ConvertTo-RequestQuery -BoundParameters $PSBoundParameters -ParameterMetadata $MyInvocation.MyCommand.Parameters | ConvertTo-StringDictionary

    Write-Verbose "QUERY = $($query | ConvertTo-Json)"

    [Boyles.PowerShell.Hudu.Models.HuduFolder[]] $results = $client.GetFolders($query)
    return $results
}