# API Design

## API 结构

### 请求

#### 请求方式

支持如下两种调用方式：

- get
- post

#### 请求头（公共参数）

| 参数名称 | 用途         | 类型   | 必要性 |
| -------- | ------------ | ------ | ------ |
| Version  | 接口版本     | string | 可选   |
| Language | 接口显示语言 | string | 可选   |

#### 安全验证

本微服务没有安全验证模块，需通过 API 网关实现

#### 请求主体

[业务接口详情](#业务接口详情)

### 响应结果

#### 响应头（公共参数）

| 返回参数    | 用途                               | 类型    | 必要性 |
| ----------- | ---------------------------------- | ------- | ------ |
| HTTP 状态码 | 判断接口调用是否成功（200 或 404） | Integer | 必须   |

#### 响应主体

| 返回参数     | 用途                 | 类型                 | 必要性                 |
| ------------ | -------------------- | -------------------- | ---------------------- |
| ResponseData | 各个接口的业务数据   | object(依据接口而异) | 必须                   |
| Error        | 错误 code 和错误信息 | ErrorInfo            | 非必须 ,无错误时不返回 |

```
{
  "ResponseData": {
           app_id: "xxxx",
           StatusReason: {
              Code: "Requirement.NotEnough",
              Message: "Insufficient system resources (cpu, memory, disk space).",
              Detail: "Error detail information"
           }
          },
  "Error": {
            Code: "Requirement.NotEnough",
            Message: "Insufficient system resources (cpu, memory, disk space).",
            Detail: "Error detail information"
           }
}
```

#### 错误代码设计

错误代码参考 [AWS API](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/errors-overview.html) 的分类方式：

- Client errors: These errors are usually caused by something the client did, such as specifying an incorrect or invalid parameter in the request, or using an action or resource on behalf of a user that doesn't have permission to use the action or resource. These errors are accompanied by a 400-series HTTP response code.

- Server errors: These errors are usually caused by an AWS server-side issue. These errors are accompanied by a 500-series HTTP response code.

##### Client errors

| code                                  | message        | detail |
| ------------------------------------- | -------------- | ------ |
| Client.Parameter.Blank.Error          | p 必填参数为空 | null   |
| Client.Parameter.Format.Error         | p 参数语法不符 | null   |
| Client.Parameter.Value.NotExist.Error | p 参数值错误   | null   |
| Client.Parameter.Value.Repeat.Error   | p 参数值重复   | null   |

##### Server errors

| code                   | message                | detail       |
| ---------------------- | ---------------------- | ------------ |
| Server.Container.Error | Docker 返回原始错误    | 错误详细信息 |
| Server.SystemError     | 系统原始错误           | 错误详细信息 |
| Server.\*\*\*          | 其他可以友好提示的错误 | 错误详细信息 |

## 业务接口详情

各个业务接口的详细说明，公共参数不在这里继续说明。

### App 安装

#### Action

AppInstall

#### 请求参数

| 参数名称          | 用途               | 类型   | 必要性 |
| ----------------- | ------------------ | ------ | ------ |
| app_name          | 应用名称           | string | 必须   |
| customer_app_name | 用户自定义应用名称 | string | 必须   |
| app_version       | 应用版本           | string | 必须   |

#### 返回结果

| 返回值       | 类型          | 必要性 |
| ------------ | ------------- | ------ |
| ResponseData | String(AppID) | 必须   |
| Error        | ErrorInfo     | 非必须 |

### App 卸载

#### Action

AppUninstall

#### 请求参数

| 参数名称 | 用途       | 类型   | 必要性 |
| -------- | ---------- | ------ | ------ |
| app_id   | 卸载该 app | string | 必须   |

#### 返回结果

| 返回值       | 类型          | 必要性 |
| ------------ | ------------- | ------ |
| ResponseData | String(AppID) | 必须   |
| error        | ErrorInfo     | 非必须 |

### App 重启

#### Action

AppRestart

#### 请求参数

| 参数名称 | 用途       | 类型   | 必要性 |
| -------- | ---------- | ------ | ------ |
| app_id   | 重启该 app | string | 必须   |

#### 返回结果

| 返回值       | 类型          | 必要性 |
| ------------ | ------------- | ------ |
| ResponseData | String(AppID) | 必须   |
| error        | ErrorInfo     | 非必须 |

### App 启动

#### Action

AppStart

#### 请求参数

| 参数名称 | 用途       | 类型   | 必要性 |
| -------- | ---------- | ------ | ------ |
| app_id   | 启动该 app | string | 必须   |

#### 返回结果

| 返回值       | 类型          | 必要性 |
| ------------ | ------------- | ------ |
| ResponseData | String(AppID) | 必须   |
| error        | ErrorInfo     | 非必须 |

### App 停止

#### Action

AppStop

#### 请求参数

| 参数名称 | 用途       | 类型   | 必要性 |
| -------- | ---------- | ------ | ------ |
| app_id   | 停止该 app | string | 必须   |

#### 返回结果

| 返回值       | 类型          | 必要性 |
| ------------ | ------------- | ------ |
| ResponseData | String(AppID) | 必须   |
| error        | ErrorInfo     | 非必须 |

### App 状态查询

#### Action

AppStatus

#### 请求参数

| 参数名称 | 用途              | 类型   | 必要性 |
| -------- | ----------------- | ------ | ------ |
| app_id   | 查询该 app 的信息 | string | 必须   |

#### 返回结果

| 返回值       | 类型          | 必要性 |
| ------------ | ------------- | ------ |
| ResponseData | AppStatusInfo | 必须   |
| error        | ErrorInfo     | 非必须 |

AppStatusInfo 说明:

```
{

  app_id：应用ID,

  status：应用运行状态,[installing(创建中)，running(运行中)，exited(停止)，restarting(反复重启)，failed(失败)]

  status_reason：{ // 只有failed时才有内容
    Code：错误代码
    Message：错误提示信息
    Detail：错误真实信息
  }
  
}
```

### App 列表查询

#### Action

AppList

#### 请求参数

| 参数名称 | 用途           | 类型   | 必要性 |
| -------- | -------------- | ------ | ------ |
| app_id   | 查询指定的 app | string | 非必须 |

#### 返回结果

| 返回值       | 类型                   | 必要性 |
| ------------ | ---------------------- | ------ |
| ResponseData | Array of AppDetailInfo | 必须   |
| error        | ErrorInfo              | 非必须 |

AppDetailInfo 说明:

```
{

  app_id：应用ID,

  name：应用名,

  customer_name：自定义应用名,

  trade_mark：应用商标,

  status：应用运行状态,[installing(创建中)，running(运行中)，exited(停止)，restarting(反复重启)，failed(失败)]

  status_reason：{ // 只有failed时才有内容
    Code：错误代码
    Message：错误提示信息
    Detail：错误真实信息
  },

  official_app：是否为官方应用,

  image_url：图片路径,

  running_info: { // 只有status=running才有值，其他时候为空

      port：应用端口,

      compose_file：docker compose文件路径,

      url：应用网址,

      admin_url：管理员网址,

      user_name：用户名,

      password：密码,

      default_domain: 默认域名,

      set_domain: 用户自定义域名,
  }
  
}
```
