Nuget.psm1

enum ensures {
  Present
  Absent
}

enum policies {
  Trusted
  Untrusted
}

enum protocols {
  http
  https
}

Import-Module $PSScriptRoot\tools.psm1

[DscResource()]
class Nuget_Module {
  #Declare Properties
  [DscProperty(Key)]
  [ensures] $Ensure
  [DscProperty(Mandatory)]
  [string] $Name
  [DscProperty()]
  [string] $Version
  [DscProperty(Mandatory)]
  [string] $ProviderName
  
  # Gets the resource's current state.
  [Nuget_Module] Get () {
    return $this
  }
  
  # Tests if the resource is in the desired state.
  [bool] Test () {
    Import-Module $PSScriptRoot\tools.psm1
    return (Module -Ensure $this.ensure -Action Test -Name $this.Name)
  }
  
  # Sets the desired state of the resource.
  [void] Set () {
    Import-Module $PSScriptRoot\tools.psm1
    switch ($this.Version -eq $null) {
      $true {
        Module -Ensure $this.Ensure -Action Set -ProviderName $this.ProviderName -Name $this.Name
      }
      $false {
        Module -Ensure $this.Ensure -Action Set -ProviderName $this.ProviderName -Version $this.Version -Name $this.Name
      }
    }
  }
}

[DscResource()]
class Nuget_Package {
  #Declare Properties
  [DscProperty(Mandatory)]
  [ensures] $Ensure
  [DscProperty(Key)]
  [string] $Name
  [DscProperty()]
  [string] $Version
  [DscProperty(Mandatory)]
  [string] $ProviderName
  
  # Gets the resource's current state.
  [Nuget_Package] Get () {
    return $this
  }
  
  # Tests if the resource is in the desired state.
  [bool] Test () {
    Import-Module $PSScriptRoot\tools.psm1
    return (Package -Ensure $this.ensure -Action Test -Name $this.Name)
  }
  
  # Sets the desired state of the resource.
  [void] Set () {
    Import-Module $PSScriptRoot\tools.psm1
    switch ($this.Version -eq $null) {
      $true {
        Package -Ensure $this.Ensure -Action Set -ProviderName $this.ProviderName -Name $this.Name
      }
      $false {
        Package -Ensure $this.Ensure -Action Set -ProviderName $this.ProviderName -Version $this.Version -Name $this.Name
      }
    }
  }
}

[DSCResource()]
class PackageRepo {
  #Declare Properties
  [DscProperty(Mandatory)] 
  [ensures]$Ensure
  [DscProperty(Mandatory)]
  [string]$Name
  [DscProperty(Key)]
  [string]$ProviderName
  [DscProperty(Mandatory)]
  [string]$SourceUri
  [DscProperty(Mandatory)]
  [policies]$InstallPolicy
  #Define Methods
  #Get Method, gathers data about the system state
  [PackageRepo] Get () { 
    return $this
  } 
  
  #Test Method, tests if the system is in the desired state
  [bool] Test () { 
    Import-Module $PSScriptRoot\tools.psm1
    return (package_provider -Name $this.Name -Action test -Ensure $this.Ensure)
  } 
  
  #Replaces Set-TargetResource
  [void] Set () { 
    Import-Module $PSScriptRoot\tools.psm1
    Write-Verbose 'creating new provider'
    package_provider -Name $this.Name -Action set -SourceURI $this.SourceURI -Credential $this.Credential -Ensure $this.Ensure -ProviderName $this.ProviderName
  }
}

[DSCResource()]
class PSRepo {
  #Declare Properties
  [DscProperty(Mandatory)] 
  [ensures]$Ensure
  [DscProperty(Key)]
  [string]$Name
  [DscProperty()]
  [string]$PublishUri
  [DscProperty()]
  [string]$SourceUri
  [DscProperty()]
  [policies]$InstallPolicy = 'Trusted'
  #Define Methods
  #Get Method, gathers data about the system state
  [PSRepo] Get () { 
    return $this
  } 
  
  #Test Method, tests if the system is in the desired state
  [bool] Test () { 
    Import-Module $PSScriptRoot\tools.psm1
    return (provider -Name $this.Name -Action test -Ensure $this.Ensure)
  } 
  
