Public/Set-DifyCurrentWorkspace.ps1

function Set-DifyCurrentWorkspace {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline = $true)]
        [PSCustomObject[]] $Workspace = @(),
        [String[]] $Id = @(),
        [String[]] $Name = @()
    )

    begin {
        $Workspaces = @()
    }

    process {
        foreach ($WorkspaceObject in $Workspace) {
            $Workspaces += $WorkspaceObject
        }
    }

    end {

        if ($Workspaces.Count -gt 0) {
            if ($Workspaces.Count -gt 1) {
                throw "Multiple workspaces provided. Please provide only one workspace to switch to."
            }
            $TargetWorkspace = $Workspaces
        }
        else {
            if (-not $Id -and -not $Name) {
                throw "Please specify either -Workspace, -Id, or -Name to set the current workspace."
            }
            $TargetWorkspace = Get-DifyWorkspace -Id $Id -Name $Name
            if ($TargetWorkspace.Count -eq 0) {
                throw "No workspace found matching the specified criteria."
            }
            if ($TargetWorkspace.Count -gt 1) {
                throw "Multiple workspaces found matching the specified criteria. Please narrow down your search."
            }
        }

        $Endpoint = Join-Url -Segments @($env:PSDIFY_URL, "/console/api/workspaces/switch")
        $Method = "POST"
        $Body = @{
            "tenant_id" = $TargetWorkspace[0].Id
        } | ConvertTo-Json
        try {
            $Response = Invoke-DifyRestMethod -Uri $Endpoint -Method $Method -Body $Body -SessionOrToken $script:PSDIFY_CONSOLE_AUTH
        }
        catch {
            throw "Failed to switch workspace: $_"
        }

        if ($Response.result -ne "success" -or -not $Response.new_tenant) {
            throw "Failed to switch workspace: $($Response.msg)"
        }

        $CurrentWorkspace = [PSCustomObject]@{
            Id        = $Response.new_tenant.id
            Name      = $Response.new_tenant.name
            Plan      = $Response.new_tenant.plan
            Status    = $Response.new_tenant.status
            CreatedAt = Convert-UnixTimeToLocalDateTime($Response.new_tenant.created_at)
            Role      = $Response.new_tenant.role
        }

        return $CurrentWorkspace
    }
}