DSCResources/VE_SFStoreWebReceiver/VE_SFStoreWebReceiver.ps1

Import-LocalizedData -BindingVariable localizedData -FileName Resources.psd1;

function Get-TargetResource {
    [CmdletBinding()]
    [OutputType([System.Collections.Hashtable])]
    param (
        ## Store virtual path, e.g. /Citrix/Store
        [Parameter(Mandatory)]
        [System.String] $StoreVirtualPath,

        ## Receiver for Web virtual path, e.g. /Citrix/StoreWeb
        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $VirtualPath = ('{0}Web' -f $StoreVirtualPath.TrimEnd('/')),

        [Parameter()]
        [System.UInt64] $SiteId = 1,

        [Parameter()]
        [System.Boolean] $ClassicReceiver,

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )
    process {
        ImportSFModule -Name 'Citrix.StoreFront.Stores','Citrix.StoreFront.WebReceiver';
        $webReceiver = GetWebReceiverService -VirtualPath $VirtualPath -SiteId $SiteId;
        $targetResource = @{
            VirtualPath = $webReceiver.VirtualPath
            StoreVirtualPath = $webReceiver.StoreServiceVirtualPath;
            ClassicReceiver = $webReceiver.WebReceiver.ClassicReceiverExperience;
            SiteId = $webReceiver.SiteId;
            Ensure = if ($webReceiver) { 'Present' } else { 'Absent' };
        }
        return $targetResource;
    } #end process
} #end function Get-TargetResource

function Test-TargetResource {
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param (
        ## Store virtual path, e.g. /Citrix/Store
        [Parameter(Mandatory)]
        [System.String] $StoreVirtualPath,

        ## Receiver for Web virtual path, e.g. /Citrix/StoreWeb
        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $VirtualPath = ('{0}Web' -f $StoreVirtualPath.TrimEnd('/')),

        [Parameter()]
        [System.UInt64] $SiteId = 1,

        [Parameter()]
        [System.Boolean] $ClassicReceiver,

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )
    process {
        $targetResource = Get-TargetResource @PSBoundParameters;
        $inDesiredState = $true;

        if ($Ensure -ne $targetResource.Ensure) {
            Write-Verbose -Message ($localizedData.ResourcePropertyMismatch -f 'Ensure', $Ensure, $targetResource.Ensure);
            $inDesiredState = $false;
        }

        ## Only check all remaing properties if we're setting
        if ($Ensure -eq 'Present') {
            $properties = @('VirtualPath','StoreServiceVirtualPath','SiteId','ClassicReceiver');
            foreach ($property in $properties) {
                if ($PSBoundParameters.ContainsKey($property)) {
                    $propertyValue = (Get-Variable -Name $property).Value;
                    if ($targetResource.$property -ne $propertyValue) {
                        $message = $localizedData.ResourcePropertyMismatch -f $property, $propertyValue, $targetResource.$property;
                        Write-Verbose -Message $message;
                        $inDesiredState = $false;
                    }
                } #end if PSBoundParameter
            } #end foreach property
        } #end if ensure is present

        if ($inDesiredState) {
            Write-Verbose -Message ($localizedData.ResourceInDesiredState -f $VirtualPath);
        }
        else {
            Write-Verbose -Message ($localizedData.ResourceNotInDesiredState -f $VirtualPath);
        }
        return $inDesiredState;
    } #end process
} #end function Test-TargetResource

function Set-TargetResource {
    [CmdletBinding()]
    param (
        ## Store virtual path, e.g. /Citrix/Store
        [Parameter(Mandatory)]
        [System.String] $StoreVirtualPath,

        ## Receiver for Web virtual path, e.g. /Citrix/StoreWeb
        [Parameter()] [ValidateNotNullOrEmpty()]
        [System.String] $VirtualPath = ('{0}Web' -f $StoreVirtualPath.TrimEnd('/')),

        [Parameter()]
        [System.UInt64] $SiteId = 1,

        [Parameter()]
        [System.Boolean] $ClassicReceiver,

        [Parameter()] [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )
    process {
        ImportSFModule -Name 'Citrix.Storefront.Stores','Citrix.StoreFront.WebReceiver';
        $webReceiver = GetWebReceiverService -VirtualPath $VirtualPath -SiteId $SiteId;

        if ($Ensure -eq 'Absent') {
            if ($webReceiver) {
                ## Store exists, removing
                Write-Verbose -Message ($localizedData.RemovingReceiverWeb -f $VirtualPath);
                [ref] $null = Remove-STFWebReceiverService -WebReceiverService $webReceiver -Confirm:$false;
            }
        }
        elseif ($Ensure -eq 'Present') {
            if ($webReceiver) {
                if ($ClassicReceiver -ne $webReceiver.WebReceiver.ClassicReceiverExperience) {
                    Write-Verbose ($localizedData.UpdatingResourceProperty -f 'ClassicReceiver', $ClassicReceiver);
                    [ref] $null = Set-STFWebReceiverService -WebReceiverService $webReceiver -ClassicReceiverExperience $ClassicReceiver;
                }
            }
            else {
                Write-Verbose -Message ($localizedData.AddingWebReceiver -f $VirtualPath);
                $addSTFWebReceiverServiceParams = @{
                    VirtualPath = $VirtualPath;
                    StoreService = GetStoreService -VirtualPath $StoreVirtualPath -SiteId $SiteId;
                    ClassicReceiverExperience = $ClassicReceiver;
                }
                if ($PSBoundParameters.ContainsKey('SiteId')) {
                    $addSTFWebReceiverServiceParams['SiteId'] = $SiteId;
                }
                [ref] $null = Add-STFWebReceiverService @addSTFWebReceiverServiceParams;
            }
        }
    } #end process
} #end function Set-TargetResource