Public/UserGroups.ps1

<#
.SYNOPSIS
    Get all user groups in a Workspace.
.DESCRIPTION
    View the user groups created via the API for a Workspace.
.EXAMPLE
    PS C:\> Get-ClickupUserGroups -TeamID 123
    Get all user groups for team with ID "123".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object
.OUTPUTS
    System.Array
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/getusergroups
#>

function Get-ClickupUserGroups {
    [CmdletBinding()]
    [OutputType([System.Object], [System.Array])]
    param (
        [Parameter(Mandatory = $true)]
        [ulong]$TeamID,
        [Parameter()]
        [string[]]$GroupIDs
    )

    $Arguments = @{
        team_id = $TeamID
    }

    if ($PSBoundParameters.ContainsKey('GroupIDs')) {
        $Arguments.Add('group_ids', $GroupIDs)
    }

    Write-Verbose 'Entering Get-ClickupUserGroups'
    try {
        Write-Verbose "Getting user groups for team ID: $TeamID"
        $Groups = Invoke-ClickUpAPIGet -Endpoint 'group' -Arguments $Arguments
        Write-Verbose 'Successfully retrieved user groups'
        return $Groups.groups
    } catch {
        Write-Error "Error in Get-ClickupUserGroups: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Create a new user group.
.DESCRIPTION
    Create a new user group in a Workspace.
.EXAMPLE
    PS C:\> New-ClickUpUserGroup -TeamID 123 -Name "New Group" -Members 456, 789
    Create a new user group with name "New Group" and members with IDs "456" and "789" in team with ID "123".
.EXAMPLE
    PS C:\> New-ClickUpUserGroup -TeamID 123 -Name "New Group" -Members 456, 789 -Handle "new-group"
    Create a new user group with name "New Group" and members with IDs "456" and "789" in team with ID "123".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/createusergroup
#>

function New-ClickUpUserGroup {
    [CmdletBinding()]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true)]
        [ulong]$TeamID,
        [Parameter(Mandatory = $true)]
        [string]$Name,
        [Parameter(Mandatory = $true)]
        [ulong[]]$Members,
        [Parameter()]
        [string]$Handle
    )

    $Body = @{
        name    = $Name
        members = $Members
    }

    if ($PSBoundParameters.ContainsKey('Handle')) {
        $Body.Add('handle', $Handle)
    }

    Write-Verbose 'Entering New-ClickUpUserGroup'
    try {
        Write-Verbose "Creating user group '$Name' for team ID: $TeamID"
        $Group = Invoke-ClickUpAPIPost -Endpoint "team/$TeamID/group" -Body $Body
        Write-Verbose 'Successfully created user group'
        return $Group
    } catch {
        Write-Error "Error in New-ClickUpUserGroup: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Update a user group.
.DESCRIPTION
    Update a user group in a Workspace.
.EXAMPLE
    PS C:\> Set-ClickUpUserGroup -GroupID "123-456" -Name "Updated Group" -Handle "updated-handle"
    Update user group with ID "123-456" to have name "Updated Group" and handle "updated-handle".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/updategroup
#>

function Set-ClickUpUserGroup {
    [CmdletBinding()]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true)]
        [string]$GroupID,
        [Parameter()]
        [string]$Name,
        [Parameter()]
        [string]$Handle,
        [Parameter()]
        [ulong[]]$AddMembers = @(),
        [Parameter()]
        [ulong[]]$RemoveMembers = @()
    )

    $Body = @{}

    if ($PSBoundParameters.ContainsKey('Name')) {
        $Body.Add('name', $Name)
    }
    if ($PSBoundParameters.ContainsKey('Handle')) {
        $Body.Add('handle', $Handle)
    }
    if ($PSBoundParameters.ContainsKey('AddMembers') -or $PSBoundParameters.ContainsKey('RemoveMembers')) {
        $Body.Add('members', @{
                add    = $AddMembers
                remove = $RemoveMembers
            })
    }

    Write-Verbose 'Entering Set-ClickUpUserGroup'
    try {
        Write-Verbose "Updating user group with ID: $GroupID"
        $Group = Invoke-ClickUpAPIPut -Endpoint "group/$GroupID" -Body $Body
        Write-Verbose 'Successfully updated user group'
        return $Group
    } catch {
        Write-Error "Error in Set-ClickUpUserGroup: $($_.Exception.Message)"
        throw $_
    }
}

<#
.SYNOPSIS
    Delete a user group.
.DESCRIPTION
    Delete a user group in a Workspace.
.EXAMPLE
    PS C:\> Remove-ClickUpUserGroup -GroupID "123-456"
    Delete user group with ID "123-456".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    None. This cmdlet does not return any output.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/deletegroup
#>

function Remove-ClickUpUserGroup {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
    param (
        [Parameter(Mandatory = $true)]
        [string]$GroupID
    )

    Write-Verbose 'Entering Remove-ClickUpUserGroup'
    if ($PSCmdlet.ShouldProcess($GroupID)) {
        try {
            Write-Verbose "Removing user group with ID: $GroupID"
            $null = Invoke-ClickUpAPIDelete -Endpoint "group/$GroupID"
            Write-Verbose 'Successfully removed user group'
        } catch {
            Write-Error "Error in Remove-ClickUpUserGroup: $($_.Exception.Message)"
            throw $_
        }
    }
}