DSCResources/VE_XD7StoreFrontUnifiedExperience/VE_XD7StoreFrontUnifiedExperience.psm1

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

function Get-TargetResource {
    [CmdletBinding()]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSDSCUseVerboseMessageInDSCResource', '')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalFunctions', 'global:Write-Host')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingEmptyCatchBlock', '')]
    [OutputType([System.Collections.Hashtable])]
    param (
        ## Citrix Storefront Authentication Service IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $VirtualPath,

        ## Receiver for Web IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $WebReceiverVirtualPath,

        ## Citrix Storefront Authentication Service IIS Site Id
        [Parameter()]
        [System.UInt16] $SiteId = 1,

        [Parameter()]
        [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )
    begin {

        AssertXDModule -Name 'FarmsModule','StoresModule','UtilsModule' -Path "$env:ProgramFiles\Citrix\Receiver StoreFront\Management";

    }
    process {

        function global:Write-Host {
            [CmdletBinding()]
            param (
                [Parameter(Position = 0, ValueFromPipeline, ValueFromRemainingArguments)]
                [System.Object] $Object,
                [System.Management.Automation.SwitchParameter] $NoNewLine,
                [System.ConsoleColor] $ForegroundColor,
                [System.ConsoleColor] $BackgroundColor
            )
            foreach ($message in $Object) {

                try { Write-Verbose -Message $message }
                catch { }
            }
        }

        $storefrontCmdletSearchPath = "$env:ProgramFiles\Citrix\Receiver StoreFront\Management";
        Import-Module (FindXDModule -Name 'UtilsModule' -Path $storefrontCmdletSearchPath) -Scope Global -Verbose:$false;
        Import-Module (FindXDModule -Name 'FarmsModule' -Path $storefrontCmdletSearchPath) -Scope Global -Verbose:$false;
        Import-Module (FindXDModule -Name 'StoresModule' -Path $storefrontCmdletSearchPath) -Scope Global -Verbose:$false;

        $unifiedExperience = Get-DSUnifiedExperienceEndpointsForStore -SiteId $SiteId -VirtualPath $VirtualPath;

        $targetResource = @{
            VirtualPath = $VirtualPath;
            SiteId = $SiteId;
            WebReceiverVirtualPath = $unifiedExperience.EndpointSite;
            Ensure = if ($unifiedExperience.EndpointSite) { 'Present' } else { 'Absent' }
        }

        return $targetResource;

    } #end process
} #end function Get-TargetResource


function Test-TargetResource {
    [CmdletBinding()]
    [OutputType([System.Boolean])]
    param (
        ## Citrix Storefront Authentication Service IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $VirtualPath,

        ## Receiver for Web IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $WebReceiverVirtualPath,

        ## Citrix Storefront Authentication Service IIS Site Id
        [Parameter()]
        [System.UInt16] $SiteId = 1,

        [Parameter()]
        [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )
    process {

        $targetResource = Get-TargetResource @PSBoundParameters;

        $inDesiredState = $true;

        if ($Ensure -eq 'Present') {

            if ($targetResource.WebReceiverVirtualPath -notcontains $WebReceiverVirtualPath) {

                Write-Verbose -Message ($localizedData.ResourcePropertyMismatch -f 'WebReceiverVirtualPath', $Ensure, $targetResource.Ensure);
                $inDesiredState = $false;
            }
        }
        elseif ($Ensure -eq 'Absent') {

            if ($targetResource.WebReceiverVirtualPath -contains $WebReceiverVirtualPath) {

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

        if ($inDesiredState) {

            Write-Verbose ($localizedData.ResourceInDesiredState -f $VirtualPath);
            return $true;
        }
        else {

            Write-Verbose ($localizedData.ResourceNotInDesiredState -f $VirtualPath);
            return $false;
        }

    } #end process
} #end function Test-TargetResource


function Set-TargetResource {
    [CmdletBinding()]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSUseShouldProcessForStateChangingFunctions', '')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidGlobalFunctions', 'global:Write-Host')]
    [Diagnostics.CodeAnalysis.SuppressMessageAttribute('PSAvoidUsingEmptyCatchBlock', '')]
    param (
        ## Citrix Storefront Authentication Service IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $VirtualPath,

        ## Receiver for Web IIS Virtual Path
        [Parameter(Mandatory)]
        [System.String] $WebReceiverVirtualPath,

        ## Citrix Storefront Authentication Service IIS Site Id
        [Parameter()]
        [System.UInt16] $SiteId = 1,

        [Parameter()]
        [ValidateSet('Present','Absent')]
        [System.String] $Ensure = 'Present'
    )
    begin {

        AssertXDModule -Name 'WebReceiverModule','StoresModule','UtilsModule' -Path "$env:ProgramFiles\Citrix\Receiver StoreFront\Management";

    }
    process {

        function global:Write-Host {
            [CmdletBinding()]
            param (
                [Parameter(Position = 0, ValueFromPipeline, ValueFromRemainingArguments)]
                [System.Object] $Object,
                [System.Management.Automation.SwitchParameter] $NoNewLine,
                [System.ConsoleColor] $ForegroundColor,
                [System.ConsoleColor] $BackgroundColor
            )
            foreach ($message in $Object) {

                try { Write-Verbose -Message $message }
                catch { }
            }
        }

        $storefrontCmdletSearchPath = "$env:ProgramFiles\Citrix\Receiver StoreFront\Management";
        Import-Module (FindXDModule -Name 'UtilsModule' -Path $storefrontCmdletSearchPath) -Scope Global -Verbose:$false;
        Import-Module (FindXDModule -Name 'WebReceiverModule' -Path $storefrontCmdletSearchPath) -Scope Global -Verbose:$false;
        Import-Module (FindXDModule -Name 'StoresModule' -Path $storefrontCmdletSearchPath) -Scope Global -Verbose:$false;

        Write-Verbose ($localizedData.UpdatingStoreUnifiedExperience -f $VirtualPath);

        if ($Ensure -eq 'Present') {

            Write-Verbose ($localizedData.EnablingStoreUnifiedExperience -f $WebReceiverVirtualPath);
            [ref] $null = Set-DSUnifiedExperienceEndpointsForStore -SiteId $SiteId -VirtualPath $VirtualPath -ReceiverForWebVirtualPath $WebReceiverVirtualPath;
        }
        elseif ($Ensure -eq 'Absent') {

            Write-Verbose ($localizedData.DisablingStoreUnifiedExperience -f $WebReceiverVirtualPath);
            [ref] $null = Remove-DSUnifiedExperienceEndpointsForStore -SiteId $SiteId -VirtualPath $VirtualPath;
        }

    } #end process
} #end function Set-TargetResource


$moduleRoot = Split-Path -Path $MyInvocation.MyCommand.Path -Parent;

## Import the XD7Common library functions
$moduleParent = Split-Path -Path $moduleRoot -Parent;
Import-Module (Join-Path -Path $moduleParent -ChildPath 'VE_XD7Common');

Export-ModuleMember -Function *-TargetResource;