> ## Documentation Index
> Fetch the complete documentation index at: https://docs.squarecloud.app/llms.txt
> Use this file to discover all available pages before exploring further.

# Workspaces

> Crie workspaces, convide membros, gerencie papéis e compartilhe aplicações entre uma equipe.

<Info>
  Workspaces são expostos pela interface `Workspaces` embutida em `rest.Rest`. Disponível nos planos **Standard, Pro e Enterprise**.
</Info>

```go theme={null}
client := rest.NewClient(os.Getenv("SQUARECLOUD_API_KEY"))
defer client.Close()

api := rest.New(client)
```

## Criando um workspace

```go theme={null}
workspace, err := api.CreateWorkspace("Acme")
if err != nil {
	panic(err)
}

fmt.Println(workspace.ID)
```

O nome deve ter de 1 a 32 caracteres, e criar um workspace exige um plano pago ativo.

## Listando workspaces

`api.GetWorkspaces()` retorna todos os workspaces em que o usuário autenticado é dono ou membro.

```go theme={null}
workspaces, err := api.GetWorkspaces()
if err != nil {
	panic(err)
}

for _, ws := range workspaces {
	fmt.Println(ws.Name, ws.ID)
}
```

## Buscando um workspace específico

IDs de workspace são valores UUID v4 sem hífens (32 caracteres hexadecimais).

```go theme={null}
workspace, err := api.GetWorkspace("1234567890abcdef1234567890abcdef")
if err != nil {
	panic(err)
}

fmt.Println(workspace.Name)
fmt.Println(workspace.Owner)
fmt.Println(workspace.Members)
fmt.Println(workspace.Applications)
```

## Convidando membros

Convidar um membro é um handshake em duas etapas — o convidado prova o consentimento gerando um código de curta duração a partir do **próprio** cliente, e o dono consome esse código.

```go theme={null}
// 1. A partir do cliente SDK do convidado
otherClient := rest.NewClient(os.Getenv("OTHER_USER_API_KEY"))
defer otherClient.Close()
otherAPI := rest.New(otherClient)

code, err := otherAPI.GetWorkspaceInviteCode()
if err != nil {
	panic(err)
}

// 2. A partir do cliente do dono do workspace
err = api.AddWorkspaceMember("1234567890abcdef1234567890abcdef", code, "maintain")
if err != nil {
	panic(err)
}
```

<Note>
  O código de convite é gerado pelo usuário que vai **entrar** no workspace, não pelo dono. Ele é de uso único e expira após **5 minutos** — gere-o, entregue ao dono/admin e consuma-o prontamente.
</Note>

### Papéis

| Papel             | Descrição                                                              |
| ----------------- | ---------------------------------------------------------------------- |
| `owner` / `admin` | Gerenciamento completo do workspace                                    |
| `maintain`        | Acesso operacional às aplicações compartilhadas                        |
| `manager`         | Monitoramento mais ciclo de vida das aplicações (start, stop, restart) |
| `view`            | Somente leitura                                                        |

## Alterando o papel de um membro

```go theme={null}
err := api.UpdateWorkspaceMember("1234567890abcdef1234567890abcdef", "abcdef0123456789abcdef01", "admin")
if err != nil {
	panic(err)
}
```

## Removendo um membro

```go theme={null}
err := api.RemoveWorkspaceMember("1234567890abcdef1234567890abcdef", "abcdef0123456789abcdef01")
if err != nil {
	panic(err)
}
```

## Compartilhando aplicações

```go theme={null}
err := api.AddWorkspaceApplication("1234567890abcdef1234567890abcdef", "abc123def456abc123def456")
if err != nil {
	panic(err)
}

err = api.RemoveWorkspaceApplication("1234567890abcdef1234567890abcdef", "abc123def456abc123def456")
```

## Saindo ou deletando um workspace

<Warning>
  Deletar um workspace é irreversível e está disponível apenas para o dono.
</Warning>

```go theme={null}
// Como membro
err := api.LeaveWorkspace("1234567890abcdef1234567890abcdef")

// Como dono (irreversível)
err = api.DeleteWorkspace("1234567890abcdef1234567890abcdef")
```
