modules/scripts.psm1

#POST /api/v3/scripts
#GET /api/v3/scripts
#GET /api/v3/script-summaries
#GET /api/v3/scripts/{id}
#GET /api/v3/script-summaries/{id}
#PATCH /api/v3/scripts/{id}
#DELETE /api/v3/scripts/{id}
#POST /api/v3/script-contexts
#GET /api/v3/script-contexts
#GET /api/v3/script-contexts/{id}
#PATCH /api/v3/script-contexts/{id}
#DELETE /api/v3/script-contexts/{id}
<#
.SYNOPSIS
Sdet a backup Script
.DESCRIPTION
Used for Pre, Post and Backup Scripts
.EXAMPLE
set-ppdMscripts -scriptfile .\example_scripts\s3_backup_rclone.sh -scriptname "TRANSFER_4_THREAD_512k" -Verbose -Type BACKUP -AssetSubType GENERIC_RCLONE -OSType LINUX
#>

function Set-PPDMscripts {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'from_file' )]
        [System.IO.FileInfo]$scriptfile,   
        [Parameter(Mandatory = $true, ParameterSetName = 'from_file' )]
        [ValidateSet(
            'BACKUP'
        )]
        $Type,  
        [Parameter(Mandatory = $true, ParameterSetName = 'from_file' )]  
        [ValidateSet(
            'GENERIC_POSTGRES',
            'GENERIC_MYSQL',
            'GENERIC_S3',
            'GENERIC_RCLONE'
        )]
        $AssetSubType,  
        [Parameter(Mandatory = $true, ParameterSetName = 'from_file' )]  
        [ValidateSet(
            'WINDOWS',
            'LINUX'
        )]
        $OSType,                    
        [Parameter(Mandatory = $true, ParameterSetName = 'from_file' )]
        [string]$scriptname, 
        [Parameter(Mandatory = $false, ParameterSetName = 'from_file' )]
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ParameterSetName = 'from_file' )]
        $apiver = "/api/v3"

    )
    begin {
        $Response = @()
        $METHOD = "POST"
        $Myself = 'scripts'
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            default {
                $URI = "/$myself"
            }
        } 
        $content = Get-Content $scriptfile -raw
       # if ($OSType = "LINUX") {
       # $content = $content -replace "`n", "\n"
       # }

        

        $body = @{
            name             = $scriptname
            type             = $TYPE
            osType           = $OSTYPE
            description      = ""
            content          = $content
            systemPredefined = $false
            purpose          = "BACKUP"
            extendedData     = @{
                type     = "ASSET"
                subTypes = @(
                    $AssetSubType
                )
            }
        }
        switch ($AssetSubType) {
        "GENERIC_S3" {
            $parameters       = @(
                @{
                    type        = "STRING"
                    value       = "/s3"
                    displayName = "mountpoint"
                    alias       = "-m"
                }
                @{
                    type        = "STRING"
                    value       = "/"
                    displayName = "PREFIX"
                    alias       = "-p"                    
                }
            )
            $body.extendedData.subTypes[0]="GENERIC_POSTGRES"    
        }
        "GENERIC_RCLONE" {
            $parameters       = @(
                @{
                    type        = "STRING"
                    value       = "MY_BUCKET"
                    displayName = "BUCKET"
                    alias       = "-b"
                }
                @{
                    type        = "STRING"
                    value       = "/"
                    displayName = "PREFIX"
                    alias       = "-p"                    
                }
                @{
                    type        = "STRING"
                    value       = "rclone"
                    displayName = "CLOUD_PROFILE"
                    alias       = "-c"                    
                }   
                @{
                    type        = "STRING"
                    value       = "4"
                    displayName = "STREAMS"
                    alias       = "-s"                    
                }
                @{
                    type        = "STRING"
                    value       = "off"
                    displayName = "Incremental Max Age ms|s|m|h|d|w|M|y (default off)"
                    alias       = "-i"                    
                } 
                @{
                    type        = "STRING"
                    value       = "off"
                    displayName = "Full Max Age ms|s|m|h|d|w|M|y (default off)"
                    alias       = "-f"                    
                }                                                     
            )
            $body.extendedData.subTypes[0]="GENERIC_POSTGRES"    
        }        
        "GENERIC_POSTGRES" {
            $parameters       = @(
                @{
                    type        = "STRING"
                    value       = "5432"
                    displayName = "port"
                    alias       = "-p"
                }
                @{
                    type        = "STRING"
                    value       = "/var/lib/pgsql/wal_path"
                    displayName = "wal_path"
                    alias       = "-w"                    
                }
            )
        }
    }
        
        $body.add('parameters',$parameters)
        $body = $body | convertto-json 
        $Parameters = @{
            body             = $body 
            Uri              = $Uri
            Method           = $Method
            RequestMethod    = 'REST'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }      
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            default {
                Write-Host $Response
                write-host $response.Headers.Date
                Write-Host "Script has been set"
            } 
        }   
    }
}