  #Replaces Set-TargetResource
  [void] Set () { 
    Import-Module $PSScriptRoot\tools.psm1
    Write-Verbose 'creating new provider'
    provider -Name $this.Name -Action set -PublisherURI $this.PublishURI -SourceURI $this.SourceURI -Type $this.InstallPolicy -Credential $this.Credential -Ensure $this.Ensure
  }
}

[DSCResource()]
class NuGet {
  #Declare Properties
  [DscProperty(Key)] 
  [string]$PackageSource
  [DscProperty(Mandatory)]
  [string]$Name
  [DscProperty(Mandatory)]
  [int]$Port
  [DscProperty()]
  [protocols]$Protocol = 'http'
  [DscProperty(Mandatory)]
  [string]$APIKey
  [DscProperty()]
  [Boolean]$AllowNugetPackagePush
  [DscProperty()]
  [Boolean]$AllowPackageOverwrite
  #Define Methods
  #Get Method, gathers data about the system state
  [NuGet] Get () { 
    return $this
  } 
  
  #Test Method, tests if the system is in the desired state
  [bool] Test () { 
    Import-Module $PSScriptRoot\tools.psm1
    $Conf = webconfvar -AllowNugetPackagePush $This.AllowNugetPackagePush -AllowPackageOverwrite $This.AllowPackageOverwrite -PackageSource $This.PackageSource -APIKey $This.APIKey
    Write-Verbose 'Working on IIS install'
    if (! (IIS -Action test))
    {
      return $false
    }
    Write-Verbose 'Testing on ASPNet'
    if (! (ASP -Action test))
    {
      return $false
    }
    Write-Verbose 'Testing package directory'
    if (! (pkg -Action test -path $This.PackageSource))
    {
      return $false
    }
    Write-Verbose 'Testing for the website'
    if (! (website -Name $this.Name -Action Test))
    {
      return $false
    }
    Write-Verbose 'Checking WWWRoot files'
    if (! (Zip -Action test -Path $this.PackageSource ))
    {
      return $false
    }
    Write-Verbose 'Checking Web.config'
    if (! (webconf -Action test -Conf $Conf -Path "$($this.PackageSource)\Web.config"))
    {
      return $false
    }
    return $true
  } 
  
  #Replaces Set-TargetResource
  [void] Set () { 
    Import-Module $PSScriptRoot\tools.psm1
    $Conf = webconfvar -AllowNugetPackagePush $this.AllowNugetPackagePush -AllowPackageOverwrite $this.AllowPackageOverwrite -PackageSource $this.PackageSource -APIKey $this.APIKey
    Write-Verbose 'Working on IIS install'
    if (! (IIS -Action test))
    {
      Write-Verbose 'Installing IIS'
      IIS -Action set
    }
    Write-Verbose 'Working on ASPNet'
    if (! (ASP -Action test))
    {
      Write-Verbose 'Installing ASPNet'
      ASP -Action set
    }
    Write-Verbose 'Working on package directory'
    if (! (pkg -Action test -path $This.PackageSource))
    {
      Write-Verbose 'Creating Package directory'
      pkg -Action set -path $This.PackageSource
    }
    Write-Verbose 'Testing for the website'
    if (! (website -Name $this.Name -Action Test))
    {
      switch ($this.Protocol) {
        http {
          website -Name $this.Name -Action Set -Port $this.Port -Path $this.PackageSource
        }
        https {
          website -Name $this.Name -Action Set -Port $this.Port -Path $this.PackageSource -Ssl
        }
      } 
    }
    Write-Verbose 'Checking WWWRoot files'
    if (! (Zip -Action test ))
    {
      Write-Verbose 'Building out wwwroot'
      Zip -Action set -Path $this.PackageSource
    }
    Write-Verbose 'Checking Web.config'
    if (! (webconf -Action test -Conf $Conf -Path "$($this.PackageSource)\Web.config"))
    {
      Write-Verbose 'setting web.config'
      webconf -Action set -Conf $Conf -Path "$($this.PackageSource)\Web.config"
    }
  }
}