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

> 创建 workspace、邀请成员、管理角色并在团队间共享应用。

<Info>
  Workspace 由内嵌在 `rest.Rest` 中的 `Workspaces` 接口暴露。它们在 **Standard、Pro 和 Enterprise** 套餐上可用。
</Info>

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

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

## 创建 workspace

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

fmt.Println(workspace.ID)
```

名称长度必须为 1–32 个字符，且创建 workspace 需要有效的付费套餐。

## 列出 workspace

`api.GetWorkspaces()` 返回已认证用户作为所有者或成员的所有 workspace。

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

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

## 获取单个 workspace

workspace ID 是不带连字符的 UUID v4 值（32 位十六进制字符）。

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

## 邀请成员

邀请成员是一个两步握手过程 —— 受邀者通过在**其自己的**客户端生成一个短时代码来证明同意，然后由所有者消费该代码。

```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>
  邀请代码由将要**加入** workspace 的用户生成，而不是由所有者生成。它是一次性的，并在 **5 分钟**后过期 —— 生成后请交给所有者/管理员并及时使用。
</Note>

### 角色

| 角色                | 说明                   |
| ----------------- | -------------------- |
| `owner` / `admin` | 完整的 workspace 管理权限   |
| `maintain`        | 对共享应用的操作权限           |
| `manager`         | 监控以及应用生命周期（启动、停止、重启） |
| `view`            | 只读权限                 |

## 更改成员角色

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

## 移除成员

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

## 共享应用

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

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

## 离开或删除 workspace

<Warning>
  删除 workspace 不可逆，且仅所有者可执行。
</Warning>

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

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