Functions/Add-LSTicket.ps1


function Add-LSTicket {
    
    Param (
        [Parameter(Mandatory=$true)][String]$Url,
        [Parameter(Mandatory=$true)][String]$Subject,
        [Parameter(Mandatory=$true)][String]$Description,

        # Mandatory to use one
        [Parameter(Mandatory = $true, ParameterSetName = 'Username')]
        [String]$Username,
        [Parameter(Mandatory = $true, ParameterSetName = 'Email')]
        [String]$Email,

        # Non-mandatory fields
        [String]$Type,
        [String]$Priority,
        [String]$Team,
        [String]$Displayname,
        [String]$AgentUsername,
        [String]$AgentEmail,
        [DateTime]$Date,
        [Bool]$AgentInitiated,
        [Bool]$Personal,
        [String]$CustomFields, # Example: {"customFields":[{"name":"customField","value":"Text value here"}]}
        [String]$Files
    )

     # Base parameters for url
    $params = @{
        action      = 'AddTicket'
        Subject     = $Subject
        Description = $Description
    }

    # Username or Email for user
    $User = if($PSCmdlet.ParameterSetName -eq 'Username') {
        $params.Username = $Username
    } else {
        $params.Email = $Email
    }
    
    # Add optional parameters if used
    if($Type)           {$params.Type           = $Type}
    if($Priority)       {$params.Priority       = $Priority}
    if($Team)           {$params.Team           = $Team}
    if($Displayname)    {$params.Displayname    = $Displayname}
    if($AgentUsername)  {$params.AgentUsername  = $AgentUsername}
    if($AgentEmail)     {$params.AgentEmail     = $AgentEmail}
    if($Date)           {$params.Date           = $Date}
    if($AgentInitiated) {$params.AgentInitiated = $AgentInitiated}
    if($Personal)       {$params.Personal       = $Personal}
    if($CustomFields)   {$params.CustomFields   = $CustomFields}
    if($Files)          {$params.Files          = $Files}

    # Building query string
    $queryString = ($params.GetEnumerator() | ForEach-Object {
        '{0}={1}' -f [uri]::EscapeDataString($_.Key), [uri]::EscapeDataString([string]$_.Value)
    }) -join '&'
    $fullUrl = '{0}{1}' -f $Url, $queryString

    # Creating ticket using the api
    $Request = Invoke-WebRequest -Uri $fullUrl -UseBasicParsing
    
    # Checking response
    if($Request.StatusCode -ne 200) {
        throw ("{0} {1}" -f $Request.StatusCode, $Request.StatusDescription)
    }
    if(($Request.Content | ConvertFrom-Json).Success) {
        Write-Host "Ticket has been created successfully!" -ForegroundColor "Green"
    } else {
        Write-Host "Something went wrong when creating ticket." -ForegroundColor "Red"
        Write-Error $Request.Content
    }

    return ($Request.Content | ConvertFrom-Json)
}