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

> Crea workspaces, invita miembros, gestiona roles y comparte aplicaciones con tu equipo.

<Info>
  Los workspaces se exponen a través de la interfaz `Workspaces` embebida en `rest.Rest`. Están disponibles en los planes **Standard, Pro y Enterprise**.
</Info>

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

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

## Creación de un workspace

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

fmt.Println(workspace.ID)
```

El nombre debe tener de 1 a 32 caracteres y crear un workspace requiere un plan de pago activo.

## Listado de workspaces

`api.GetWorkspaces()` devuelve todos los workspaces donde el usuario autenticado es propietario o miembro.

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

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

## Obtención de un único workspace

Los IDs de workspace son valores UUID v4 sin guiones (32 caracteres hex).

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

## Invitación de miembros

Invitar a un miembro es un intercambio en dos pasos: el invitado demuestra su consentimiento generando un código de corta duración desde **su propio** cliente, y el propietario lo consume.

```go theme={null}
// 1. Desde el cliente SDK del propio invitado
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. Desde el cliente del propietario del workspace
err = api.AddWorkspaceMember("1234567890abcdef1234567890abcdef", code, "maintain")
if err != nil {
	panic(err)
}
```

<Note>
  El código de invitación lo genera el usuario que va a **unirse** al workspace, no el propietario. Es de un solo uso y expira a los **5 minutos**: genéralo, entrégaselo al propietario/admin y consúmelo pronto.
</Note>

### Roles

| Rol               | Descripción                                                                      |
| ----------------- | -------------------------------------------------------------------------------- |
| `owner` / `admin` | Gestión completa del workspace                                                   |
| `maintain`        | Acceso operativo a las aplicaciones compartidas                                  |
| `manager`         | Monitoreo más el ciclo de vida de las aplicaciones (iniciar, detener, reiniciar) |
| `view`            | Acceso de solo lectura                                                           |

## Cambio del rol de un miembro

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

## Eliminación de un miembro

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

## Compartir aplicaciones

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

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

## Salir de un workspace o eliminarlo

<Warning>
  Eliminar un workspace es irreversible y solo está disponible para el propietario.
</Warning>

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

// Como propietario (irreversible)
err = api.DeleteWorkspace("1234567890abcdef1234567890abcdef")
```
