Public/UserGroups.ps1

<#
.SYNOPSIS
    Get all user groups in a Workspace.
.DESCRIPTION
    View the user groups created via the API for a Workspace. Can accept TeamID via pipeline input for integration with other cmdlets.
.EXAMPLE
    PS C:\> Get-ClickupUserGroups -TeamID 123
    Get all user groups for team with ID "123".
.EXAMPLE
    PS C:\> Get-ClickUpTeam | Get-ClickupUserGroups
    Get user groups by piping team ID from Get-ClickUpTeam.
.INPUTS
    System.UInt64. TeamID via pipeline by property name.
.OUTPUTS
    System.Object
    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, ValueFromPipelineByPropertyName = $true)]
        [Alias('team_id', 'id')]
        [uint64]$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. Can accept TeamID via pipeline input for integration with other cmdlets.
.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".
.EXAMPLE
    PS C:\> Get-ClickUpTeam | New-ClickUpUserGroup -Name "Pipeline Group" -Members 456, 789
    Create user group by piping team ID from Get-ClickUpTeam.
.INPUTS
    System.UInt64. TeamID via pipeline by property name.
.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, ValueFromPipelineByPropertyName = $true)]
        [Alias('team_id', 'id')]
        [uint64]$TeamID,
        [Parameter(Mandatory = $true)]
        [string]$Name,
        [Parameter(Mandatory = $true)]
        [uint64[]]$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. Can accept GroupID via pipeline input for integration with other cmdlets.
.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".
.EXAMPLE
    PS C:\> Get-ClickupUserGroups -TeamID 123 | Set-ClickUpUserGroup -Name "Renamed Group"
    Update user groups by piping group ID from Get-ClickupUserGroups.
.INPUTS
    System.String. GroupID via pipeline by property name.
.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, ValueFromPipelineByPropertyName = $true)]
        [Alias('group_id', 'id')]
        [string]$GroupID,
        [Parameter()]
        [string]$Name,
        [Parameter()]
        [string]$Handle,
        [Parameter()]
        [uint64[]]$AddMembers = @(),
        [Parameter()]
        [uint64[]]$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. Can accept GroupID via pipeline input for integration with other cmdlets.
.EXAMPLE
    PS C:\> Remove-ClickUpUserGroup -GroupID "123-456"
    Delete user group with ID "123-456".
.EXAMPLE
    PS C:\> Get-ClickupUserGroups -TeamID 123 | Remove-ClickUpUserGroup
    Remove user groups by piping group ID from Get-ClickupUserGroups.
.INPUTS
    System.String. GroupID via pipeline by property name.
.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, ValueFromPipelineByPropertyName = $true)]
        [Alias('group_id', 'id')]
        [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 $_
        }
    }
}