Install-BCAppFromRepo.ps1

function Install-BCAppFromRepo {
  <#
   
  .SYNOPSIS
    Creates BC container
  .DESCRIPTION
    Creates BC container
  .PARAMETER serverInstance
    Name of server instance
  .PARAMETER companyName
    Name of the company in the DevOps URL
  .PARAMETER repoName
    Name of the Azure BLOB Container where the app file are stored
  .PARAMETER AppName
    Name of the Dynapro App
  .PARAMETER unPublish
    Unpublish the lower version after publishing and upgrading
  .Parameter ForceSync
    Run the sync function with the Force mode. It can delete data in the app
   
  .EXAMPLE
   
  Install-BCApp -serverInstance $serverInstance -repoName 'Dynapro Base' -AppName 'Dynapro Base' -unPublish
   
  #>

  [CmdletBinding()]
  Param(
    [string] $serverInstance,
    [string] $companyName,
    [string] $repoName,
    [string] $AppName,
    [switch] $unPublish,
    [switch] $ForceSync,
    [string] $AppRootFolder = 'C:\Dynapro\BC'
  )
  PROCESS {
    $AppFolder = Join-Path $AppRootFolder 'apps'
    $ArchiveFolder = Join-Path $AppFolder 'Archive'
    if (!(Test-Path -Path $AppFolder )) {
      Write-Host -ForegroundColor Yellow "Creating folder "  $AppFolder 
      New-Item -ItemType directory -Path $AppFolder
    }
    if (!(Test-Path -Path $ArchiveFolder )) {
      Write-Host -NoNewLine -ForegroundColor Yellow "Creating folder "  $ArchiveFolder 
      New-Item -ItemType directory -Path $ArchiveFolder
    }
    $source = "https://$companyName.blob.core.windows.net/$repoName/latest/apps.zip"
    write-Host -ForegroundColor Yellow "Downloading file from URL " $source 
    $destination = Join-Path $AppFolder ($repoName + '_latest.zip') 
    if ([System.IO.File]::Exists($destination)) {
      write-Host ForegroundColor Yellow "Move file from URL " $destination " to " $ArchiveFolder
      Get-ChildItem -Path $destination | Move-Item -Destination $ArchiveFolder -Force
    }
    try { 
      $webClient = [System.Net.WebClient]::new()
      $webClient.DownloadFile($source, $destination)
    }
    catch [Exception] {
      "Install-BCApp DownloadFile:`n`n " + $_.Exception
    }
    Expand-Archive -Path $destination -DestinationPath $AppRootFolder -Force
    $NewestAppFileName = 'Dynapro AS_' + $AppName + '_*.app'
    $AppFileName = Join-Path -Path $AppFolder -ChildPath $NewestAppFileName -Resolve | Sort-Object Name -Descending | Select-Object -First 1
    if ([System.IO.File]::Exists($AppFileName)) {
      Publish-NAVApp -ServerInstance $ServerInstance -SkipVerification -Path $AppFileName 
      $AppsInfo = @()
      $AppsInfo += Get-NAVAppInfo -ServerInstance $ServerInstance | Where-Object { ($_.Name -like $AppName) } 
      if ($AppsInfo.Count -gt 1) {
        $ToVersion = [version]$AppsInfo[0].Version
        $FromVersion = @()
        foreach ($AppInfo in $AppsInfo) {
          if ([version]$AppInfo.Version -gt [version]$ToVersion) {
            $FromVersion += [version]$ToVersion
            $ToVersion = [version]$AppInfo.Version
          }
          else {
            if ([version]$AppInfo.Version -lt [version]$ToVersion) {
              $FromVersion += [version]$AppInfo.Version
            }
          }
        }
        Write-Host -NoNewLine -ForegroundColor Yellow "Upgrading "  $AppName 
        Write-Host -NoNewLine -ForegroundColor Yellow "Upgrading From Version "  $FromVersion
        Write-Host -NoNewLine -ForegroundColor Yellow "Upgrading To Version "  $ToVersion
        try { 
          if ($ForceSync) {
            Sync-NavApp -ServerInstance $ServerInstance -Name $AppName -Version $ToVersion -Mode ForceSync
          }
          else {
            Sync-NavApp -ServerInstance $ServerInstance -Name $AppName -Version $ToVersion
          }
          try { 
            Start-NAVAppDataUpgrade -ServerInstance $ServerInstance -Name $AppName -Version $ToVersion
          }
          catch [Exception] {
            "Install-BCApp Start-NAVAppDataUpgrade:`n`n " + $_.Exception
          }
        }
        catch [Exception] {
          "Install-BCApp failed with error:`n`n " + $_.Exception
        }
        try { 
          if ($Unpublish) {
            if ($FromVersion.Count -ge 1) {
              foreach ($Version in $FromVersion) {
                Unpublish-NavApp -ServerInstance $ServerInstance -Name $AppName -Version $Version
              }
            }
          }
        }
        catch [Exception] {
          "Install-BCApp Unpublish-NavApp:`n`n " + $_.Exception
        }
        if ([System.IO.File]::Exists($AppFileName)) {
          write-Host "Move file from " $AppFileName" to " $ArchiveFolder
          Get-ChildItem -Path $AppFileName | Move-Item -Destination $ArchiveFolder -Force
        }
        if ([System.IO.File]::Exists($destination)) {
          write-Host "Move file from " $destination" to " $ArchiveFolder
          Get-ChildItem -Path $destination | Move-Item -Destination $ArchiveFolder -Force
        }
        write-Host  $AppName "is upraded to version " $ToVersion
      }
      else {
        Write-Host $AppName $AppsInfo[0].Version "is already installed"
      }
    }
    else {
      Write-Host "app file is missing"
    }
  }
}
Export-ModuleMember -Function Install-BCAppFromRepo
# SIG # Begin signature block
# MIIVlQYJKoZIhvcNAQcCoIIVhjCCFYICAQExCzAJBgUrDgMCGgUAMGkGCisGAQQB
# gjcCAQSgWzBZMDQGCisGAQQBgjcCAR4wJgIDAQAABBAfzDtgWUsITrck0sYpfvNR
# AgEAAgEAAgEAAgEAAgEAMCEwCQYFKw4DAhoFAAQUFQueVxV81AKq8rtGGWfJw4eJ
# KeygghH1MIIFbzCCBFegAwIBAgIQSPyTtGBVlI02p8mKidaUFjANBgkqhkiG9w0B
# AQwFADB7MQswCQYDVQQGEwJHQjEbMBkGA1UECAwSR3JlYXRlciBNYW5jaGVzdGVy
# MRAwDgYDVQQHDAdTYWxmb3JkMRowGAYDVQQKDBFDb21vZG8gQ0EgTGltaXRlZDEh
# MB8GA1UEAwwYQUFBIENlcnRpZmljYXRlIFNlcnZpY2VzMB4XDTIxMDUyNTAwMDAw
# MFoXDTI4MTIzMTIzNTk1OVowVjELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3Rp
# Z28gTGltaXRlZDEtMCsGA1UEAxMkU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5n
# IFJvb3QgUjQ2MIICIjANBgkqhkiG9w0BAQEFAAOCAg8AMIICCgKCAgEAjeeUEiIE
# JHQu/xYjApKKtq42haxH1CORKz7cfeIxoFFvrISR41KKteKW3tCHYySJiv/vEpM7
# fbu2ir29BX8nm2tl06UMabG8STma8W1uquSggyfamg0rUOlLW7O4ZDakfko9qXGr
# YbNzszwLDO/bM1flvjQ345cbXf0fEj2CA3bm+z9m0pQxafptszSswXp43JJQ8mTH
# qi0Eq8Nq6uAvp6fcbtfo/9ohq0C/ue4NnsbZnpnvxt4fqQx2sycgoda6/YDnAdLv
# 64IplXCN/7sVz/7RDzaiLk8ykHRGa0c1E3cFM09jLrgt4b9lpwRrGNhx+swI8m2J
# mRCxrds+LOSqGLDGBwF1Z95t6WNjHjZ/aYm+qkU+blpfj6Fby50whjDoA7NAxg0P
# OM1nqFOI+rgwZfpvx+cdsYN0aT6sxGg7seZnM5q2COCABUhA7vaCZEao9XOwBpXy
# bGWfv1VbHJxXGsd4RnxwqpQbghesh+m2yQ6BHEDWFhcp/FycGCvqRfXvvdVnTyhe
# Be6QTHrnxvTQ/PrNPjJGEyA2igTqt6oHRpwNkzoJZplYXCmjuQymMDg80EY2NXyc
# uu7D1fkKdvp+BRtAypI16dV60bV/AK6pkKrFfwGcELEW/MxuGNxvYv6mUKe4e7id
# FT/+IAx1yCJaE5UZkADpGtXChvHjjuxf9OUCAwEAAaOCARIwggEOMB8GA1UdIwQY
# MBaAFKARCiM+lvEH7OKvKe+CpX/QMKS0MB0GA1UdDgQWBBQy65Ka/zWWSC8oQEJw
# IDaRXBeF5jAOBgNVHQ8BAf8EBAMCAYYwDwYDVR0TAQH/BAUwAwEB/zATBgNVHSUE
# DDAKBggrBgEFBQcDAzAbBgNVHSAEFDASMAYGBFUdIAAwCAYGZ4EMAQQBMEMGA1Ud
# HwQ8MDowOKA2oDSGMmh0dHA6Ly9jcmwuY29tb2RvY2EuY29tL0FBQUNlcnRpZmlj
# YXRlU2VydmljZXMuY3JsMDQGCCsGAQUFBwEBBCgwJjAkBggrBgEFBQcwAYYYaHR0
# cDovL29jc3AuY29tb2RvY2EuY29tMA0GCSqGSIb3DQEBDAUAA4IBAQASv6Hvi3Sa
# mES4aUa1qyQKDKSKZ7g6gb9Fin1SB6iNH04hhTmja14tIIa/ELiueTtTzbT72ES+
# BtlcY2fUQBaHRIZyKtYyFfUSg8L54V0RQGf2QidyxSPiAjgaTCDi2wH3zUZPJqJ8
# ZsBRNraJAlTH/Fj7bADu/pimLpWhDFMpH2/YGaZPnvesCepdgsaLr4CnvYFIUoQx
# 2jLsFeSmTD1sOXPUC4U5IOCFGmjhp0g4qdE2JXfBjRkWxYhMZn0vY86Y6GnfrDyo
# XZ3JHFuu2PMvdM+4fvbXg50RlmKarkUT2n/cR/vfw1Kf5gZV6Z2M8jpiUbzsJA8p
# 1FiAhORFe1rYMIIGGjCCBAKgAwIBAgIQYh1tDFIBnjuQeRUgiSEcCjANBgkqhkiG
# 9w0BAQwFADBWMQswCQYDVQQGEwJHQjEYMBYGA1UEChMPU2VjdGlnbyBMaW1pdGVk
# MS0wKwYDVQQDEyRTZWN0aWdvIFB1YmxpYyBDb2RlIFNpZ25pbmcgUm9vdCBSNDYw
# HhcNMjEwMzIyMDAwMDAwWhcNMzYwMzIxMjM1OTU5WjBUMQswCQYDVQQGEwJHQjEY
# MBYGA1UEChMPU2VjdGlnbyBMaW1pdGVkMSswKQYDVQQDEyJTZWN0aWdvIFB1Ymxp
# YyBDb2RlIFNpZ25pbmcgQ0EgUjM2MIIBojANBgkqhkiG9w0BAQEFAAOCAY8AMIIB
# igKCAYEAmyudU/o1P45gBkNqwM/1f/bIU1MYyM7TbH78WAeVF3llMwsRHgBGRmxD
# eEDIArCS2VCoVk4Y/8j6stIkmYV5Gej4NgNjVQ4BYoDjGMwdjioXan1hlaGFt4Wk
# 9vT0k2oWJMJjL9G//N523hAm4jF4UjrW2pvv9+hdPX8tbbAfI3v0VdJiJPFy/7Xw
# iunD7mBxNtecM6ytIdUlh08T2z7mJEXZD9OWcJkZk5wDuf2q52PN43jc4T9OkoXZ
# 0arWZVeffvMr/iiIROSCzKoDmWABDRzV/UiQ5vqsaeFaqQdzFf4ed8peNWh1OaZX
# nYvZQgWx/SXiJDRSAolRzZEZquE6cbcH747FHncs/Kzcn0Ccv2jrOW+LPmnOyB+t
# AfiWu01TPhCr9VrkxsHC5qFNxaThTG5j4/Kc+ODD2dX/fmBECELcvzUHf9shoFvr
# n35XGf2RPaNTO2uSZ6n9otv7jElspkfK9qEATHZcodp+R4q2OIypxR//YEb3fkDn
# 3UayWW9bAgMBAAGjggFkMIIBYDAfBgNVHSMEGDAWgBQy65Ka/zWWSC8oQEJwIDaR
# XBeF5jAdBgNVHQ4EFgQUDyrLIIcouOxvSK4rVKYpqhekzQwwDgYDVR0PAQH/BAQD
# AgGGMBIGA1UdEwEB/wQIMAYBAf8CAQAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwGwYD
# VR0gBBQwEjAGBgRVHSAAMAgGBmeBDAEEATBLBgNVHR8ERDBCMECgPqA8hjpodHRw
# Oi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2RlU2lnbmluZ1Jvb3RS
# NDYuY3JsMHsGCCsGAQUFBwEBBG8wbTBGBggrBgEFBQcwAoY6aHR0cDovL2NydC5z
# ZWN0aWdvLmNvbS9TZWN0aWdvUHVibGljQ29kZVNpZ25pbmdSb290UjQ2LnA3YzAj
# BggrBgEFBQcwAYYXaHR0cDovL29jc3Auc2VjdGlnby5jb20wDQYJKoZIhvcNAQEM
# BQADggIBAAb/guF3YzZue6EVIJsT/wT+mHVEYcNWlXHRkT+FoetAQLHI1uBy/YXK
# ZDk8+Y1LoNqHrp22AKMGxQtgCivnDHFyAQ9GXTmlk7MjcgQbDCx6mn7yIawsppWk
# vfPkKaAQsiqaT9DnMWBHVNIabGqgQSGTrQWo43MOfsPynhbz2Hyxf5XWKZpRvr3d
# MapandPfYgoZ8iDL2OR3sYztgJrbG6VZ9DoTXFm1g0Rf97Aaen1l4c+w3DC+IkwF
# kvjFV3jS49ZSc4lShKK6BrPTJYs4NG1DGzmpToTnwoqZ8fAmi2XlZnuchC4NPSZa
# PATHvNIzt+z1PHo35D/f7j2pO1S8BCysQDHCbM5Mnomnq5aYcKCsdbh0czchOm8b
# kinLrYrKpii+Tk7pwL7TjRKLXkomm5D1Umds++pip8wH2cQpf93at3VDcOK4N7Ew
# oIJB0kak6pSzEu4I64U6gZs7tS/dGNSljf2OSSnRr7KWzq03zl8l75jy+hOds9TW
# SenLbjBQUGR96cFr6lEUfAIEHVC1L68Y1GGxx4/eRI82ut83axHMViw1+sVpbPxg
# 51Tbnio1lB93079WPFnYaOvfGAA0e0zcfF/M9gXr+korwQTh2Prqooq2bYNMvUoU
# KD85gnJ+t0smrWrb8dee2CvYZXD5laGtaAxOfy/VKNmwuWuAh9kcMIIGYDCCBMig
# AwIBAgIRANm8nd1n4WvloMcEQ5z43dkwDQYJKoZIhvcNAQEMBQAwVDELMAkGA1UE
# BhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRlZDErMCkGA1UEAxMiU2VjdGln
# byBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNjAeFw0yMTEwMjIwMDAwMDBaFw0y
# NDEwMjEyMzU5NTlaMEcxCzAJBgNVBAYTAk5PMQ4wDAYDVQQIDAVWaWtlbjETMBEG
# A1UECgwKRHluYXBybyBBUzETMBEGA1UEAwwKRHluYXBybyBBUzCCAiIwDQYJKoZI
# hvcNAQEBBQADggIPADCCAgoCggIBAODd7SFuO0KPfAVdjt1o/NGqrIZXT7qOqrrL
# jI+cheKE/mCHJXFyHWAXgvNz5h++mTAG4bHGDYMYGplt+S3INAm2lnkh3kxerfLP
# +kmjaiQ/cT4nXomJkpAXnlVaoSXcJDcWDBDsmkD1+lFjE9nbEdeJOvQ4Q72Cn7OH
# sXthZchhiVJfPP0wywFG/uQsCMXgOqUFJwrpvOLOIqTUTH4+ZiwelFeGq4T+CEtF
# ic8rL8f6/lYotRv1MoRYsmV7iDnrY7e1drswAiv8bQNi842LfQ62uSCS4cYHpPOt
# b3rbqZHzTuL2o9Nqz2NcffwG4mkrKyYiWCvOKKg868z7/jc8uiMSt500SiJyjQA9
# zM0pqH1EbWIUBufpJuSc0TqnxxI0DG9z3m5xGV5Sydz5zfHVWhXP/nXtsf+8dAIT
# 1zUEC4HfMtVO/X3NVaZYmYwpmAuscVJCxdm786XLMTe3Nh18v1RdTn28uxr0JnoR
# wsmPRoYyJkUb3nbh1q+xMHv75QV3KPlfTe1UwpEs7K9YnOfpXLcJhn0u13ENN5Sm
# FNznnfkGxP0jSI5MZ3f2EI7ks1TsjZNeTSznW94hQz36Ttehm8y7uL5ew4jajYeW
# 6OUu/zGhJCpZNP2Hfyi0f06ISyJFWkog1Q3G0udZhUYf31pJ6G42ZxqS5ihdPLmG
# 1dYLGWd9AgMBAAGjggG4MIIBtDAfBgNVHSMEGDAWgBQPKssghyi47G9IritUpimq
# F6TNDDAdBgNVHQ4EFgQUx2vSVcLaMddlQfJKC3538TBe1ecwDgYDVR0PAQH/BAQD
# AgeAMAwGA1UdEwEB/wQCMAAwEwYDVR0lBAwwCgYIKwYBBQUHAwMwEQYJYIZIAYb4
# QgEBBAQDAgQQMEoGA1UdIARDMEEwNQYMKwYBBAGyMQECAQMCMCUwIwYIKwYBBQUH
# AgEWF2h0dHBzOi8vc2VjdGlnby5jb20vQ1BTMAgGBmeBDAEEATBJBgNVHR8EQjBA
# MD6gPKA6hjhodHRwOi8vY3JsLnNlY3RpZ28uY29tL1NlY3RpZ29QdWJsaWNDb2Rl
# U2lnbmluZ0NBUjM2LmNybDB5BggrBgEFBQcBAQRtMGswRAYIKwYBBQUHMAKGOGh0
# dHA6Ly9jcnQuc2VjdGlnby5jb20vU2VjdGlnb1B1YmxpY0NvZGVTaWduaW5nQ0FS
# MzYuY3J0MCMGCCsGAQUFBzABhhdodHRwOi8vb2NzcC5zZWN0aWdvLmNvbTAaBgNV
# HREEEzARgQ9wb3N0QGR5bmFwcm8ubm8wDQYJKoZIhvcNAQEMBQADggGBAAe6J7g+
# cJ7iWZ1DyGKy/2Ber7rIqOeiLi16R3xz8l21++ruItAygqW3JBtLj5cAxCAgJJZe
# XlShKQh+fuoSxIWEWCpMC0k8865hZIhjzfX/TKdF4Bs4VsJqha72j412IITjNNnf
# ZxfZninStkY2wA1M7D7YZUYEqnN+9UO8iEVO4SY8aKIm4YCXI5LlpDoonXGqY/yA
# YBUvMRGutUNBoNWToY8xHeavrEZ/S5CUOzaeRByG9NMYtbfLJjV5APo1Aup0hZWj
# 424wSAWt8tkc+wErO/s1yMZqU8lw/ucqXB2WirvJr4zeJMh3RywOscJfxg8WONu0
# UVlHkly6DGurGpqM1ekFIFXVko/RPuaoIhsuTpO9rZTDTcZ5tNej3jzk8scDqOSo
# SsgrEDE3XeVXlyZD2p6P2XJzoSdZwfsHRlY/Ji0gyB9dBuxicOmcKk1fxvVgcjm6
# 6wjiMHOrZa2JiIxYtBVGinEEMU83eyq0deVNO1DqZcuLGAyGH4p96dKEYDGCAwow
# ggMGAgEBMGkwVDELMAkGA1UEBhMCR0IxGDAWBgNVBAoTD1NlY3RpZ28gTGltaXRl
# ZDErMCkGA1UEAxMiU2VjdGlnbyBQdWJsaWMgQ29kZSBTaWduaW5nIENBIFIzNgIR
# ANm8nd1n4WvloMcEQ5z43dkwCQYFKw4DAhoFAKB4MBgGCisGAQQBgjcCAQwxCjAI
# oAKAAKECgAAwGQYJKoZIhvcNAQkDMQwGCisGAQQBgjcCAQQwHAYKKwYBBAGCNwIB
# CzEOMAwGCisGAQQBgjcCARUwIwYJKoZIhvcNAQkEMRYEFPWtfJm8sWmpgwV+QV1j
# ywmvZ+LPMA0GCSqGSIb3DQEBAQUABIICACxcDIA8y8DmyROUjrERQQi86hfrMd6g
# ZrvkER3OKdMNIWnxclXu7V5uSX+hoZaQqVprf7OTE4PB3V9MWC3R3iDPHh00qRuB
# 6X3Qo6VFdcsOJIbS4OZo8AlpIdYAhyZqfhxSqcj1JWA7Vp16sgDS98ImmfAdWNTs
# GbOJICZLzNE0F5bmRjjzJSwiKN742Dkq5QvNY6frwyqeYQof2I+uA80ffoWCNzoO
# lJtmDMWUxULTqXgHFy5o2yokrBuOaJ/IwYla95Bl6UnWhL+EJFODAqdocDiNivLD
# 5uPj23b/zaRv4xy+kHZiqfucLBYNZBfVZANjyf4wFVkLh7Mypz15ptB4y0f7TsMU
# 2wyngRCdvySP595Q3iA6coIuuUnnN6c/b/0YUaYhC8YZOY8wt8tGuX3ZlSYJjAHM
# HSMHU3lw/lWXhcpu5GnAGvghZR5XfbVYSKb39P4Co2f1+3HZ8nFDoIRx97MICovm
# sYdJyw1+YbEPs3JJTvFtrSJzFac9qSInhSeTN7jyGAgXr8lwcm6gHT2E5qn5p9EF
# K7FwJ9JXmi5SDobrFRlP2dKnIMEJk63ApjR4lr/NVyk37QOFq34b9jkBXy7fwn7O
# 704qpY6brghqeTd6MwTzhZOC1s+6j7/pTlQd6ZW6iskMQq+oBhOMK2PGHEJmPkw5
# MF+iCItFnrYW
# SIG # End signature block