functions/Get-JS7CalendarDates.ps1

function Get-JS7CalendarDates
{
<#
.SYNOPSIS
Returns dates from a calendar with the JOC Cockpit inventory
 
.DESCRIPTION
Return the list of dates that are included with a calendar.
 
Past and future dates can be retrieved.
 
The following REST Web Service API resources are used:
 
* /calendar/dates
 
.PARAMETER CalendarPath
Specifies the path and name of a calendar that should be returned.
 
.PARAMETER DateFrom
Optionally specifies the date starting from which calendar dates should be returned.
Consider that a UTC date has to be provided.
 
Default: Begin of the current day as a UTC date
 
.PARAMETER DateTo
Optionally specifies the date until which calendar dates should be returned.
Consider that a UTC date has to be provided.
 
Default: End of the calendar's date range or the end of the current year as a UTC date.
 
.OUTPUTS
This cmdlet returns an array of calendar dates.
 
.EXAMPLE
$dates = Get-JS7CalendarDates -CalendarPath /BusinessDays
 
Returns the dates specified by the indicated calendar that is stored with the path "/BusinessDays".
 
.EXAMPLE
$dates = Get-JS7CalendarDates -CalendarPath /BusinessDays -DateTo (Get-Date).AddDays(30)
 
Returns the calendar dates for the next 30 days.
 
.EXAMPLE
$dates = Get-JS7Calendar -WorkingDays | Get-JS7calendarDates
 
Returns the dates from any working day calendars available with the inventory.
 
.LINK
about_JS7
 
#>

[cmdletbinding()]
param
(
    [Parameter(Mandatory=$True,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True)]
    [string] $CalendarPath,
    [Parameter(Mandatory=$False,ValueFromPipelinebyPropertyName=$True)]
    [DateTime] $DateFrom,
    [Parameter(Mandatory=$False,ValueFromPipelinebyPropertyName=$True)]
    [DateTime] $DateTo
)
    Begin
    {
        Approve-JS7Command $MyInvocation.MyCommand
        $stopWatch = Start-JS7StopWatch

        $returnCalendarDates = @()
    }

    Process
    {
        Write-Debug ".. $($MyInvocation.MyCommand.Name): parameter CalendarPath=$CalendarPath"

        if ( $CalendarPath.endsWith( '/') )
        {
            throw "$($MyInvocation.MyCommand.Name): the -CalendarPath parameter has to specify the folder and name of a calendar"
        }

        if ( $CalendarPath -and !$CalendarPath.startsWith( '/') )
        {
            $CalendarPath = '/' + $CalendarPath
        }


        $body = New-Object PSObject
        Add-Member -Membertype NoteProperty -Name 'path' -value $CalendarPath -InputObject $body

        if ( $DateFrom )
        {
            Add-Member -Membertype NoteProperty -Name 'dateFrom' -value (Get-Date $DateFrom -Format 'yyyy-MM-dd') -InputObject $body
        }

        if ( $DateTo )
        {
            Add-Member -Membertype NoteProperty -Name 'dateTo' -value (Get-Date $DateTo -Format 'yyyy-MM-dd') -InputObject $body
        }

        [string] $requestBody = $body | ConvertTo-Json -Depth 100
        $response = Invoke-JS7WebRequest -Path '/calendar/dates' -Body $requestBody

        if ( $response.StatusCode -eq 200 )
        {
            $returnCalendarDateItems = ( $response.Content | ConvertFrom-Json ).dates
        } else {
            throw ( $response | Format-List -Force | Out-String )
        }

        $returnCalendarDates += $returnCalendarDateItems
    }

    End
    {
        $returnCalendarDates

        if ( $returnCalendarDates.count )
        {
            Write-Verbose ".. $($MyInvocation.MyCommand.Name): $($returnCalendarDates.count) calendar dates found"
        } else {
            Write-Verbose ".. $($MyInvocation.MyCommand.Name): no calendar dates found"
        }

        Trace-JS7StopWatch -CommandName $MyInvocation.MyCommand.Name -StopWatch $stopWatch
        Update-JS7Session
    }
}