<#
SYNOPSIS
#>


function Update-PPDMscripts {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]        
        [Parameter(Mandatory = $true, ParameterSetName = 'from_file' )]
        [ValidateSet(
            'BACKUP'
        )]
        $Type, 
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]           
        [Parameter(Mandatory = $true, ParameterSetName = 'from_file' )]  
        [ValidateSet(
            'GENERIC_POSTGRES',
            'GENERIC_MYSQL'
        )]
        $AssetSubType,                 
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]        
        [Parameter(Mandatory = $true, ParameterSetName = 'from_file' )]
        [System.IO.FileInfo]$scriptfile,  
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $true, ParameterSetName = 'from_file' )]
        [string]$scriptname, 
        [Parameter(Mandatory = $false, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $false, ParameterSetName = 'from_file' )]
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        [Parameter(Mandatory = $false, ParameterSetName = 'from_file' )]
        $apiver = "/api/v3"

    )
    begin {
        $Response = @()
        $METHOD = "PATCH"
        $Myself = 'scripts'
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            default {
                $URI = "/$myself"
            }
            'byID' {
                $URI = "/$myself/$id"
                $body = @{}  

            }
        } 
        $content = (Get-Content $scriptfile | Out-String )

        $body = @{
            name             = $scriptname
            type             = $TYPE
            osType           = "LINUX"
            description      = ""
            content          = $content
            systemPredefined = $false
            parameters       = @(
                @{
                    type        = "STRING"
                    value       = "5432"
                    displayName = "port"
                    alias       = "-p"
                }
                @{
                    type        = "STRING"
                    value       = "/var/lib/pgsql/wal_path"
                    displayName = "wal_path"
                    alias       = "-w"                    
                }
            )
            purpose          = "BACKUP"
            extendedData     = @{
                type     = "ASSET"
                subTypes = @(
                    "GENERIC_POSTGRES"
                )
            }
        } | convertto-json 
        $Parameters = @{
            body             = $body 
            Uri              = $Uri
            Method           = $Method
            RequestMethod    = 'REST'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }      
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            default {
                Write-Host $Response
                write-host $response.Headers.Date
                Write-Host "Script has been set"
            } 
        }   
    }
}

function Get-PPDMscripts {
    [CmdletBinding()]
    param(

        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        $filter,
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        [ValidateSet(
            ''
        )]
        $Type,        
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        $pageSize, 
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        $page, 
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        [hashtable]$body = @{orderby = 'createdAt DESC' },
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]                
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $apiver = "/api/v3"
    )

    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = ($MyInvocation.MyCommand.Name.Substring(8) -replace "_", "-").ToLower()
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/$myself/$id"
                $body = @{}  

            }
            default {
                $URI = "/$myself"
            }
        }  
        if ($pagesize) {
            $body.add('pageSize', $pagesize)
        }
        if ($page) {
            $body.add('page', $page)
        }   
        $Parameters = @{
            RequestMethod    = 'REST'
            body             = $body
            Uri              = $URI
            Method           = $Method
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }
        if ($type) {
            if ($filter) {
                $filter = 'type eq "' + $type + '" and ' + $filter 
            }
            else {
                $filter = 'type eq "' + $type + '"'
            }
        }        
        if ($filter) {
            $parameters.Add('filter', $filter)
        }       
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                write-output $response 
            }
            default {
                write-output $response.content
                if ($response.page) {
                    write-host ($response.page | out-string)
                }
            } 
        }   
    }
}


