Private/ClickUpAPI.ps1

function Invoke-ClickUpAPIRequest {
    [CmdletBinding()]
    param (
        [Parameter(Mandatory = $true)]
        [ValidateSet('Default', 'Get', 'Head', 'Post', 'Put', 'Delete', 'Trace', 'Options', 'Merge', 'Patch')]
        [string]$Method,
        [Parameter(Mandatory = $true)]
        [string]$URI,
        [hashtable]$Body
    )
    try {
        $InvokeParams = @{
            Body        = if ($Body) { ConvertTo-Json -InputObject $Body -Depth $ClickUpJSONConversionDepth } else { '' }
            ContentType = 'application/json'
            Headers     = @{
                Authorization = Get-ClickUpAPIKeyInsecure -APIKey $ClickUpAPIKey
            }
            Method      = $Method
            Uri         = $URI
        }
        $Response = Invoke-RestMethod @InvokeParams
        if ($Response) {
            Return $Response
        }
    } catch {
        $_
    }
}

function Invoke-ClickUpAPIGet {
    [CmdletBinding()]
    param (
        [hashtable]$Arguments = @{},
        [Parameter(Mandatory = $true)]
        [string]$Endpoint
    )
    if ($Arguments.Count) {
        $URI = New-HTTPQueryString -Uri "https://api.clickup.com/api/v2/$Endpoint" -QueryParameter $Arguments
    } else {
        $URI = "https://api.clickup.com/api/v2/$Endpoint"
    }
    $Response = Invoke-ClickUpAPIRequest -Uri $URI -Method 'Get'
    return $Response
}

function Invoke-ClickUpAPIPost {
    [CmdletBinding()]
    param (
        [hashtable]$Arguments = @{},
        [Parameter(Mandatory = $true)]
        [string]$Endpoint,
        [Parameter(Mandatory = $true)]
        [hashtable]$Body
    )
    if ($Arguments.Count) {
        $URI = New-HTTPQueryString -Uri "https://api.clickup.com/api/v2/$Endpoint" -QueryParameter $Arguments
    } else {
        $URI = "https://api.clickup.com/api/v2/$Endpoint"
    }
    $Response = Invoke-ClickUpAPIRequest -Uri $URI -Method 'Post' -Body $Body
    return $Response
}

function Invoke-ClickUpAPIPut {
    [CmdletBinding()]
    param (
        [hashtable]$Arguments = @{},
        [Parameter(Mandatory = $true)]
        [string]$Endpoint,
        [Parameter(Mandatory = $true)]
        [hashtable]$Body
    )
    if ($Arguments.Count) {
        $URI = New-HTTPQueryString -Uri "https://api.clickup.com/api/v2/$Endpoint" -QueryParameter $Arguments
    } else {
        $URI = "https://api.clickup.com/api/v2/$Endpoint"
    }
    $Response = Invoke-ClickUpAPIRequest -Uri $URI -Method 'Put' -Body $Body
    return $Response
}

function Invoke-ClickUpAPIDelete {
    [CmdletBinding()]
    param (
        [hashtable]$Arguments = @{},
        [Parameter(Mandatory = $true)]
        [string]$Endpoint
    )
    if ($Arguments.Count) {
        $URI = New-HTTPQueryString -Uri "https://api.clickup.com/api/v2/$Endpoint" -QueryParameter $Arguments
    } else {
        $URI = "https://api.clickup.com/api/v2/$Endpoint"
    }
    $Response = Invoke-ClickUpAPIRequest -Uri $URI -Method 'Delete' -Body $Body
    return $Response
}

function Invoke-ClickUpAPIPostAttachment {
    [CmdletBinding()]
    param (
        [hashtable]$Arguments = @{},
        [Parameter(Mandatory = $true)]
        [string]$Endpoint,
        [Parameter(Mandatory = $true)]
        [string]$Body,
        [Parameter(Mandatory = $true)]
        [string]$Boundary
    )
    if ($Arguments.Count) {
        $URI = New-HTTPQueryString -Uri "https://api.clickup.com/api/v2/$Endpoint" -QueryParameter $Arguments
    } else {
        $URI = "https://api.clickup.com/api/v2/$Endpoint"
    }

    $InvokeParams = @{
            Body        = $Body
            ContentType = "multipart/form-data; boundary=`"$Boundary`""
            Headers     = @{
                Authorization = Get-ClickUpAPIKeyInsecure -APIKey $ClickUpAPIKey
            }
            Method      = 'post'
            Uri         = $URI
        }
    $Response = Invoke-RestMethod @InvokeParams
    return $Response
}