Public/Guests.ps1

<#
.SYNOPSIS
    Get ClickUp guest.
.DESCRIPTION
    Get ClickUp guest.
.EXAMPLE
    PS C:\> Get-ClickUpGuest -TeamID 333 -GuestID 403
    Guest ClickUp guest user with ID "403" for team with ID "333".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/getguest
#>

function Get-ClickUpGuest {
    [CmdletBinding()]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $True)]
        [ulong]$TeamID,
        [Parameter(Mandatory = $True)]
        [ulong]$GuestID
    )

    Write-Verbose "Getting guest with ID: $GuestID for team ID: $TeamID"
    try {
        $Guest = Invoke-ClickUpAPIGet -Endpoint "team/$TeamID/guest/$GuestID"
        Write-Verbose "Successfully retrieved guest: $($Guest.guest.username) (ID: $($Guest.guest.id))"
        return $Guest.guest
    } catch {
        Write-Error "Failed to get guest with ID $GuestID for team ID $TeamID. Error: $_"
        throw $_
    }
}

<#
.SYNOPSIS
    Invite ClickUp guest to workspace.
.DESCRIPTION
    Invite ClickUp guest to workspace.
.EXAMPLE
    PS C:\> Add-ClickUpGuest -TeamID 333 -GuestEmail 'guest@example.com'
    Add ClickUp guest user with email "guest@example.com" for team with ID "333".
.EXAMPLE
    PS C:\> Add-ClickUpGuest -TeamID 333 -GuestEmail 'guest@example.com' -CanEditTags $true -CanSeeTimeSpent $true -CanSeeTimeEstimated $true
    Add ClickUp guest user with email "guest@example.com" for team with ID "333" and give them access to edit tags, see time spent, and see time estimated.
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/inviteguesttoworkspace
#>

function Add-ClickUpGuest {
    [CmdletBinding()]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $True)]
        [ulong]$TeamID,
        [Parameter(Mandatory = $True)]
        [string]$GuestEmail,
        [Parameter()]
        [bool]$CanEditTags = $false,
        [Parameter()]
        [bool]$CanSeeTimeSpent = $false,
        [Parameter()]
        [bool]$CanSeeTimeEstimated = $false
    )

    $Body = @{
        email                  = $GuestEmail
        can_edit_tags          = $CanEditTags
        can_see_time_spent     = $CanSeeTimeSpent
        can_see_time_estimated = $CanSeeTimeEstimated
    }

    Write-Verbose "Inviting guest '$GuestEmail' to team ID: $TeamID"
    try {
        $Team = Invoke-ClickUpAPIPost -Endpoint "team/$TeamID/guest" -Body $Body
        Write-Verbose "Successfully invited guest '$GuestEmail' to team ID: $TeamID"
        return $Team.team
    } catch {
        Write-Error "Failed to invite guest '$GuestEmail' to team ID $TeamID. Error: $_"
        throw $_
    }
}

<#
.SYNOPSIS
    Update ClickUp guest on workspace.
.DESCRIPTION
    Update ClickUp guest on workspace.
.EXAMPLE
    PS C:\> Set-ClickUpGuest -TeamID 333 -GuestID 403 -Username 'Guest User'
    Update ClickUp guest's username to "Guest User" for guest with ID "403".
.EXAMPLE
    PS C:\> Set-ClickUpGuest -TeamID 333 -GuestID 403 -CanEditTags $true -CanSeeTimeSpent $true -CanSeeTimeEstimated $true
    Update ClickUp guest user's permissions to edit tags, see time spent, and see time estimated for guest with ID "403".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/editguestonworkspace
#>