function Get-PPDMscript_contexts {
    [CmdletBinding()]
    param(

        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        $filter,
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        [ValidateSet(
            ''
        )]
        $Type,        
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        $pageSize, 
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        $page, 
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        [hashtable]$body = @{orderby = 'createdAt DESC' },
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]                
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $apiver = "/api/v3"
    )

    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = 'script-contexts'
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/$myself/$id"
                $body = @{}  

            }
            default {
                $URI = "/$myself"
            }
        }  
        if ($pagesize) {
            $body.add('pageSize', $pagesize)
        }
        if ($page) {
            $body.add('page', $page)
        }   
        $Parameters = @{
            RequestMethod    = 'REST'
            body             = $body
            Uri              = $URI
            Method           = $Method
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }
        if ($type) {
            if ($filter) {
                $filter = 'type eq "' + $type + '" and ' + $filter 
            }
            else {
                $filter = 'type eq "' + $type + '"'
            }
        }        
        if ($filter) {
            $parameters.Add('filter', $filter)
        }       
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                write-output $response 
            }
            default {
                write-output $response.content
                if ($response.page) {
                    write-host ($response.page | out-string)
                }
            } 
        }   
    }
}

function Get-PPDMscript_summaries {
    [CmdletBinding()]
    param(

        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $id,
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        $filter,
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        [ValidateSet(
            ''
        )]
        $Type,        
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        $pageSize, 
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        $page, 
        [Parameter(Mandatory = $false, ParameterSetName = 'all', ValueFromPipelineByPropertyName = $true)]
        [hashtable]$body = @{orderby = 'createdAt DESC' },
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]                
        $PPDM_API_BaseUri = $Global:PPDM_API_BaseUri,
        [Parameter(Mandatory = $false, ValueFromPipelineByPropertyName = $true)]
        $apiver = "/api/v3"
    )

    begin {
        $Response = @()
        $METHOD = "GET"
        $Myself = 'script-contexts'
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                $URI = "/$myself/$id"
                $body = @{}  

            }
            default {
                $URI = "/$myself"
            }
        }  
        if ($pagesize) {
            $body.add('pageSize', $pagesize)
        }
        if ($page) {
            $body.add('page', $page)
        }   
        $Parameters = @{
            RequestMethod    = 'REST'
            body             = $body
            Uri              = $URI
            Method           = $Method
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }
        if ($type) {
            if ($filter) {
                $filter = 'type eq "' + $type + '" and ' + $filter 
            }
            else {
                $filter = 'type eq "' + $type + '"'
            }
        }        
        if ($filter) {
            $parameters.Add('filter', $filter)
        }       
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            'byID' {
                write-output $response 
            }
            default {
                write-output $response.content
                if ($response.page) {
                    write-host ($response.page | out-string)
                }
            } 
        }   
    }
}


function Remove-PPDMscripts {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory = $true, ParameterSetName = 'byID', ValueFromPipelineByPropertyName = $true)]
        $id,
        $apiver = "/api/v3"

    )
    begin {
        $Response = @()
        $METHOD = "DELETE"
        $Myself = 'scripts'
   
    }     
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            default {
                $URI = "/$myself"
            }
            'byID' {
                $URI = "/$myself/$id"

            }
        } 

        $Parameters = @{
            Uri              = $Uri
            Method           = $Method
            RequestMethod    = 'REST'
            PPDM_API_BaseUri = $PPDM_API_BaseUri
            apiver           = $apiver
            Verbose          = $PSBoundParameters['Verbose'] -eq $true
        }      
        try {
            $Response += Invoke-PPDMapirequest @Parameters
        }
        catch {
            Get-PPDMWebException  -ExceptionMessage $_
            break
        }
        write-verbose ($response | Out-String)
    } 
    end {    
        switch ($PsCmdlet.ParameterSetName) {
            default {
                Write-Host $Response
                write-host $response.Headers.Date
                Write-Host "Script has been deleted"
            } 
        }   
    }
}