modules/runner/functions.psm1

function Invoke-GitURL
{

    param(
        [Parameter(mandatory)]
        [string]$url,
        [Parameter(mandatory)]
        [string]$token,
        [string]$param
    )

    # Collect $(Vars - 'RE_') and Values
    $Parameters = @{ }
    if ($param)
    {
        (' ' + $param).Split(' -') | Where-Object { $_ -ne '' } | ForEach-Object {
            $temp = ($_).split(" ", 2)
            $Parameters[$temp[0]] = "$($temp[1])"
            Write-Output "[name] $($temp[0]) | [value] $($temp[1])"
        }
    }

    # [config] settings
    $gitserver = "https://gitlab.com"
    $download_dir = "~/test" #"/git-runner/scripts/downloads"

    # [check url] pipeline
    if (-not ($url -like "$gitserver/*"))
    {
        Write-Error "URL Must Be From This Git Source: $gitserver`n[$url]"
        break
    } else
    {
        # Check Default Directory
        if (-not (Test-Path $download_dir))
        {
            New-Item $download_dir -ItemType 'Directory' | Out-Null
        }
        Set-Location $download_dir
    }

    # [group info] on project
    if ($token -notlike "*:*")
    {
        $project = ($url -replace ("//", "/")).split('/') | Where-Object { $_ -ne '' }
        $group = $project[2]
        $project = $project[3]
        $id = (Invoke-RestMethod -Headers @{"PRIVATE-TOKEN" = "$token" }  `
                -SessionVariable 'gitsession' `
                -Uri "$gitserver/api/v4/projects?membership=$true&search_namespaces=$true&search=$group/$project" `
                -Verbose:$false `
        ).'id'
    }

    if (($url -like "*/-/blob/*") -or ($url -like "*/-/raw/*"))
    {
        # get file info
        $url = ($url).replace("/-/blob/", "/-/raw/")
        $info = (($url).split("/-/raw")[1]).split("/") | Where-Object { $_ -ne '' }
        $ref = $info[0]
        $path = (($info | Select-Object -Skip 1) -join '/').replace('/', '%2F').replace('.', '%2E')

        # download file
        Invoke-RestMethod -WebSession $gitsession -Uri "$gitserver/api/v4/projects/$id/repository/files/$path/raw?ref=$ref" `
            -OutFile "$download_dir/$($info | Select-Object -Last 1)" -Verbose:$false
        Write-Output "Git-Run: $($info | Select-Object -Last 1) >> [$download_dir/$($info | Select-Object -Last 1)]"
        Write-Output " "
    } else
    {
        break
    }

    # Verify Local File Extension
    $newfile_path = "$download_dir/$($info | Select-Object -Last 1)"
    $file_type = (Get-ItemProperty "$newfile_path").extension

    # Powershell
    if ($file_type -eq '.ps1')
    {
        # Unblock-File "$newfile_path" [needs chmod +x & unblock (OS Check)]
        if ($param)
        {
            $code = & "$newfile_path" @Parameters
        } else
        {
            $code = & "$newfile_path"
        }
        exit $code
    }

}

function Receive-GitURL
{
    param(
        [Parameter(mandatory)]
        [string]$url,
        [Parameter(mandatory)]
        [string]$token
    )

    # [config] settings
    $gitserver = "https://gitlab.com"
    $download_dir = "/git-runner/scripts/downloads"

    # [check url] pipeline
    if (-not ($url -like "$gitserver/*"))
    {
        Write-Error "URL Must Be From This Git Source: $gitserver`n[$url]"
        break
    } else
    {
        # Check Default Directory
        if (-not (Test-Path $download_dir))
        {
            New-Item $download_dir -ItemType 'Directory'
        }
        Set-Location $download_dir
    }

    # [group info] on project
    if ($token -notlike "*:*")
    {
        $project = ($url -replace ("//", "/")).split('/') | Where-Object { $_ -ne '' }
        $group = $project[2]
        $project = $project[3]
        $id = (Invoke-RestMethod -Headers @{"PRIVATE-TOKEN" = "$token" } -SessionVariable 'gitsession' `
                -Uri "$gitserver/api/v4/search?scope=projects&search=$project") | Where-Object { $_.path_with_namespace -eq "$group/$project" } `
        | Select-Object -ExpandProperty 'id'
}

# [tree] repo url
if (($url -like "*/-/tree/*") -or (($url -notlike "*.git") -and (($url -notlike "*/-/blob/*") -and ($url -notlike "*/-/raw/*"))))
{
    if ($url -notlike "*/-/tree/*")
    {
        $path = ($url).split("$gitserver/$group/")[1]
        if ($path -ne $project)
        {
            $files = Invoke-RestMethod -WebSession $gitsession -Uri "$gitserver/api/v4/projects/$id/repository/tree?recursive=true&ref=master&path=$path"
        } else
        {
            $files = Invoke-RestMethod -WebSession $gitsession -Uri "$gitserver/api/v4/projects/$id/repository/tree?recursive=true&ref=master"
        }
    } else
    {
        $info = (($url).split("/-/tree")[1]).split("/") | Where-Object { $_ -ne '' }
        $files = Invoke-RestMethod -WebSession $gitsession -Uri "$gitserver/api/v4/projects/$id/repository/tree?recursive=true&ref=$($info[0])&path=$(($info | Select-Object -Skip 1) -join '/')"
    }
    if ($files)
    {
        foreach ($file in ($files | Where-Object { $_.type -eq 'blob' }))
        {
            $ref = $file.path.Split('/')
            # test/create path
            if ($ref.count -ne 1)
            {
                if (-not (Test-Path "$($ref.Split('/')[0..($ref.count - 2)] -join '/')"))
                {
                    New-Item "$($ref.Split('/')[0..($ref.count - 2)] -join '/')" -ItemType 'Directory' | Out-Null
                    # download file
                    Invoke-RestMethod -WebSession $gitsession -Uri "$gitserver/api/v4/projects/$id/repository/files/$($file.path.replace('/','%2F').replace('.','%2E'))/raw?ref=master" `
                        -OutFile "$download_dir/$($file.path)"
                    Write-Output "$($file.path) >> [$download_dir/$($file.path)]"
                }
            } else
            {
                if (-not (Test-Path "$download_dir/$path"))
                {
                    New-Item "$download_dir/$path" -ItemType 'Directory' | Out-Null
                }
                # download file
                Invoke-RestMethod -WebSession $gitsession -Uri "$gitserver/api/v4/projects/$id/repository/files/$($file.path.replace('/','%2F').replace('.','%2E'))/raw?ref=master" `
                    -OutFile "$download_dir/$path/$($file.path)"
                Write-Output "$($file.path) >> [$download_dir/$path/$($file.path)]"
            }
        }
    } else
    {
        Write-Error "No Directory/Files Found: [$url]"
    }
}

# [.git] clone url
if ($url -like "*.git")
{
    $project = ($url).split("//")[1]
    if ($token -notlike "*:*")
    {
        Write-Error "Git Clone Tokens Must Equal: [username:token]"
        break
    } else
    {
        $name = (($project).split("/") | Select-Object -Last 1).Replace(".git", "")
        if (-not (Test-Path $name))
        {
            git clone "https://${token}@${project}" -q -n
        } else
        {
            Set-Location $name
            git pull "https://${token}@${project}" -q -n
        }
        Write-Output "${project} >> [$download_dir/${project}]"
    }
}

# [blob & raw] file url
if (($url -like "*/-/blob/*") -or ($url -like "*/-/raw/*"))
{
    # get file info
    $url = ($url).replace("/-/blob/", "/-/raw/")
    $info = (($url).split("/-/raw")[1]).split("/") | Where-Object { $_ -ne '' }
    $ref = $info[0]
    $path = (($info | Select-Object -Skip 1) -join '/').replace('/', '%2F').replace('.', '%2E')

    # download file
    $downloadpath = "$download_dir/$($info | Select-Object -Last 1)"
    Invoke-RestMethod -WebSession $gitsession -Uri "$gitserver/api/v4/projects/$id/repository/files/$path/raw?ref=$ref" `
        -OutFile "$downloadpath" -verbose:$false
    if (Test-Path $downloadpath)
    {
        Write-Output "$($info | Select-Object -Last 1) >> [$download_dir/$($info | Select-Object -Last 1)]"
    } else
    {
        Write-Error "Gitlab URL Doesn't Exist"
    }
}

}