function Set-ClickUpGuest {
    [CmdletBinding()]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $True)]
        [ulong]$TeamID,
        [Parameter(Mandatory = $True)]
        [ulong]$GuestID,
        [Parameter()]
        [string]$Username,
        [Parameter()]
        [bool]$CanEditTags = $false,
        [Parameter()]
        [bool]$CanSeeTimeSpent = $false,
        [Parameter()]
        [bool]$CanSeeTimeEstimated = $false
    )

    $Body = @{}

    if ($PSBoundParameters.ContainsKey('Username')) {
        $Body.Add('username', $Username)
    }
    if ($PSBoundParameters.ContainsKey('CanEditTags')) {
        $Body.Add('can_edit_tags', $CanEditTags)
    }
    if ($PSBoundParameters.ContainsKey('CanSeeTimeSpent')) {
        $Body.Add('can_see_time_spent', $CanSeeTimeSpent)
    }
    if ($PSBoundParameters.ContainsKey('CanSeeTimeEstimated')) {
        $Body.Add('can_see_time_estimated', $CanSeeTimeEstimated)
    }

    Write-Verbose "Updating guest with ID: $GuestID for team ID: $TeamID"
    try {
        $Guest = Invoke-ClickUpAPIPut -Endpoint "team/$TeamID/guest/$GuestID" -Body $Body
        Write-Verbose "Successfully updated guest with ID: $GuestID"
        return $Guest.guest
    } catch {
        Write-Error "Failed to update guest with ID $GuestID for team ID $TeamID. Error: $_"
        throw $_
    }
}

<#
.SYNOPSIS
    Add ClickUp guest to task.
.DESCRIPTION
    Add ClickUp guest to task.
.EXAMPLE
    PS C:\> Add-ClickUpGuestToTask -TaskID c04 -GuestID 403
    Add ClickUp guest user with ID "403" to task with ID "c04" with permission level "read".
.EXAMPLE
    PS C:\> Add-ClickUpGuestToTask -TaskID c04 -GuestID 403 -PermissionLevel edit
    Add ClickUp guest user with ID "403" to task with ID "c04" with permission level "edit".
.EXAMPLE
    PS C:\> Add-ClickUpGuestToTask -TaskID CustomID -GuestID 403 -CustomTaskIDs $true -TeamID 123 -PermissionLevel edit.
    Add ClickUp guest user with custom ID "CustomID" to task with ID "c04" with permission level "edit".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/addguesttotask
#>

function Add-ClickUpGuestToTask {
    [CmdletBinding(DefaultParameterSetName = 'TaskID')]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'TaskID')]
        [Parameter(Mandatory = $true, ParameterSetName = 'CustomTaskIDs')]
        [string]$TaskID,
        [Parameter(Mandatory = $true, ParameterSetName = 'TaskID')]
        [Parameter(Mandatory = $true, ParameterSetName = 'CustomTaskIDs')]
        [ulong]$GuestID,
        [Parameter(ParameterSetName = 'TaskID')]
        [Parameter(ParameterSetName = 'CustomTaskIDs')]
        [ValidateSet('read', 'comment', 'edit', 'create')]
        [string]$PermissionLevel = 'read',
        [Parameter(Mandatory = $true, ParameterSetName = 'CustomTaskIDs')]
        [bool]$CustomTaskIDs,
        [Parameter(Mandatory = $true, ParameterSetName = 'CustomTaskIDs')]
        [ulong]$TeamID
    )

    $Body = @{
        permission_level = $PermissionLevel
    }

    if ($PSBoundParameters.ContainsKey('CustomTaskIDs')) {
        $QueryString = @{
            custom_task_ids = $CustomTaskIDs
            team_id         = $TeamID
        }
    } else {
        $QueryString = @{}
    }

    Write-Verbose "Adding guest with ID: $GuestID to task ID: $TaskID"
    try {
        $Guest = Invoke-ClickUpAPIPost -Arguments $QueryString -Endpoint "task/$TaskID/guest/$GuestID" -Body $Body
        Write-Verbose "Successfully added guest with ID: $GuestID to task ID: $TaskID"
        return $Guest.guest
    } catch {
        Write-Error "Failed to add guest with ID $GuestID to task ID $TaskID. Error: $_"
        throw $_
    }
}

<#
.SYNOPSIS
    Add ClickUp guest to list.
.DESCRIPTION
    Add ClickUp guest to list.
.EXAMPLE
    PS C:\> Add-ClickUpGuestToList -ListID 1427 -GuestID 403
    Add ClickUp guest user with ID "403" to list with ID "1427" with permission level "read".
.EXAMPLE
    PS C:\> Add-ClickUpGuestToList -ListID 1427 -GuestID 403 -PermissionLevel edit
    Add ClickUp guest user with ID "403" to list with ID "1427" with permission level "edit".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/addguesttolist
