resources/app.ps1

function Copy-QlikApp {
  [CmdletBinding()]
  param (
    [parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,Position=0)]
    [string]$id,
    [parameter(ValueFromPipelinebyPropertyName=$True,Position=1)]
    [string]$name
  )

  PROCESS {
    $path = "/qrs/app/$id/copy"
    If( $name ) {
      $name = [System.Web.HttpUtility]::UrlEncode($name)
      $path += "?name=$name"
    }

    return Invoke-QlikPost $path
  }
}

function Export-QlikApp {
  [CmdletBinding()]
  param (
    [parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,Position=0)]
    [string]$id,
    [parameter(ValueFromPipelinebyPropertyName=$True,Position=1)]
        [string]$filename,
        [switch]$SkipData
  )

  PROCESS {
      if ($PSBoundParameters.ContainsKey("Skipdata")){$SkipFilter = "?skipdata=$($SkipData.IsPresent)"}else{$SkipFilter = ""}
      Write-Verbose filename=$filename
    If( [string]::IsNullOrEmpty($filename) ) {
      $file = "$id.qvf"
    } else {
      $file = $filename
    }
    Write-Verbose file=$file
      $guid = [guid]::NewGuid()
      $app = Invoke-QlikPost /qrs/app/$id/export/$($guid)$SkipFilter
    Invoke-QlikDownload -path "$($app.downloadPath)" $file
    Write-Verbose "Downloaded $id to $file"
  }
}

function Get-QlikApp {
  [CmdletBinding(DefaultParameterSetName="Multi")]
  param (
    [parameter(ParameterSetName="Single",Mandatory=$false,Position=0)]
    [string]$id,

    [parameter(ParameterSetName="Multi",Mandatory=$false)]
    [string]$filter,

    [parameter(ParameterSetName="Multi",Mandatory=$false)]
    [switch]$full,

    [switch]$raw
  )

  PROCESS {
    $path = "/qrs/app"
    If( $id ) { $path += "/$id" }
    If( $full ) { $path += "/full" }
    If( $raw ) { $rawOutput = $true }
    return Invoke-QlikGet $path $filter
  }
}

function Import-QlikApp {
  [CmdletBinding()]
  param (
    [parameter(Mandatory=$true,Position=0)]
    [string]$file,

    [parameter(Position=1)]
    [string]$name,

    [switch]$upload
  )

  PROCESS {
    If( $name ) {
      $appName = $name
    } Else {
      $appName = $(Get-ChildItem $file).BaseName
    }
    $appName = [System.Web.HttpUtility]::UrlEncode($appName)
    $path = "/qrs/app/{0}?name=$appName"
    If( $upload ) {
      $path = $path -f 'upload'
      return Invoke-QlikUpload $path $file
    } else {
      $path = $path -f 'import'
      return Invoke-QlikPost $path $file
    }
  }
}

function Publish-QlikApp {
  [CmdletBinding()]
  param (
    [parameter(Mandatory=$true,Position=0,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True)]
    [string]$id,

    [parameter(Mandatory=$true,Position=1)]
    [string]$stream,

    [string]$name
  )

  PROCESS {
    If( $stream -match $script:guid ) {
      $streamId = $stream
    } else {
      $streamId = $(Get-QlikStream -filter "name eq '$stream'").id
    }

    $path = "/qrs/app/$id/publish?stream=$streamId"

    If( $name )
    {
      $name = [System.Web.HttpUtility]::UrlEncode($name)
      $path += "&name=$name"
    }

    return Invoke-QlikPut $path
  }
}

function Remove-QlikApp {
  [CmdletBinding()]
  param (
    [parameter(Position=0,ValueFromPipelinebyPropertyName=$true)]
    [string]$id
  )

  PROCESS {
    return Invoke-QlikDelete "/qrs/app/$id"
  }
}

function Select-QlikApp {
  [CmdletBinding()]
  param (
    #[parameter(Position=0)]
    #[string]$id,
    [string]$filter
    #[switch]$full,
    #[switch]$raw
  )

  PROCESS {
    $path = "/qrs/selection/app"
    #If( $id ) { $path += "/$id" }
    #If( $full ) { $path += "/full" }
    return Invoke-QlikPost "$path?$filter"
  }
}

function Switch-QlikApp {
  [CmdletBinding()]
  param (
    # ID of the app that is used to replace another app
    [parameter(ParameterSetName="Param",Mandatory=$true,Position=0,ValueFromPipelinebyPropertyName=$True)]
    [string]$id,

    # ID of the app to be replaced
    [parameter(Mandatory=$true,Position=1)]
    [string]$appId,

    [parameter(ParameterSetName="Object",Mandatory=$true,ValueFromPipeline=$True)]
    $InputObject,

    [parameter(ParameterSetName="Object")]
    [switch]$Passthru
  )

  PROCESS {
    if($PsCmdlet.ParameterSetName -eq "Object") {
      $id = $InputObject.id
    }
    $result = Invoke-QlikPut "/qrs/app/$id/replace?app=$appId"
    if($Passthru) {
      return $InputObject
    } else {
      return $result
    }
  }
}

function Update-QlikApp {
  [CmdletBinding()]
  param (
    [parameter(Mandatory=$true,ValueFromPipeline=$True,ValueFromPipelinebyPropertyName=$True,Position=0)]
    [string]$id,

    [string]$name,
    [string]$description,
    [string[]]$customProperties,
    [string[]]$tags,
    [string]$ownername,
    
    [string]$ownerId,
    [string]$ownerDirectory
  )

  PROCESS {
    $app = Get-QlikApp $id -raw
    If( $name ) { $app.name = $name }
    If( $description ) { $app.description = $description }
    If( $customProperties ) {
      $prop = @(
        $customProperties | ForEach-Object {
          $val = $_ -Split "="
          $p = Get-QlikCustomProperty -filter "name eq '$($val[0])'" -raw
          @{
            value = ($p.choiceValues -eq $val[1])[0]
            definition = $p
          }
        }
      )
      $app.customProperties = $prop
    }

    If( $PSBoundParameters.ContainsKey("tags") ) {
      $prop = @(
        $tags | Where-Object {$_} | ForEach-Object {
          $p = Get-QlikTag -filter "name eq '$_'"
          @{
            id = $p.id
          }
        }
      )
      $app.tags = $prop
    }

    If( $ownername ) {
      $prop = Get-QlikUser -filter "name eq '$($ownername)'"
      $app.owner = $prop
    }
    If( $ownerId -and $ownerDirectory ) {
      $prop = Get-QlikUser -filter "userid eq '$($ownerId)' and userdirectory eq '$($ownerDirectory)'"
      $app.owner = $prop
    }

    $json = $app | ConvertTo-Json -Compress -Depth 10
    return Invoke-QlikPut "/qrs/app/$id" $json
  }
}