internal/functions/resolve/Resolve-AccessPackageResource.ps1

function Resolve-AccessPackageResource {
    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true)] [string] $InputReference,
        [Parameter(Mandatory = $true)] [string] $CatalogId,
        [switch] $DontFailIfNotExisting,
        [switch] $SearchInDesiredConfiguration,
        [switch] $Expand, # Return object { id, displayName, originId }
        [switch] $DisplayName,
        [System.Management.Automation.PSCmdlet] $Cmdlet = $PSCmdlet
    )
    begin { $InputReference = Resolve-String -Text $InputReference; if (-not $script:accessPackageResourceDetailCache) { $script:accessPackageResourceDetailCache = @{} } }
    process { try {
        if ($Expand -and $script:accessPackageResourceDetailCache.ContainsKey($InputReference)) { return $script:accessPackageResourceDetailCache[$InputReference] }
        $detail = $null; $resId = $null; $originId = $null
        $filterField = if ($InputReference -match $script:guidRegex) {'originId'} else {'displayName'}
        $searchText = if ($filterField -eq "displayName" -and $InputReference -match "sharepoint.com") {
                            $InputReference.split("sites/")[1]
                      }
                      else {
                        $InputReference
                      }

        $detail = (Invoke-MgGraphRequest -Method GET -Uri ("$script:graphBaseUrl/identityGovernance/entitlementManagement/accessPackageCatalogs/{0}/accessPackageResources?`$filter=$filterField eq '{1}'" -f $CatalogId,$searchText)).value | Select-Object -First 1
        if ($detail) { $resId = $detail.id; $originId = $detail.originId }
        if (-not $resId -and $SearchInDesiredConfiguration) {
            $catalogName = (Invoke-MgGraphRequest -Method GET -Uri ("$script:graphBaseUrl/identityGovernance/entitlementManagement/accessPackageCatalogs/{0}?`$select=displayName" -f $CatalogId)).displayName
            $dn = "$catalogName - $InputReference"; if ($dn -in $script:desiredConfiguration['accessPackageResources'].displayName) { $resId = $InputReference }
        }
        if (-not $resId) { if ($DontFailIfNotExisting) { return $InputReference } else { throw "Cannot find accessPackageResource $InputReference" } }
        if (-not $Expand) { if ($DisplayName) { return $detail.displayName } return $resId }
        if (-not $detail -and $resId) { $detail = Invoke-MgGraphRequest -Method GET -Uri ("$script:graphBaseUrl/identityGovernance/entitlementManagement/accessPackageCatalogs/{0}/accessPackageResources/{1}?`$select=id,displayName,originId" -f $CatalogId,$resId) }
        $obj = [pscustomobject]@{ id=$resId; displayName=$detail.displayName; originId=($detail.originId) }
        foreach ($k in @($obj.id,$obj.displayName,$obj.originId)) { if ($k -and -not $script:accessPackageResourceDetailCache.ContainsKey($k)) { $script:accessPackageResourceDetailCache[$k] = $obj } }
        return $obj
    } catch { if ($DontFailIfNotExisting) { Write-PSFMessage -Level Warning -Message ("Cannot resolve AccessPackageResource resource for input '{0}'. Searched tenant & desired configuration. Error: {1}" -f $InputReference,$_.Exception.Message) -Tag failed -ErrorRecord $_; return $InputReference } else { Write-PSFMessage -Level Warning -Message ("Cannot resolve AccessPackageResource resource for input '{0}'. Searched tenant & desired configuration. Error: {1}" -f $InputReference,$_.Exception.Message) -Tag failed -ErrorRecord $_; $Cmdlet.ThrowTerminatingError($_) } } }
}