#>

function Add-ClickUpGuestToList {
    [CmdletBinding()]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true)]
        [ulong]$ListID,
        [Parameter(Mandatory = $true)]
        [ulong]$GuestID,
        [Parameter()]
        [ValidateSet('read', 'comment', 'edit', 'create')]
        [string]$PermissionLevel = 'read'
    )

    $Body = @{
        permission_level = $PermissionLevel
    }

    Write-Verbose "Adding guest with ID: $GuestID to list ID: $ListID"
    try {
        $Guest = Invoke-ClickUpAPIPost -Endpoint "list/$ListID/guest/$GuestID" -Body $Body
        Write-Verbose "Successfully added guest with ID: $GuestID to list ID: $ListID"
        return $Guest.guest
    } catch {
        Write-Error "Failed to add guest with ID $GuestID to list ID $ListID. Error: $_"
        throw $_
    }
}

<#
.SYNOPSIS
    Add ClickUp guest to folder.
.DESCRIPTION
    Add ClickUp guest to folder.
.EXAMPLE
    PS C:\> Add-ClickUpGuestToFolder -FolderID 1057 -GuestID 403
    Add ClickUp guest user with ID "403" to folder with ID "1057" with permission level "read".
.EXAMPLE
    PS C:\> Add-ClickUpGuestToList -FolderID 1057 -GuestID 403 -PermissionLevel edit
    Add ClickUp guest user with ID "403" to folder with ID "1057" with permission level "edit".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/addguesttofolder
#>

function Add-ClickUpGuestToFolder {
    [CmdletBinding()]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true)]
        [ulong]$FolderID,
        [Parameter(Mandatory = $true)]
        [ulong]$GuestID,
        [Parameter()]
        [ValidateSet('read', 'comment', 'edit', 'create')]
        [string]$PermissionLevel = 'read'
    )

    $Body = @{
        permission_level = $PermissionLevel
    }

    Write-Verbose "Adding guest with ID: $GuestID to folder ID: $FolderID"
    try {
        $Guest = Invoke-ClickUpAPIPost -Endpoint "folder/$FolderID/guest/$GuestID" -Body $Body
        Write-Verbose "Successfully added guest with ID: $GuestID to folder ID: $FolderID"
        return $Guest.guest
    } catch {
        Write-Error "Failed to add guest with ID $GuestID to folder ID $FolderID. Error: $_"
        throw $_
    }
}

<#
.SYNOPSIS
    Remove ClickUp guest from workspace.
.DESCRIPTION
    Remove ClickUp guest from workspace.
.EXAMPLE
    PS C:\> Remove-ClickUpGuest -TeamID 333 -GuestID 403
    Remove ClickUp guest with Id "403" from team with ID "333".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/removeguestfromworkspace
#>

function Remove-ClickUpGuest {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true)]
        [ulong]$TeamID,
        [Parameter(Mandatory = $true)]
        [ulong]$GuestID
    )

    if ($PSCmdlet.ShouldProcess($GuestID, 'Remove Guest from Workspace')) {
        Write-Verbose "Removing guest with ID: $GuestID from team ID: $TeamID"
        try {
            $Team = Invoke-ClickUpAPIDelete -Endpoint "team/$TeamID/guest/$GuestID"
            Write-Verbose "Successfully removed guest with ID: $GuestID from team ID: $TeamID"
            return $Team.team
        } catch {
            Write-Error "Failed to remove guest with ID $GuestID from team ID $TeamID. Error: $_"
            throw $_
        }
    }
}

<#
.SYNOPSIS
    Remove ClickUp guest from task.
.DESCRIPTION
    Remove ClickUp guest from task.
.EXAMPLE
    PS C:\> Remove-ClickUpGuestFromTask -TaskID 1427 -GuestID 403
    Remove ClickUp guest with Id "403" from task with ID "1427".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/removeguestfromtask
#>

