Private/Get-AtwsParameterDefinition.ps1

Function Get-AtwsParameterDefinition
{
  [CmdLetBinding()]
  Param
  (   
    [Parameter(Mandatory)]
    [Autotask.EntityInfo]
    $Entity,
        
    [Parameter(Mandatory)]
    [ValidateSet('Get', 'Set', 'New', 'Remove')]
    [String]
    $Verb,
        
    [Parameter(Mandatory)]
    [Autotask.Field[]]
    $FieldInfo
  )
  Begin
  {
      
  }

  Process
  { 
    $TypeName = 'Autotask.{0}' -F $Entity.Name
      
        If ($Verb -eq 'Get') {
          $Comment = 'A filter that limits the number of objects that is returned from the API'
          Get-AtwsPSParameter -Name 'Filter' -SetName 'Filter' -Type 'String' -Mandatory -Remaining -NotNull  -Array -Comment $Comment
          $ReferenceFields = $FieldInfo.Where( {$_.IsReference}).Name
          $Comment = 'Follow this external ID and return any external objects'            
          Get-AtwsPSParameter -Name 'GetReferenceEntityById' -Alias 'GetRef' -SetName 'Filter', 'By_parameters' -Type 'String' -NotNull -ValidateSet $ReferenceFields -Comment $Comment
          $Comment = 'Return all objects in one query'    
          Get-AtwsPSParameter -Name 'All' -SetName 'Get_all' -Type 'Switch' -Comment $Comment
          $Comment = 'Add descriptions for all picklist attributes with values'
          Get-AtwsPSParameter -Name 'AddPickListLabel' -SetName 'Filter','Get_All','By_parameters' -Type 'Switch' -Comment $Comment
          If ($Entity.HasUserDefinedFields) {
            $Comment = 'A single user defined field can be used pr query'
            Get-AtwsPSParameter -Name 'UserDefinedField' -Alias 'UDF' -SetName 'By_parameters' -Type 'Autotask.UserDefinedField' -NotNull -Comment $Comment
          }
        }    
        ElseIf ($Verb -eq 'Set') {
          $Comment = 'An object that will be modified by any parameters and updated in Autotask'
          Get-AtwsPSParameter -Name 'InputObject' -SetName 'Input_Object' -Type $TypeName -Mandatory -Pipeline -NotNull -Array -Comment $Comment
          $Comment = 'The object.ids of objects that should be modified by any parameters and updated in Autotask'
          $Field = $FieldInfo.Where({$_.Name -eq 'Id'})
          Get-AtwsPSParameter -Name 'Id' -SetName 'By_parameters' -Type $Field.Type -Mandatory -NotNull -Array -Comment $Comment
          $Comment = 'Return any updated objects through the pipeline'
          Get-AtwsPSParameter -Name 'PassThru' -SetName 'Input_Object','By_parameters' -Type 'Switch' -Comment $Comment
          If ($Entity.HasUserDefinedFields) {
            $Comment = 'User defined fields already setup i Autotask'
            Get-AtwsPSParameter -Name 'UserDefinedFields' -Alias 'UDF' -SetName 'Input_Object','By_parameters' -Type 'Autotask.UserDefinedField' -Array -Comment $Comment
          }
        }
        ElseIf ($Verb -in 'New') {
          $Comment = 'An array of objects to create'          
          Get-AtwsPSParameter -Name 'InputObject' -SetName 'Input_Object' -Type $TypeName -Mandatory -Pipeline -NotNull -Array -Comment $Comment
          If ($Entity.HasUserDefinedFields) {
            $Comment = 'User defined fields already setup i Autotask'
            Get-AtwsPSParameter -Name 'UserDefinedFields' -Alias 'UDF' -SetName 'By_parameters' -Type 'Autotask.UserDefinedField' -NotNull -Array -Comment $Comment
          }
        }
        ElseIf ($Verb -eq 'Remove') {
          $Comment = 'Any objects that should be deleted'          
          Get-AtwsPSParameter -Name 'InputObject' -SetName 'Input_Object' -Type $TypeName -Mandatory -Pipeline -NotNull -Array -Comment $Comment
          $Comment = 'The unique id of an object to delete'
          $Field = $FieldInfo.Where({$_.Name -eq 'Id'})
          Get-AtwsPSParameter -Name 'Id' -SetName 'By_parameters' -Type $Field.Type -Mandatory  -NotNull -Array -Comment $Comment
        }
    

    Switch ($Verb)
    {
      'Get' 
      { 
        $Fields = $FieldInfo.Where({
            $_.IsQueryable
        }) | ForEach-Object -Process {
          $_.Mandatory = $False
          $_
        }
      }
      'Set' 
      { 
        $Fields = $FieldInfo.Where({
            -Not $_.IsReadOnly
        }) | ForEach-Object -Process {
          $_.ParameterSet = 'Input_Object','By_parameters'
          $_
        }
      }
      'New' 
      {
        $Fields = $FieldInfo.Where({
            $_.Name -ne 'Id'
        })
      }
      default 
      {
        Return
      }

    }
    
    # Add Name alias for EntityName parameters
    $EntityNameParameter = '{0}Name' -f $Entity.Name
    Foreach ($Field in $Fields )
    {
      $Type = Switch ($Field.Type) 
      {
        'Integer' 
        {
          'Int'
        }
        'Short'   
        {
          'Int16'
        }
        default   
        {
          $Field.Type
        }
      }

      # Fieldtype for picklists
      If ($Field.IsPickList -and $Field.PicklistValues.Count -gt 0) {
          $Type = 'String'
          $ValidateLength = 0
      }
      Else {
          $ValidateLength = $Field.Length
      }

      
      $Alias = @() 
      If ($Field.Name -eq $EntityNameParameter)
      {
        $Alias += 'Name'
      }

      $ParameterOptions = @{
        Mandatory              = $Field.Mandatory
        ParameterSetName       = $Field.ParameterSet
        ValidateNotNullOrEmpty = $Field.IsRequired
        ValidateLength         = $ValidateLength
        ValidateSet            = $Field.PickListValues.Label | Select-Object -Unique
        Array                  = $(($Verb -eq 'Get'))
        Name                   = $Field.Name
        Alias                  = $Alias
        Type                   = $Type
        Comment                = $Field.Label
      }

      Get-AtwsPSParameter @ParameterOptions
    }
    
    
    # Make modifying operators possible
    If ($Verb -eq 'Get') {
      # These operators work for all fields (add quote characters here)
      Foreach ($Operator in 'NotEquals', 'IsNull', 'IsNotNull') {
        Get-AtwsPSParameter -Name $Operator -SetName 'By_parameters' -Type 'String' -Array -ValidateSet $Fields.Name
      }

      # These operators work for all fields except boolean (add quote characters here)
      $Labels = $Fields | Where-Object { $_.Type -ne 'boolean' }
      Foreach ($Operator in 'GreaterThan', 'GreaterThanOrEquals', 'LessThan', 'LessThanOrEquals') {
        Get-AtwsPSParameter -Name $Operator -SetName 'By_parameters' -Type 'String' -Array -ValidateSet $Labels.Name
      }

      # These operators only work for strings (add quote characters here)
      $Labels = $Fields | Where-Object { $_.Type -eq 'string' }
      Foreach ($Operator in 'Like', 'NotLike', 'BeginsWith', 'EndsWith', 'Contains') {
        Get-AtwsPSParameter -Name $Operator -SetName 'By_parameters' -Type 'String' -Array -ValidateSet $Labels.Name
      }
      
      # This operator only work for datetime (add quote characters here)
      $Labels = $Fields | Where-Object { $_.Type -eq 'datetime' }
      Foreach ($Operator in 'IsThisDay') {
        Get-AtwsPSParameter -Name $Operator -SetName 'By_parameters' -Type 'String' -Array -ValidateSet $Labels.Name
      }
    }
  }
}