Invoke-Uplift-ActionResource.ps1



# resource file helpers
function Get-ResourceFileFolders()  {
    return @(
        # current directory where the script lives
        ( Split-Path -Parent $PSCommandPath)
    )
}

function Get-ResourceFiles() {
    $filter = "*.resource.json"
    $depth  = 2

    # -ErrorAction SilentlyContinue makes PS supress nested read permissions errrors if any

    Write-DebugMessage "Scanning current directory with filter $filter depth: $depth"
    $result =  (Get-ChildItem -Filter $filter `
        -Recurse `
        -Depth $depth `
        -ErrorAction SilentlyContinue
    )

    if($result.Count -eq 1) {
        $result = @($result)
    }

    Write-DebugMessage " - found files: $($result.Count)"

    $otherFolders = Get-ResourceFileFolders

    foreach($otherFolder in $otherFolders) {
        Write-DebugMessage "Scanning directory with filter $filter depth: $depth - $otherFolder"

        $otherResult =  (Get-ChildItem -Path $otherFolder `
            -Filter $filter -Recurse `
            -Depth $depth `
            -ErrorAction SilentlyContinue
        )

        if($otherResult.Count -eq 1) {
            $otherResult = @($otherResult)
        }

        Write-DebugMessage " - found files: $($otherResult.Count)"

        if($otherResult.Count -gt 0) {
            $result += $otherResult
        }
    }

    Write-DebugMessage " - found files: $($result.Count)"
    $result = $result `
        | Select-Object -uniq -ExpandProperty FullName


    Write-DebugMessage " - uniq files: $($result.Count)"

    return $result
}

function Get-AllResources() {

    $result = @()
    $files  = Get-ResourceFiles

    Write-DebugMessage "Loading resource files"

    foreach($filePath in $files) {
        Write-DebugMessage " - loading file: $filePath"

        $json = Get-Content -Raw -Path $filePath | ConvertFrom-Json
        Write-DebugMessage " - loaded json: $json"

        foreach($resource in $json.resources) {
            $result += $resource
        }
    }

    Write-DebugMessage "Loaded $($result.Count) resources"

    return $result
}

function Get-AllResourcesMatch($matchValue) {

    Write-DebugMessage "Get-AllResourcesMatch, loading for match: $matchValue"
    $resources   = Get-AllResources

    Write-DebugMessage " - filtering resource ids by match: $matchValue"

    $result = @()

    if([String]::IsNullOrEmpty( $matchValue ) -eq $False) {
        Write-DebugMessage " - filtering resource ids by match: $matchValue"
        $result = $resources `
            | Where-Object { $_.id -match $matchValue }
    } else {
        Write-DebugMessage " - returning all resources, match is empty"
        $result = $resources
    }

    if($null -eq $result) {
        $result = @()
    }

    return $result
}

function Get-ResourceFileName($resource) {

    $result = $resource.file_name

    if([string]::IsNullOrEmpty($result) -eq $true) {
        $result = Split-Path $resource.uri -Leaf
    }

    return $result
}

function Get-ResourceType($resource) {

    $result = $resource.type

    if([string]::IsNullOrEmpty($result) -eq $true) {
        $result = "uplift/http-file"
    }

    return $result
}

# resource validate-uri
. "$PSScriptRoot/Invoke-Uplift-ActionResourceValidateUri.ps1"

# resource list


# main action
function Invoke-ActionResource {
    [System.ComponentModel.CategoryAttribute("Action")]
    [System.ComponentModel.DescriptionAttribute("Downloads file resources to local repository")]
    param(
        $commandOptions
    )

    $result = Invoke-ActionVersion

    . "$PSScriptRoot/Invoke-Uplift-ActionResourceDownload.ps1"
    . "$PSScriptRoot/Invoke-Uplift-ActionResourceDownloadLocal.ps1"
    . "$PSScriptRoot/Invoke-Uplift-ActionResourceList.ps1"

    switch($commandOptions.Second)
    {
        "download"       {
            return (Invoke-ActionResourceDownload      $commandOptions)
        }

        "download-local" {
            return (Invoke-ActionResourceDownload-Local $commandOptions)
        }
        "list"           {
            return (Invoke-ActionResourceList          $commandOptions)
        }

        "validate-uri"   {
            return (Invoke-ActionResourceValidate-Uri   $commandOptions)
        }

        default          {
            $commands = Get-AvailableActionCommands "Invoke-ActionResource"
            Write-CommandHelp $commands "resource"

            return 0
        }
    }

    $result = 0

    return $result
}