function Remove-ClickUpGuestFromTask {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High', DefaultParameterSetName = 'TaskID')]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true, ParameterSetName = 'TaskID')]
        [Parameter(Mandatory = $true, ParameterSetName = 'CustomTaskIDs')]
        [string]$TaskID,
        [Parameter(Mandatory = $true, ParameterSetName = 'TaskID')]
        [Parameter(Mandatory = $true, ParameterSetName = 'CustomTaskIDs')]
        [ulong]$GuestID,
        [Parameter(ParameterSetName = 'TaskID')]
        [Parameter(ParameterSetName = 'CustomTaskIDs')]
        [ValidateSet('read', 'comment', 'edit', 'create')]
        [string]$PermissionLevel = 'read',
        [Parameter(Mandatory = $true, ParameterSetName = 'CustomTaskIDs')]
        [bool]$CustomTaskIDs,
        [Parameter(Mandatory = $true, ParameterSetName = 'CustomTaskIDs')]
        [ulong]$TeamID
    )

    if ($PSBoundParameters.ContainsKey('CustomTaskIDs')) {
        $QueryString = @{
            custom_task_ids = $CustomTaskIDs
            team_id         = $TeamID
        }
    } else {
        $QueryString = @{}
    }

    if ($PSCmdlet.ShouldProcess($GuestID, 'Remove Guest from Task')) {
        Write-Verbose "Removing guest with ID: $GuestID from task ID: $TaskID"
        try {
            $Guest = Invoke-ClickUpAPIDelete -Arguments $QueryString -Endpoint "task/$TaskID/guest/$GuestID"
            Write-Verbose "Successfully removed guest with ID: $GuestID from task ID: $TaskID"
            return $Guest.guest
        } catch {
            Write-Error "Failed to remove guest with ID $GuestID from task ID $TaskID. Error: $_"
            throw $_
        }
    }
}

<#
.SYNOPSIS
    Remove ClickUp guest from list.
.DESCRIPTION
    Remove ClickUp guest from list.
.EXAMPLE
    PS C:\> Remove-ClickUpGuestFromList -ListID c04 -GuestID 403
    Remove ClickUp guest with Id "403" from list with ID "c04".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/removeguestfromlist
#>

function Remove-ClickUpGuestFromList {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true)]
        [string]$ListID,
        [Parameter(Mandatory = $true)]
        [ulong]$GuestID
    )

    if ($PSCmdlet.ShouldProcess($GuestID, 'Remove Guest from List')) {
        Write-Verbose "Removing guest with ID: $GuestID from list ID: $ListID"
        try {
            $Guest = Invoke-ClickUpAPIDelete -Endpoint "list/$ListID/guest/$GuestID"
            Write-Verbose "Successfully removed guest with ID: $GuestID from list ID: $ListID"
            return $Guest.guest
        } catch {
            Write-Error "Failed to remove guest with ID $GuestID from list ID $ListID. Error: $_"
            throw $_
        }
    }
}

<#
.SYNOPSIS
    Remove ClickUp guest from folder.
.DESCRIPTION
    Remove ClickUp guest from folder.
.EXAMPLE
    PS C:\> Remove-ClickUpGuestFromFolder -FolderID 1057 -GuestID 403
    Remove ClickUp guest with Id "403" from folder with ID "1057".
.INPUTS
    None. This cmdlet does not accept any input.
.OUTPUTS
    System.Object.
.NOTES
    See the link for information.
.LINK
    https://developer.clickup.com/reference/removeguestfromfolder
#>

function Remove-ClickUpGuestFromFolder {
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'High')]
    [OutputType([System.Object])]
    param (
        [Parameter(Mandatory = $true)]
        [string]$FolderID,
        [Parameter(Mandatory = $true)]
        [ulong]$GuestID
    )

    if ($PSCmdlet.ShouldProcess($GuestID, 'Remove Guest from Folder')) {
        Write-Verbose "Removing guest with ID: $GuestID from folder ID: $FolderID"
        try {
            $Guest = Invoke-ClickUpAPIDelete -Endpoint "folder/$FolderID/guest/$GuestID"
            Write-Verbose "Successfully removed guest with ID: $GuestID from folder ID: $FolderID"
            return $Guest.guest
        } catch {
            Write-Error "Failed to remove guest with ID $GuestID from folder ID $FolderID. Error: $_"
            throw $_
        }
    }
}