Core/PipelinesRunner-Module.psm1

$ErrorActionPreference = "Stop"

function RemoveTemp {
    if (Test-Path "$SAFTempDir") {
        Remove-Item "$SAFTempDir" -Recurse -Force | Out-Null
    }
}

function CreateTemp {
    if (!(Test-Path "$SAFTempDir")) {
        New-Item -ItemType Directory -Path "$SAFTempDir" -Force | Out-Null
    }
}

function GetPipelineSteps {
    [CmdletBinding()]
    Param
    (
        [string]$DefinitionFile,
        [string]$Name,
        [switch]$RunExtensions
    )

    $pipelines = Get-Content -Raw -Path $DefinitionFile | ConvertFrom-Json
    $steps = $pipelines.$Name

    if (($RunExtensions.IsPresent) -and ($null -ne $SAFConfiguration.Extensions.Pipelines)) {
        $steps += $SAFConfiguration.Extensions.Pipelines
    }

    return $steps
}

function BuildStepAbsolutePath {
    [CmdletBinding()]
    Param
    (
        [string]$Path
    )

    if (!($Path.StartsWith("/") -or $Path.StartsWith("\"))) {
        return $Path
    }

    $absPath = "$(Get-Location)$Path"
    if (Test-Path $absPath) {
        return $absPath
    }

    return "$PSScriptRoot\..\Pipelines\Steps$Path"
}

function IsXM {
    return ($SAFConfiguration.system.sitecoreMode -eq "XM")
}

function ShouldSkip {
    [CmdletBinding()]
    Param
    (
        [object]$Step
    )
    
    $skip = $false
    if (!($null -eq $Step.skip)) {
        if($Step.skip -eq $true){
            $skip = $true
        }
        else {
            $skip = Invoke-Expression $Step.skip
        }
    }
    return $skip
}

function ShowSteps {
    [CmdletBinding()]
    Param
    (
        [string]$Pipeline,
        [PSObject[]]$Steps
    )

    Write-Output "`n`nSAF will run '$Pipeline' pipeline:`n"

    foreach ($step in $Steps) {
        if(ShouldSkip -Step $step) { }
        elseif (IsStepCompleted -Pipeline $Pipeline -Step $step.name) {
            Write-Warning "SKIP $($step.name)"
        }
        else {
            Write-Output "- $($step.name)"
        }
    }
    Write-Output ""
    Write-Output "Starting after 5 seconds..."
    Write-Output ""
    Start-Sleep -s 5
}

function RunPipeline {
    [CmdletBinding()]
    Param
    (
        [string]$DefinitionFile,
        [string]$Name,
        [switch]$Force,
        [switch]$RunExtensions
    )

    CreateTemp

    if ($Force.IsPresent) {
        EraseHistoryLog -Pipeline $Name
    }

    $steps = GetPipelineSteps -DefinitionFile $DefinitionFile -Name $Name -RunExtensions:$RunExtensions

    ShowSteps -Pipeline $Name -Steps $steps

    try {
        foreach ($step in $steps) {
            if ((ShouldSkip -Step $step) -or (IsStepCompleted -Pipeline $Name -Step $step.name)) { continue }
            
            $stepAbsPath = BuildStepAbsolutePath -Path $step.script
            & $stepAbsPath
            
            MarkStepAsCompleted -Pipeline $Name -Step $step.name
        }

        RemoveTemp
    }
    catch {
        $exception = $_.Exception | Format-List -Force | Out-String
        Write-Error $exception
    }
}

Export-ModuleMember -Function "RunPipeline"
Export-ModuleMember -Function "RemoveTemp"