> ## 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.

# Workspace

> Crea workspace, invita membri, gestisci i ruoli e condividi le applicazioni con il tuo team.

<Info>
  I workspace sono esposti dall'interfaccia `Workspaces` incorporata in `rest.Rest`. Sono disponibili sui piani **Standard, Pro ed Enterprise**.
</Info>

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

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

## Creare un workspace

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

fmt.Println(workspace.ID)
```

Il nome deve essere lungo da 1 a 32 caratteri, e la creazione di un workspace richiede un piano a pagamento attivo.

## Elencare i workspace

`api.GetWorkspaces()` restituisce ogni workspace in cui l'utente autenticato è proprietario o membro.

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

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

## Recuperare un singolo workspace

Gli ID dei workspace sono valori UUID v4 senza trattini (32 caratteri esadecimali).

```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)
```

## Invitare membri

L'invito di un membro è un handshake in due passaggi: l'invitato dimostra il proprio consenso generando un codice a breve scadenza dal **proprio** client, e il proprietario lo consuma.

```go theme={null}
// 1. From the invitee's own SDK client
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. From the workspace owner's client
err = api.AddWorkspaceMember("1234567890abcdef1234567890abcdef", code, "maintain")
if err != nil {
	panic(err)
}
```

<Note>
  Il codice di invito viene generato dall'utente che sta per **entrare** nel workspace, non dal proprietario. È monouso e scade dopo **5 minuti** — generalo, consegnalo al proprietario/admin e consumalo subito.
</Note>

### Ruoli

| Ruolo             | Descrizione                                                              |
| ----------------- | ------------------------------------------------------------------------ |
| `owner` / `admin` | Gestione completa del workspace                                          |
| `maintain`        | Accesso operativo alle applicazioni condivise                            |
| `manager`         | Monitoraggio più ciclo di vita delle applicazioni (start, stop, restart) |
| `view`            | Accesso in sola lettura                                                  |

## Cambiare il ruolo di un membro

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

## Rimuovere un membro

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

## Condividere applicazioni

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

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

## Uscire da un workspace o eliminarlo

<Warning>
  L'eliminazione di un workspace è irreversibile e disponibile solo per il proprietario.
</Warning>

```go theme={null}
// As a member
err := api.LeaveWorkspace("1234567890abcdef1234567890abcdef")

// As the owner (irreversible)
err = api.DeleteWorkspace("1234567890abcdef1234567890abcdef")
```
