# GitLink API 接口详细文档

> **数据来源**：[GitLink Apifox 文档](https://apifox.com/apidoc/shared-da30afb0-9d2e-429b-a4bc-a83209e06021) + Widdershins 导出文档
>
> **合并日期**：2026-03-31
>
> **接口总数**：210+ 个
>
> **Base URL**：`https://www.gitlink.org.cn`

---

# 认证方式

- **access_token**（推荐）：所有接口支持 `?access_token=xxx` 查询参数
- **Cookie**：`autologin_trustie` cookie
- **OAuth2**：Bearer Token（`Authorization: Bearer xxx`）
- 所有 API 路径以 `.json` 结尾

---

# Authentication

- HTTP Authentication, scheme: bearer

# 附件

## POST 上传文件

POST /api/attachments.json

> Body 请求参数

```yaml
file: ""
description: ""
container_id: ""
container_type: ""

```

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 |none|
|body|body|object| 否 |none|
|» file|body|string(binary)| 是 |上传的文件|
|» description|body|string| 否 |上传文件描述|
|» container_id|body|string| 否 |上传文件归属模型ID|
|» container_type|body|string| 否 |上传文件归属模型类型|

> 返回示例

> 200 Response

```json
{
  "id": "f5838d8f-451b-4793-a0f2-0278430e8207",
  "title": "1tab.ico",
  "filesize": "9.4 KB",
  "is_pdf": false,
  "url": "http://localhost:3000/api/attachments/f5838d8f-451b-4793-a0f2-0278430e8207",
  "created_on": "2023-12-25 14:53",
  "content_type": "image/vnd.microsoft.icon"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|string|true|none|文件ID|none|
|» title|string|true|none|文件标题|none|
|» filesize|string|true|none|文件大小|none|
|» is_pdf|boolean|true|none|文件是否为pdf|none|
|» url|string|true|none|文件绝对地址|none|
|» created_on|string|true|none|文件创建时间|none|
|» content_type|string|true|none|文件类型|none|

# 许可证

## GET 许可证列表

GET /api/licenses.json

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 |none|
|name|query|string| 否 |none|

> 返回示例

> 200 Response

```json
{
  "licenses": [
    {
      "id": 5,
      "name": "AFL-1.1"
    },
    {
      "id": 6,
      "name": "AFL-1.2"
    },
    {
      "id": 7,
      "name": "AFL-2.0"
    },
    {
      "id": 8,
      "name": "AFL-2.1"
    },
    {
      "id": 9,
      "name": "AFL-3.0"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» licenses|[object]|true|none||none|
|»» id|integer|true|none|ID|none|
|»» name|string|true|none|名称|none|

# 忽略文件

## GET 忽略文件列表

GET /api/ignores.json

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 |none|
|name|query|string| 否 |none|

> 返回示例

> 200 Response

```json
{
  "ignores": [
    {
      "id": 2,
      "name": "Ada"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» ignores|[object]|true|none||none|
|»» id|integer|false|none||none|
|»» name|string|false|none||none|

# 用户

## POST 创建一个用户

POST /api/accounts/register.json

> Body 请求参数

```json
{
  "code": 123123,
  "login": "13900010001",
  "namespace": "forgetest1",
  "password": "12345678",
  "password_confirmation": "12345678"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» code|body|integer| 是 | 验证码|none|
|» login|body|string| 是 | 手机号或者邮箱|none|
|» namespace|body|string| 是 | 用户标识|none|
|» password|body|string| 是 | 用户密码|none|
|» password_confirmation|body|string| 是 | 用户确认密码|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET Public Keys列表

GET /api/public_keys.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|page|query|integer| 否 ||页码|
|limit|query|string| 否 ||每页数量|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "public_keys": [
    {
      "id": 1,
      "name": "测试",
      "content": "ssh-rsa   yystopf@163.com",
      "fingerprint": "SHA256:fuQoDBhAfOijPymXEa2ahiVV/5Jj3hB/0YbIS4aBMDo",
      "created_unix": 1690797157,
      "created_time": "2023/07/31 17:52"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|总数|none|
|» public_keys|[object]|true|none||none|
|»» id|integer|true|none|ID|none|
|»» name|string|true|none|密钥名称|none|
|»» content|string|true|none|密钥内容|none|
|»» fingerprint|string|true|none|密钥简洁版内容|none|
|»» created_unix|integer|true|none|密钥创建时间|none|
|»» created_time|string|true|none|密钥创建时间戳|none|

## POST Public Keys创建

POST /api/public_keys.json

> Body 请求参数

```json
{
  "key": "string",
  "title": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» key|body|string| 是 | 密钥内容|none|
|» title|body|string| 是 | 密钥标题|none|

> 返回示例

> 200 Response

```json
{
  "id": 2,
  "name": "速个严接不建和",
  "content": "ssh-rsa   yystopf@163.com",
  "fingerprint": "SHA256:fuQoDBhAfOijPymXEa2ahiVV/5Jj3hB/0YbIS4aBMDo",
  "created_time": "2023/07/31 18:07"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|密钥ID|none|
|» name|string|true|none|密钥名称|none|
|» content|string|true|none|密钥内容|none|
|» fingerprint|string|true|none|密钥简洁版内容|none|
|» created_time|string|true|none|密钥创建时间|none|

## DELETE Public Keys删除

DELETE /api/public_keys/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|id|path|integer| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 当前用户信息

GET /api/users/get_user_info.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "username": "咸蛋黄土豆丝",
  "real_name": "咸蛋黄土豆丝",
  "nickname": "咸蛋黄土豆丝",
  "gender": 0,
  "login": "yystopf",
  "user_id": 110,
  "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png",
  "admin": true,
  "is_teacher": false,
  "user_identity": "专业人士",
  "tidding_count": 0,
  "user_phone_binded": false,
  "need_edit_info": false,
  "phone": null,
  "profile_completed": true,
  "professional_certification": false,
  "devops_step": 0,
  "ci_certification": false,
  "email": "yystopf@163.com",
  "province": "河北省",
  "city": "秦皇岛",
  "custom_department": "嘻嘻嘻嘻",
  "description": "13",
  "super_description": null,
  "show_email": false,
  "show_department": false,
  "show_location": false,
  "show_super_description": false,
  "message_unread_total": 0,
  "has_trace_user": false,
  "is_new": false,
  "nps": false,
  "sign_cla": true
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» username|string|true|none|用户名|none|
|» real_name|string|true|none|用户真实名称|none|
|» nickname|string|true|none|用户昵称|none|
|» gender|integer|true|none|用户性别|none|
|» login|string|true|none|用户标识|none|
|» user_id|integer|true|none|用户ID|none|
|» image_url|string|true|none|用户头像|none|
|» admin|boolean|true|none|用户是否为管理员|none|
|» is_teacher|boolean|true|none|用户是否为老师|none|
|» user_phone_binded|boolean|true|none|用户是否绑定手机|none|
|» phone|null|true|none|用户手机号|none|
|» profile_completed|boolean|true|none|用户是否完善资料|none|
|» email|string|true|none|用户邮箱|none|
|» province|string|true|none|用户所在省份|none|
|» city|string|true|none|用户所在城市|none|
|» custom_department|string|true|none|用户单位|none|
|» description|string|true|none|用户描述|none|
|» show_email|boolean|true|none|是否展示邮箱|none|
|» show_department|boolean|true|none|是否展示公司|none|
|» show_location|boolean|true|none|是否展示位置|none|
|» message_unread_total|integer|true|none|消息未读数量|none|
|» has_trace_user|boolean|true|none|是否有代码溯源用户|none|
|» is_new|boolean|true|none||none|
|» nps|boolean|true|none|是否开启nps|none|
|» sign_cla|boolean|true|none|是否签署cla协议|none|

## PUT 用户信息更改

PUT /api/users/{owner}.json

> Body 请求参数

```json
{
  "user": {
    "nickname": "string",
    "user_extension_attributes": {
      "gender": 0,
      "province": "string",
      "city": "string",
      "description": "string",
      "custom_department": "string"
    }
  }
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» user|body|object| 是 ||none|
|»» nickname|body|string| 是 | 用户昵称|none|
|»» user_extension_attributes|body|object| 是 ||none|
|»»» gender|body|integer| 是 | 用户性别|none|
|»»» province|body|string| 是 | 用户所在省份|none|
|»»» city|body|string| 是 | 用户所在城市|none|
|»»» description|body|string| 是 | 用户简介|none|
|»»» custom_department|body|string| 是 | 用户所在单位|none|

> 返回示例

> 200 Response

```json
{
  "user_id": 110,
  "name": "咸蛋黄土豆丝xxx",
  "username": "咸蛋黄土豆丝xxx",
  "real_name": "咸蛋黄土豆丝xxx",
  "grade": 0,
  "gender": 0,
  "login": "yystopf",
  "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png",
  "admin": true,
  "user_identity": "专业人士",
  "is_watch": false,
  "watched_count": 0,
  "watching_count": 0,
  "created_time": "2022-09-19 11:45",
  "email": null,
  "province": null,
  "city": null,
  "custom_department": null,
  "description": "个性签名"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» user_id|integer|true|none||none|
|» name|string|true|none|用户昵称|none|
|» username|string|true|none|用户昵称|none|
|» real_name|string|true|none|用户昵称|none|
|» gender|integer|true|none|用户性别|none|
|» login|string|true|none|用户标识|none|
|» image_url|string|true|none|用户头像|none|
|» admin|boolean|true|none|是否为管理员|none|
|» is_watch|boolean|true|none|是否关注|none|
|» watched_count|integer|true|none|用户被关注数量|none|
|» watching_count|integer|true|none|用户关注的用户数|none|
|» created_time|string|true|none|用户创建时间|none|
|» email|null|true|none|用户邮箱|none|
|» province|null|true|none|用户所在省份|none|
|» city|null|true|none|用户所在城市|none|
|» custom_department|null|true|none|用户所在单位|none|
|» description|string|true|none|用户个性签名|none|

## GET 用户项目列表

GET /api/v1/{owner}/projects.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|page|query|integer| 否 ||页码|
|limit|query|integer| 否 ||每页个数|
|category|query|string| 否 ||项目分类 all 所有 join 我参与的 created 我创建的 manage 我管理的 only_watched 我关注的（除了我创建的以外） watched 我关注的 forked 我复刻的 |
|is_public|query|string| 否 ||是否为公有项目|
|project_type|query|string| 否 ||项目类型 common 普通项目 mirror 镜像项目 sync_mirror 同步镜像项目|
|sort_by|query|string| 否 ||排序字段|
|sort_direction|query|string| 否 ||排序类型|
|search|query|string| 否 ||搜索关键词|
|start_at|query|integer| 否 ||开始时间戳，当category为watched、only_watched、forked才有效|
|end_at|query|integer| 否 ||结束时间戳，当category为watched、only_watched、forked才有效|

> 返回示例

> 200 Response

```json
{
  "total_count": 25,
  "projects": [
    {
      "owner": {
        "id": 110,
        "type": "User",
        "name": "咸蛋黄土豆丝",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "type": "common",
      "description": null,
      "forked_count": 0,
      "forked_from_project_id": null,
      "identifier": "1213.2131",
      "issues_count": 1,
      "pull_requests_count": 0,
      "invite_code": "MPzQgH",
      "website": null,
      "platform": "forge",
      "name": "1213.2131",
      "open_devops": false,
      "praises_count": 0,
      "is_public": true,
      "status": 1,
      "watchers_count": 0,
      "ignore_id": null,
      "license_id": null,
      "project_category_id": null,
      "project_language_id": null
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» projects|[object]|true|none||none|
|»» owner|object|true|none|项目拥有着|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» type|string|true|none|项目类型|common 托管项目，mirror 镜像项目, sync_mirror 同步镜像项目|
|»» description|null|false|none|项目描述|none|
|»» forked_count|integer|true|none|项目复刻数量|none|
|»» forked_from_project_id|null|false|none|项目复刻来源项目|none|
|»» identifier|string|true|none|项目标识|none|
|»» issues_count|integer|true|none|项目疑修数量|none|
|»» pull_requests_count|integer|true|none|项目合并请求数量|none|
|»» invite_code|string|true|none|项目邀请码|none|
|»» website|null|false|none|项目地址|none|
|»» platform|string|true|none|项目平台|none|
|»» name|string|true|none|项目名称|none|
|»» open_devops|boolean|true|none|项目是否开启流水线|none|
|»» praises_count|integer|true|none|项目点赞数量|none|
|»» is_public|boolean|true|none|项目是否为公开项目|none|
|»» status|integer|true|none|项目状态|none|
|»» watchers_count|integer|true|none|项目关注数量|none|
|»» ignore_id|null|false|none|项目忽略文件ID|none|
|»» license_id|null|false|none|项目协议ID|none|
|»» project_category_id|null|false|none|项目分类ID|none|
|»» project_language_id|null|false|none|项目语言ID|none|

## GET 用户消息列表

GET /api/users/{owner}/messages.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|page|query|integer| 否 ||页码|
|limit|query|integer| 否 ||每页个数|
|type|query|string| 否 ||消息类型，不传为所有消息，notification为系统消息，atme为@我消息|
|status|query|integer| 否 ||是否已读，不传为所有消息，1为未读，2为已读|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "type": "atme",
  "unread_notification": 0,
  "unread_atme": 1,
  "messages": [
    {
      "id": 20156,
      "status": 1,
      "content": "<b>heihei</b> 在疑修 <b>1321312</b> 中@我",
      "notification_url": "http://localhost:3000/yystopf/testdevops/issues/1",
      "source": "IssueAtme",
      "created_at": "2023-08-01 12:45:54",
      "time_ago": "5分钟前",
      "type": "atme",
      "sender": {
        "id": 113,
        "type": "User",
        "name": "heihei",
        "login": "yystopfceshi",
        "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
      }
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» type|string|true|none|消息类型|，notification为系统消息，atme为@我消息|
|» unread_notification|integer|true|none|未读消息数量|none|
|» unread_atme|integer|true|none|未读@我数量|none|
|» messages|[object]|true|none||none|
|»» id|integer|false|none|消息ID|none|
|»» status|integer|false|none|消息状态|消息是否已读，1为未读，2为已读|
|»» content|string|false|none|消息内容|none|
|»» notification_url|string|false|none|消息跳转地址|none|
|»» source|string|false|none|消息来源数据|none|
|»» created_at|string|false|none|消息创建时间|none|
|»» time_ago|string|false|none|消息创建距离现在时间|none|
|»» type|string|false|none|消息类型|，notification为系统消息，atme为@我消息|
|»» sender|object|false|none||none|
|»»» id|integer|false|none|消息发送者ID|none|
|»»» type|string|false|none|消息发送者类型|User为用户，Organization为组织|
|»»» name|string|false|none|消息发送者昵称|none|
|»»» login|string|false|none|消息发送者标识|none|
|»»» image_url|string|false|none|消息发送者头像|none|

#### 枚举值

|属性|值|
|---|---|
|source|IssueAssigned|
|source|IssueExpire|
|source|IssueAtme|
|source|IssueChanged|
|source|IssueDeleted|
|source|IssueJournal|
|source|LoginIpTip|
|source|OrganizationJoined|
|source|OrganizationLeft	|
|source|OrganizationRole|
|source|ProjectDeleted|
|source|ProjectFollowed|
|source|ProjectForked|
|source|ProjectIssue|
|source|ProjectJoined|
|source|ProjectLeft|
|source|ProjectMemberJoined|
|source|ProjectMemberLeft|
|source|ProjectMilestoneCompleted|
|source|ProjectMilestone|
|source|ProjectPraised	|
|source|ProjectPullRequest|
|source|ProjectRole|
|source|ProjectSettingChanged|
|source|ProjectTransfer|
|source|ProjectVersion|
|source|PullRequestAssigned|
|source|PullReuqestAtme|
|source|PullRequestChanged|
|source|PullRequestClosed|
|source|PullRequestJournal|
|source|PullRequestMerged|

## DELETE 用户删除消息

DELETE /api/users/{owner}/messages.json

> Body 请求参数

```json
{
  "type": "notification",
  "ids": [
    0
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» type|body|string| 是 | 消息类型|不传为所有消息，notification为系统消息，atme为@我消息|
|» ids|body|[integer]| 是 | 消息id数组|包含-1则把所有未读消息标记为已读|

#### 枚举值

|属性|值|
|---|---|
|» type|notification|
|» type|atme|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 用户消息创建

POST /api/users/{owner}/messages.json

> Body 请求参数

```json
{
  "type": "atme",
  "receivers_login": [
    "string"
  ],
  "atmeable_type": "Journal",
  "atmeable_id": 0
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» type|body|string| 是 | 类型|none|
|» receivers_login|body|[string]| 是 | 需要发送消息的用户名数组|none|
|» atmeable_type|body|string| 是 | atme消息对象|是从哪里@我的，比如评论：Journal、疑修：Issue、合并请求：PullRequest|
|» atmeable_id|body|integer| 是 | atme消息对象id|none|

#### 枚举值

|属性|值|
|---|---|
|» type|atme|
|» atmeable_type|Journal|
|» atmeable_type|Issue|
|» atmeable_type|PullRequest|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 用户阅读消息

POST /api/users/{owner}/messages/read.json

> Body 请求参数

```json
{
  "type": "notification",
  "ids": [
    0
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» type|body|string| 是 | 消息类型|不传为所有消息，notification为系统消息，atme为@我消息|
|» ids|body|[integer]| 是 | 消息id数组|包含-1则把所有未读消息标记为已读|

#### 枚举值

|属性|值|
|---|---|
|» type|notification|
|» type|atme|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 平台消息设置

GET /api/template_message_settings.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "响应成功",
  "setting_types": [
    {
      "type": "TemplateMessageSetting::Normal",
      "type_name": "我的状态",
      "total_settings_count": 5,
      "settings": [
        {
          "name": "账号有权限变更",
          "key": "Permission",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "被拉入或移出组织",
          "key": "Organization",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "被拉入或移出项目",
          "key": "Project",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "有新的疑修指派给我",
          "key": "IssueAssigned",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "有新的合并请求指派给我",
          "key": "PullRequestAssigned",
          "notification_disabled": true,
          "email_disabled": false
        }
      ]
    },
    {
      "type": "TemplateMessageSetting::CreateOrAssign",
      "type_name": "我创建的或负责的",
      "total_settings_count": 3,
      "settings": [
        {
          "name": "疑修状态变更",
          "key": "IssueChanged",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "合并请求状态变更",
          "key": "PullRequestChanged",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "疑修截止日期到达最后一天",
          "key": "IssueExpire",
          "notification_disabled": false,
          "email_disabled": false
        }
      ]
    },
    {
      "type": "TemplateMessageSetting::ManageProject",
      "type_name": "我管理的仓库",
      "total_settings_count": 8,
      "settings": [
        {
          "name": "有新的疑修",
          "key": "Issue",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "有新的合并请求",
          "key": "PullRequest",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "有成员变动",
          "key": "Member",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "仓库设置被更改",
          "key": "SettingChanged",
          "notification_disabled": true,
          "email_disabled": false
        },
        {
          "name": "被点赞",
          "key": "Praised",
          "notification_disabled": false,
          "email_disabled": true
        },
        {
          "name": "被fork",
          "key": "Forked",
          "notification_disabled": false,
          "email_disabled": true
        },
        {
          "name": "有新的里程碑",
          "key": "Milestone",
          "notification_disabled": false,
          "email_disabled": false
        },
        {
          "name": "有里程碑已完成",
          "key": "MilestoneCompleted",
          "notification_disabled": false,
          "email_disabled": false
        }
      ]
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» setting_types|[object]|true|none||none|
|»» type|string|true|none|设置分类类型|none|
|»» type_name|string|true|none|设置分类名称|none|
|»» total_settings_count|integer|true|none|设置分类下设置总数|none|
|»» settings|[object]|true|none||none|
|»»» name|string|true|none|设置名称|none|
|»»» key|string|true|none|设置的Key|none|
|»»» notification_disabled|boolean|true|none|系统消息是否禁用|none|
|»»» email_disabled|boolean|true|none|@我消息是否禁用|none|

## GET 用户消息设置列表

GET /api/users/{owner}/template_message_settings.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "响应成功",
  "user": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝xxx",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "notification_body": {
    "Normal::Permission": true,
    "Normal::Project": true,
    "Normal::Organization": true,
    "Normal::IssueAssigned": true,
    "Normal::PullRequestAssigned": true,
    "CreateOrAssign::IssueChanged": true,
    "CreateOrAssign::PullRequestChanged": true,
    "CreateOrAssign::IssueExpire": true,
    "ManageProject::Issue": true,
    "ManageProject::PullRequest": true,
    "ManageProject::Member": true,
    "ManageProject::SettingChanged": true,
    "ManageProject::Praised": true,
    "ManageProject::Forked": true,
    "ManageProject::Milestone": true,
    "ManageProject::MilestoneCompleted": true
  },
  "email_body": {
    "Normal::Permission": false,
    "Normal::Project": false,
    "Normal::Organization": false,
    "Normal::IssueAssigned": false,
    "Normal::PullRequestAssigned": false,
    "CreateOrAssign::IssueChanged": false,
    "CreateOrAssign::PullRequestChanged": false,
    "CreateOrAssign::IssueExpire": false,
    "ManageProject::Issue": false,
    "ManageProject::PullRequest": false,
    "ManageProject::Member": false,
    "ManageProject::SettingChanged": false,
    "ManageProject::Praised": false,
    "ManageProject::Forked": false,
    "ManageProject::Milestone": false,
    "ManageProject::MilestoneCompleted": false
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» user|object|true|none||none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» notification_body|object|true|none||站内信消息配置|
|»» Normal::Permission|boolean|true|none||none|
|»» Normal::Project|boolean|true|none||none|
|»» Normal::Organization|boolean|true|none||none|
|»» Normal::IssueAssigned|boolean|true|none||none|
|»» Normal::PullRequestAssigned|boolean|true|none||none|
|»» CreateOrAssign::IssueChanged|boolean|true|none||none|
|»» CreateOrAssign::PullRequestChanged|boolean|true|none||none|
|»» CreateOrAssign::IssueExpire|boolean|true|none||none|
|»» ManageProject::Issue|boolean|true|none||none|
|»» ManageProject::PullRequest|boolean|true|none||none|
|»» ManageProject::Member|boolean|true|none||none|
|»» ManageProject::SettingChanged|boolean|true|none||none|
|»» ManageProject::Praised|boolean|true|none||none|
|»» ManageProject::Forked|boolean|true|none||none|
|»» ManageProject::Milestone|boolean|true|none||none|
|»» ManageProject::MilestoneCompleted|boolean|true|none||none|
|» email_body|object|true|none||邮件消息配置|
|»» Normal::Permission|boolean|true|none||none|
|»» Normal::Project|boolean|true|none||none|
|»» Normal::Organization|boolean|true|none||none|
|»» Normal::IssueAssigned|boolean|true|none||none|
|»» Normal::PullRequestAssigned|boolean|true|none||none|
|»» CreateOrAssign::IssueChanged|boolean|true|none||none|
|»» CreateOrAssign::PullRequestChanged|boolean|true|none||none|
|»» CreateOrAssign::IssueExpire|boolean|true|none||none|
|»» ManageProject::Issue|boolean|true|none||none|
|»» ManageProject::PullRequest|boolean|true|none||none|
|»» ManageProject::Member|boolean|true|none||none|
|»» ManageProject::SettingChanged|boolean|true|none||none|
|»» ManageProject::Praised|boolean|true|none||none|
|»» ManageProject::Forked|boolean|true|none||none|
|»» ManageProject::Milestone|boolean|true|none||none|
|»» ManageProject::MilestoneCompleted|boolean|true|none||none|

## POST 用户消息设置更新

POST /api/users/{owner}/template_message_settings/update_setting.json

> Body 请求参数

```json
{
  "setting": {
    "notification_body": {
      "CreateOrAssign::IssueAssigned": true,
      "CreateOrAssign::PullRequestAssigned": true,
      "ManageProject::Issue": true,
      "ManageProject::PullRequest": true,
      "ManageProject::Member": true,
      "ManageProject::SettingChanged": true,
      "Normal::Organization": true,
      "Normal::Project": true,
      "Normal::Permission": true
    },
    "email_body": {
      "CreateOrAssign::IssueAssigned": true,
      "CreateOrAssign::PullRequestAssigned": true,
      "ManageProject::Issue": true,
      "ManageProject::PullRequest": true,
      "ManageProject::Member": true,
      "ManageProject::SettingChanged": true,
      "Normal::Organization": true,
      "Normal::Project": true,
      "Normal::Permission": true
    }
  }
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» setting|body|object| 是 ||none|
|»» notification_body|body|object| 是 ||none|
|»»» CreateOrAssign::IssueAssigned|body|boolean| 是 ||none|
|»»» CreateOrAssign::PullRequestAssigned|body|boolean| 是 ||none|
|»»» ManageProject::Issue|body|boolean| 是 ||none|
|»»» ManageProject::PullRequest|body|boolean| 是 ||none|
|»»» ManageProject::Member|body|boolean| 是 ||none|
|»»» ManageProject::SettingChanged|body|boolean| 是 ||none|
|»»» Normal::Organization|body|boolean| 是 ||none|
|»»» Normal::Project|body|boolean| 是 ||none|
|»»» Normal::Permission|body|boolean| 是 ||none|
|»» email_body|body|object| 是 ||none|
|»»» CreateOrAssign::IssueAssigned|body|boolean| 是 ||none|
|»»» CreateOrAssign::PullRequestAssigned|body|boolean| 是 ||none|
|»»» ManageProject::Issue|body|boolean| 是 ||none|
|»»» ManageProject::PullRequest|body|boolean| 是 ||none|
|»»» ManageProject::Member|body|boolean| 是 ||none|
|»»» ManageProject::SettingChanged|body|boolean| 是 ||none|
|»»» Normal::Organization|body|boolean| 是 ||none|
|»»» Normal::Project|body|boolean| 是 ||none|
|»»» Normal::Permission|body|boolean| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "响应成功",
  "user": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝xxx",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "notification_body": {
    "Normal::Permission": true,
    "Normal::Project": true,
    "Normal::Organization": true,
    "Normal::IssueAssigned": true,
    "Normal::PullRequestAssigned": true,
    "CreateOrAssign::IssueChanged": true,
    "CreateOrAssign::PullRequestChanged": true,
    "CreateOrAssign::IssueExpire": true,
    "ManageProject::Issue": true,
    "ManageProject::PullRequest": true,
    "ManageProject::Member": true,
    "ManageProject::SettingChanged": true,
    "ManageProject::Praised": true,
    "ManageProject::Forked": true,
    "ManageProject::Milestone": true,
    "ManageProject::MilestoneCompleted": true
  },
  "email_body": {
    "Normal::Permission": false,
    "Normal::Project": false,
    "Normal::Organization": false,
    "Normal::IssueAssigned": false,
    "Normal::PullRequestAssigned": false,
    "CreateOrAssign::IssueChanged": false,
    "CreateOrAssign::PullRequestChanged": false,
    "CreateOrAssign::IssueExpire": false,
    "ManageProject::Issue": false,
    "ManageProject::PullRequest": false,
    "ManageProject::Member": false,
    "ManageProject::SettingChanged": false,
    "ManageProject::Praised": false,
    "ManageProject::Forked": false,
    "ManageProject::Milestone": false,
    "ManageProject::MilestoneCompleted": false
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» user|object|true|none||none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» notification_body|object|true|none||站内信消息配置|
|»» Normal::Permission|boolean|true|none||none|
|»» Normal::Project|boolean|true|none||none|
|»» Normal::Organization|boolean|true|none||none|
|»» Normal::IssueAssigned|boolean|true|none||none|
|»» Normal::PullRequestAssigned|boolean|true|none||none|
|»» CreateOrAssign::IssueChanged|boolean|true|none||none|
|»» CreateOrAssign::PullRequestChanged|boolean|true|none||none|
|»» CreateOrAssign::IssueExpire|boolean|true|none||none|
|»» ManageProject::Issue|boolean|true|none||none|
|»» ManageProject::PullRequest|boolean|true|none||none|
|»» ManageProject::Member|boolean|true|none||none|
|»» ManageProject::SettingChanged|boolean|true|none||none|
|»» ManageProject::Praised|boolean|true|none||none|
|»» ManageProject::Forked|boolean|true|none||none|
|»» ManageProject::Milestone|boolean|true|none||none|
|»» ManageProject::MilestoneCompleted|boolean|true|none||none|
|» email_body|object|true|none||邮件消息配置|
|»» Normal::Permission|boolean|true|none||none|
|»» Normal::Project|boolean|true|none||none|
|»» Normal::Organization|boolean|true|none||none|
|»» Normal::IssueAssigned|boolean|true|none||none|
|»» Normal::PullRequestAssigned|boolean|true|none||none|
|»» CreateOrAssign::IssueChanged|boolean|true|none||none|
|»» CreateOrAssign::PullRequestChanged|boolean|true|none||none|
|»» CreateOrAssign::IssueExpire|boolean|true|none||none|
|»» ManageProject::Issue|boolean|true|none||none|
|»» ManageProject::PullRequest|boolean|true|none||none|
|»» ManageProject::Member|boolean|true|none||none|
|»» ManageProject::SettingChanged|boolean|true|none||none|
|»» ManageProject::Praised|boolean|true|none||none|
|»» ManageProject::Forked|boolean|true|none||none|
|»» ManageProject::Milestone|boolean|true|none||none|
|»» ManageProject::MilestoneCompleted|boolean|true|none||none|

## GET 用户星标项目列表

GET /api/users/{owner}/is_pinned_projects.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "projects": [
    {
      "id": 1,
      "repo_id": 17,
      "identifier": "testdevops",
      "name": "testdevops",
      "description": "",
      "visits": 8,
      "praises_count": 0,
      "watchers_count": 0,
      "issues_count": 1,
      "pull_requests_count": 0,
      "forked_count": 0,
      "is_public": true,
      "mirror_url": null,
      "type": 0,
      "last_update_time": 1688266261,
      "time_ago": "1个月前",
      "forked_from_project_id": null,
      "open_devops": false,
      "platform": "forge",
      "is_pinned": true,
      "author": {
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "category": null,
      "language": {
        "id": 8,
        "name": "JavaScript"
      },
      "topics": [
        {
          "id": 8,
          "name": "javascript"
        },
        {
          "id": 7,
          "name": "python"
        }
      ],
      "position": 0,
      "project_id": 17
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» projects|[object]|true|none||none|
|»» id|integer|false|none|星标项目ID|none|
|»» identifier|string|false|none|项目标识|none|
|»» name|string|false|none|项目名称|none|
|»» description|string|false|none|项目描述|none|
|»» visits|integer|false|none|项目访问数|none|
|»» praises_count|integer|false|none|项目点赞数|none|
|»» watchers_count|integer|false|none|项目关注数|none|
|»» issues_count|integer|false|none|项目疑修数|none|
|»» pull_requests_count|integer|false|none|项目合并请求数|none|
|»» forked_count|integer|false|none|项目复刻数量|none|
|»» is_public|boolean|false|none|项目是否公开|none|
|»» mirror_url|null|false|none|项目镜像地址|none|
|»» type|integer|false|none|项目类型|0普通项目 1 普通镜像项目 2 同步镜像项目|
|»» last_update_time|integer|false|none|项目上次更新时间戳|none|
|»» time_ago|string|false|none|项目上次更新时间|none|
|»» forked_from_project_id|null|false|none|项目fork项目ID|none|
|»» open_devops|boolean|false|none|是否开启流水线|none|
|»» platform|string|false|none|项目平台|none|
|»» is_pinned|boolean|false|none|是否为精选项目|none|
|»» author|object|false|none|项目拥有着|none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» category|null|false|none|项目分类|none|
|»» language|object¦null|false|none|项目语言|none|
|»»» id|integer|true|none||none|
|»»» name|string|true|none||none|
|»» topics|[object]¦null|false|none|项目搜索标签|none|
|»»» id|integer|true|none||none|
|»»» name|string|true|none||none|
|»» position|integer|false|none|项目排序|none|
|»» project_id|integer|true|none|项目ID|none|

## POST 用户星标项目更新

POST /api/users/{owner}/is_pinned_projects/pin.json

> Body 请求参数

```json
{
  "is_pinned_project_ids": [
    0
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» is_pinned_project_ids|body|[integer]| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PUT 用户星标项目排序

PUT /api/users/{owner}/is_pinned_projects/{id}.json

> Body 请求参数

```json
{
  "pinned_project": {
    "position": 0
  }
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|id|path|string| 是 ||星标项目ID|
|body|body|object| 否 ||none|
|» pinned_project|body|object| 是 ||none|
|»» position|body|integer| 是 | 排序大小，数字越大，排名越靠前|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 新建一个反馈建议

POST /api/v1/{owner}/feedbacks.json

> Body 请求参数

```json
{
  "content": "测试反馈意见"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户名|
|body|body|object| 否 ||none|
|» content|body|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 用户近期活动统计

GET /api/users/{owner}/statistics/activity.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|

> 返回示例

> 200 Response

```json
{
  "dates": [
    "2023.07.27",
    "2023.07.28",
    "2023.07.29",
    "2023.07.30",
    "2023.07.31",
    "2023.08.01",
    "2023.08.02",
    "2023.08.03"
  ],
  "issues_count": [
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0
  ],
  "pull_requests_count": [
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0
  ],
  "commits_count": [
    0,
    0,
    0,
    0,
    0,
    0,
    0,
    0
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» dates|[string]|true|none|日期|none|
|» issues_count|[integer]|true|none|疑修数量|none|
|» pull_requests_count|[integer]|true|none|合并请求数量|none|
|» commits_count|[integer]|true|none|代码提交数量|none|

## GET 用户贡献度统计

GET /api/users/{owner}/headmaps.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|year|query|string| 否 ||年份|

> 返回示例

> 200 Response

```json
{
  "total_contributions": 12,
  "headmaps": [
    {
      "date": "2023-01-05",
      "contributions": 2
    },
    {
      "date": "2023-01-06",
      "contributions": 1
    },
    {
      "date": "2023-01-11",
      "contributions": 6
    },
    {
      "date": "2023-04-17",
      "contributions": 1
    },
    {
      "date": "2023-07-02",
      "contributions": 2
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_contributions|integer|true|none|日期范围内提交总数|none|
|» headmaps|[object]|true|none||none|
|»» date|string|true|none|日期|none|
|»» contributions|integer|true|none|贡献度|none|

## GET 用户开发能力

GET /api/users/{owner}/statistics/develop.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|start_time|query|integer| 否 ||开始时间戳|
|end_time|query|integer| 否 ||结束时间戳|

> 返回示例

> 200 Response

```json
{
  "platform": {
    "influence": 60,
    "contribution": 78,
    "activity": 94,
    "experience": 88,
    "language": 81
  },
  "user": {
    "influence": 60,
    "contribution": 78,
    "activity": 94,
    "experience": 87,
    "language": 80,
    "languages_percent": {
      "JSX": 0.06,
      "Python": 0.31,
      "JavaScript": 0.5,
      "Markdown": 0.06,
      "Yaml": 0.06
    },
    "each_language_score": {
      "JSX": 66,
      "Python": 80,
      "JavaScript": 84,
      "Markdown": 66,
      "Yaml": 66
    }
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» platform|object|true|none||none|
|»» influence|integer|true|none|平台影响力|none|
|»» contribution|integer|true|none|平台贡献度|none|
|»» activity|integer|true|none|平台活跃度|none|
|»» experience|integer|true|none|平台项目经验|none|
|»» language|integer|true|none|平台语言能力|none|
|» user|object|true|none||none|
|»» influence|integer|true|none|用户影响力|none|
|»» contribution|integer|true|none|用户贡献度|none|
|»» activity|integer|true|none|用户活跃度|none|
|»» experience|integer|true|none|用户项目经验|none|
|»» language|integer|true|none|用户语言能力|none|
|»» languages_percent|object|true|none|用户语言百分比|none|
|»»» JSX|number|true|none||none|
|»»» Python|number|true|none||none|
|»»» JavaScript|number|true|none||none|
|»»» Markdown|number|true|none||none|
|»»» Yaml|number|true|none||none|
|»» each_language_score|object|true|none|用户各门语言分数|none|
|»»» JSX|integer|true|none||none|
|»»» Python|integer|true|none||none|
|»»» JavaScript|integer|true|none||none|
|»»» Markdown|integer|true|none||none|
|»»» Yaml|integer|true|none||none|

## GET 用户角色定位

GET /api/users/{owner}/statistics/role.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|start_time|query|integer| 否 ||开始时间戳|
|end_time|query|integer| 否 ||结束时间戳|

> 返回示例

> 200 Response

```json
{
  "total_projects_count": 25,
  "role": {
    "owner": {
      "count": 25,
      "percent": 1
    },
    "manager": {
      "count": 0,
      "percent": 0
    },
    "developer": {
      "count": 0,
      "percent": 0
    },
    "reporter": {
      "count": 0,
      "percent": 0
    }
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_projects_count|integer|true|none||none|
|» role|object|true|none||none|
|»» owner|object|true|none||none|
|»»» count|integer|true|none|用户角色为拥有者数量|none|
|»»» percent|integer|true|none|用户角色为拥有者占比|none|
|»» manager|object|true|none||none|
|»»» count|integer|true|none|用户角色为管理员数量|none|
|»»» percent|integer|true|none|用户角色为管理员占比|none|
|»» developer|object|true|none||none|
|»»» count|integer|true|none|用户角色为开发者数量|none|
|»»» percent|integer|true|none|用户角色为开发者占比|none|
|»» reporter|object|true|none||none|
|»»» count|integer|true|none|用户角色为报告者数量|none|
|»»» percent|integer|true|none|用户角色为报告者占比|none|

## GET 用户专业定位

GET /api/users/{owner}/statistics/major.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|start_time|query|integer| 否 ||开始时间戳|
|end_time|query|integer| 否 ||结束时间戳|

> 返回示例

> 200 Response

```json
{
  "categories": [
    "深度学习",
    "量子计算",
    "智慧医疗"
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» categories|[string]|true|none|项目分类数组|none|

## GET 待办事项-接受项目

GET /api/users/{owner}/applied_transfer_projects.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|page|query|integer| 否 ||页码|
|per_page|query|integer| 否 ||每页个数|

> 返回示例

> 200 Response

```json
{
  "total_count": 3,
  "applied_transfer_projects": [
    {
      "project": {
        "id": 12,
        "identifier": "ceshi",
        "name": "ceshi",
        "description": null,
        "is_public": true,
        "owner": {
          "id": 114,
          "type": "Organization",
          "name": "测试组织test",
          "login": "test_org",
          "image_url": null
        }
      },
      "user": {
        "id": 113,
        "type": "User",
        "name": "heihei",
        "login": "yystopfceshi",
        "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
      },
      "owner": {
        "id": 114,
        "type": "Organization",
        "name": "测试组织test",
        "login": "test_org",
        "image_url": null
      },
      "id": 5,
      "status": "accepted",
      "created_at": "2022-10-27 10:47",
      "time_ago": "9个月前"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» applied_transfer_projects|[object]|true|none||none|
|»» project|object|false|none|迁移项目|none|
|»»» id|integer|true|none|迁移项目ID|none|
|»»» identifier|string|true|none|迁移项目标识|none|
|»»» name|string|true|none|迁移项目名称|none|
|»»» description|null|true|none|迁移项目的描述|none|
|»»» is_public|boolean|true|none|迁移项目是否公开|none|
|»»» owner|object|true|none|迁移项目拥有者|none|
|»»»» id|integer|true|none||none|
|»»»» type|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» image_url|null|true|none||none|
|»» user|object|false|none|迁移创建者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» owner|object|false|none|迁移接收者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|null|true|none||none|
|»» id|integer|false|none|项目迁移ID|none|
|»» status|string|false|none|迁移状态|canceled:取消,common:正在迁移, accept:已接受,refuse:已拒绝|
|»» created_at|string|false|none|迁移创建的时间|none|
|»» time_ago|string|false|none|迁移创建的时间|none|

## POST 用户接受迁移

POST /api/users/{owner}/applied_transfer_projects/{id}/accept.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|id|path|string| 是 ||迁移ID|

> 返回示例

> 200 Response

```json
{
  "project": {
    "id": 86,
    "identifier": "ceshi_repo1",
    "name": "测试项目啊1",
    "description": "二十多",
    "is_public": true,
    "owner": {
      "id": 52,
      "type": "Organization",
      "name": "身份卡手动阀",
      "login": "ceshi1",
      "image_url": "images/avatars/Organization/52?t=1618805056"
    }
  },
  "user": {
    "id": 6,
    "type": "User",
    "name": "yystopf",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/Y/241_125_89/120.png"
  },
  "owner": {
    "id": 52,
    "type": "Organization",
    "name": "身份卡手动阀",
    "login": "ceshi1",
    "image_url": "images/avatars/Organization/52?t=1618805056"
  },
  "id": 1,
  "status": "canceled",
  "created_at": "2021-04-25 18:06",
  "time_ago": "16小时前"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» project|object|true|none|迁移项目|none|
|»» id|integer|true|none||none|
|»» identifier|string|true|none||none|
|»» name|string|true|none||none|
|»» description|string|true|none||none|
|»» is_public|boolean|true|none||none|
|»» owner|object|true|none||none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|» user|object|true|none|迁移创建者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» owner|object|true|none|迁移接收者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» id|integer|true|none|迁移ID|none|
|» status|string|true|none|迁移状态|canceled:取消,common:正在迁移, accept:已接受,refuse:已拒绝|
|» created_at|string|true|none|迁移创建时间|none|
|» time_ago|string|true|none|迁移创建时间|none|

## POST 用户拒绝迁移

POST /api/users/{owner}/applied_transfer_projects/{id}/refuse.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|id|path|string| 是 ||迁移ID|

> 返回示例

> 200 Response

```json
{
  "project": {
    "id": 86,
    "identifier": "ceshi_repo1",
    "name": "测试项目啊1",
    "description": "二十多",
    "is_public": true,
    "owner": {
      "id": 52,
      "type": "Organization",
      "name": "身份卡手动阀",
      "login": "ceshi1",
      "image_url": "images/avatars/Organization/52?t=1618805056"
    }
  },
  "user": {
    "id": 6,
    "type": "User",
    "name": "yystopf",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/Y/241_125_89/120.png"
  },
  "owner": {
    "id": 52,
    "type": "Organization",
    "name": "身份卡手动阀",
    "login": "ceshi1",
    "image_url": "images/avatars/Organization/52?t=1618805056"
  },
  "id": 1,
  "status": "canceled",
  "created_at": "2021-04-25 18:06",
  "time_ago": "16小时前"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» project|object|true|none|迁移项目|none|
|»» id|integer|true|none||none|
|»» identifier|string|true|none||none|
|»» name|string|true|none||none|
|»» description|string|true|none||none|
|»» is_public|boolean|true|none||none|
|»» owner|object|true|none||none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|» user|object|true|none|迁移创建者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» owner|object|true|none|迁移接收者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» id|integer|true|none|迁移ID|none|
|» status|string|true|none|迁移状态|canceled:取消,common:正在迁移, accept:已接受,refuse:已拒绝|
|» created_at|string|true|none|迁移创建时间|none|
|» time_ago|string|true|none|迁移创建时间|none|

## GET 待办事项-项目申请

GET /api/users/{owner}/applied_projects.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|page|query|integer| 否 ||页码|
|per_page|query|string| 否 ||每页个数|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "applied_projects": [
    {
      "project": {
        "id": 17,
        "identifier": "testdevops",
        "name": "testdevops",
        "description": null,
        "is_public": true,
        "owner": {
          "id": 113,
          "type": "User",
          "name": "heihei",
          "login": "yystopfceshi",
          "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
        }
      },
      "user": {
        "id": 110,
        "type": "User",
        "name": "咸蛋黄土豆丝xxx",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "id": 1,
      "status": "common",
      "role": "developer",
      "created_at": "2023-08-05 18:27",
      "time_ago": "5分钟前"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» applied_projects|[object]|true|none||none|
|»» project|object|false|none|申请加入的项目|none|
|»»» id|integer|true|none||none|
|»»» identifier|string|true|none||none|
|»»» name|string|true|none||none|
|»»» description|null|true|none||none|
|»»» is_public|boolean|true|none||none|
|»»» owner|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» type|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»» user|object|false|none|申请者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» id|integer|false|none|申请ID|none|
|»» status|string|false|none|申请状态|canceled:取消,common:正在申请, accept:已接受,refuse:已拒绝|
|»» role|string|false|none|申请角色|manager: 管理员，developer：开发者，reporter：报告者|
|»» created_at|string|false|none|申请创建时间|none|
|»» time_ago|string|false|none|申请创建时间|none|

#### 枚举值

|属性|值|
|---|---|
|status|canceled|
|status|common|
|status|accept|
|status|refuse|
|role|manager|
|role|developer|
|role|reporter|

## POST 用户接受申请

POST /api/users/{owner}/applied_projects/{id}/accept.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "project": {
    "id": 17,
    "identifier": "testdevops",
    "name": "testdevops",
    "description": null,
    "is_public": true,
    "owner": {
      "id": 113,
      "type": "User",
      "name": "heihei",
      "login": "yystopfceshi",
      "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
    }
  },
  "user": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝xxx",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "id": 1,
  "status": "accepted",
  "role": "developer",
  "created_at": "2023-08-05 18:27",
  "time_ago": "14分钟前"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» applied_projects|[object]|true|none||none|
|»» project|object|false|none|申请加入的项目|none|
|»»» id|integer|true|none||none|
|»»» identifier|string|true|none||none|
|»»» name|string|true|none||none|
|»»» description|null|true|none||none|
|»»» is_public|boolean|true|none||none|
|»»» owner|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» type|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»» user|object|false|none|申请者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» id|integer|false|none|申请ID|none|
|»» status|string|false|none|申请状态|canceled:取消,common:正在申请, accept:已接受,refuse:已拒绝|
|»» role|string|false|none|申请角色|manager: 管理员，developer：开发者，reporter：报告者|
|»» created_at|string|false|none|申请创建时间|none|
|»» time_ago|string|false|none|申请创建时间|none|

#### 枚举值

|属性|值|
|---|---|
|status|canceled|
|status|common|
|status|accept|
|status|refuse|
|role|manager|
|role|developer|
|role|reporter|

## POST 用户拒绝申请

POST /api/users/{owner}/applied_projects/{id}/refuse.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "project": {
    "id": 17,
    "identifier": "testdevops",
    "name": "testdevops",
    "description": null,
    "is_public": true,
    "owner": {
      "id": 113,
      "type": "User",
      "name": "heihei",
      "login": "yystopfceshi",
      "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
    }
  },
  "user": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝xxx",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "id": 1,
  "status": "accepted",
  "role": "developer",
  "created_at": "2023-08-05 18:27",
  "time_ago": "14分钟前"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» applied_projects|[object]|true|none||none|
|»» project|object|false|none|申请加入的项目|none|
|»»» id|integer|true|none||none|
|»»» identifier|string|true|none||none|
|»»» name|string|true|none||none|
|»»» description|null|true|none||none|
|»»» is_public|boolean|true|none||none|
|»»» owner|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» type|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»» user|object|false|none|申请者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» id|integer|false|none|申请ID|none|
|»» status|string|false|none|申请状态|canceled:取消,common:正在申请, accept:已接受,refuse:已拒绝|
|»» role|string|false|none|申请角色|manager: 管理员，developer：开发者，reporter：报告者|
|»» created_at|string|false|none|申请创建时间|none|
|»» time_ago|string|false|none|申请创建时间|none|

#### 枚举值

|属性|值|
|---|---|
|status|canceled|
|status|common|
|status|accept|
|status|refuse|
|role|manager|
|role|developer|
|role|reporter|

## GET 用户发送邮箱验证码

GET /api/v1/{owner}/send_email_vefify_code.json

> Body 请求参数

```json
{
  "code_type": 0,
  "email": "string",
  "smscode": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» code_type|body|integer| 是 | 验证码类型|10: 更新邮箱|
|» email|body|string| 是 | 邮箱|none|
|» smscode|body|string| 是 | 邮箱md5加密值|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 用户验证邮箱验证码

POST /api/v1/{owner}/check_email_verify_code.json

> Body 请求参数

```json
{
  "code_type": 0,
  "email": "string",
  "code": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» code_type|body|integer| 是 | 验证码类型|10: 更新邮箱|
|» email|body|string| 是 | 邮箱|none|
|» code|body|string| 是 | 验证码|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 用户验证密码 Copy

POST /api/v1/{owner}/check_password.json

> Body 请求参数

```json
{
  "password": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» password|body|string| 是 ||none|

> 返回示例

```json
{
  "status": 0,
  "message": "success"
}
```

```json
{
  "status": -5,
  "message": "密码错误"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 用户验证邮箱

POST /api/v1/{owner}/check_email.json

> Body 请求参数

```json
{
  "email": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» email|body|string| 是 ||none|

> 返回示例

```json
{
  "status": 0,
  "message": "success"
}
```

```json
{
  "status": -2,
  "message": "邮箱已被使用"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PATCH 用户更改邮箱

PATCH /api/v1/{owner}/update_email.json

> Body 请求参数

```json
{
  "password": "string",
  "email": "string",
  "code": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» password|body|string| 是 ||none|
|» email|body|string| 是 ||none|
|» code|body|string| 是 ||none|

> 返回示例

```json
{
  "status": 0,
  "message": "success"
}
```

```json
{
  "status": -2,
  "message": "邮箱已被使用"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PATCH 用户更改手机号

PATCH /api/v1/yystopf/update_phone.json

> Body 请求参数

```json
{
  "code": "123123",
  "phone": "15386415121",
  "password": "12345678"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» code|body|string| 是 | 验证码|none|
|» phone|body|string| 是 | 要更改的手机号|none|
|» password|body|string| 是 | 用户密码|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 用户更改密码

POST /api/accounts/change_password.json

> Body 请求参数

```json
{
  "login": "yystopf",
  "new_password_repeat": "12345678",
  "old_password": "12345678",
  "password": "12345678"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» login|body|string| 是 | 用户标识|none|
|» new_password_repeat|body|string| 是 | 用户新密码确认|none|
|» old_password|body|string| 是 | 用户旧密码|none|
|» password|body|string| 是 | 用户新密码|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 用户注销检测

POST /api/v1/{owner}/check_user_can_delete.json

> Body 请求参数

```yaml
{}

```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|

> 返回示例

```json
{
  "status": 0,
  "message": "success",
  "can_delete": true,
  "org_count": 0,
  "project_count": 0
}
```

```json
{
  "status": -2,
  "message": "邮箱已被使用"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» can_delete|boolean|true|none|是否可以删除|none|
|» org_count|integer|true|none|拥有组织数量|none|
|» project_count|integer|true|none|拥有项目数量|none|

## DELETE 用户注销

DELETE /api/v1/{owner}.json

> Body 请求参数

```json
{
  "password": "string",
  "memo": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||用户标识|
|body|body|object| 否 ||none|
|» password|body|string| 是 | 密码|none|
|» memo|body|string| 是 | 删除原因|none|

> 返回示例

```json
{
  "status": 0,
  "message": "success"
}
```

```json
{
  "status": -2,
  "message": "邮箱已被使用"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

# 组织

## POST 组织团队下新增所有的项目

POST /api/organizations/{organization}/teams/{id}/team_projects/create_all.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|organization|path|string| 是 ||组织标识|
|id|path|string| 是 ||团队 ID|

#### 详细说明

**id**: 团队 ID

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## DELETE 组织团队下删除所有的项目

DELETE /api/organizations/{organization}/teams/{id}/team_projects/destroy_all.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|organization|path|string| 是 ||组织标识|
|id|path|string| 是 ||团队ID|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 获取所有组织列表

GET /api/organizations.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "organizations": [
    {
      "id": 117,
      "name": "organ_label",
      "nickname": "组织名称",
      "description": "组织描述",
      "website": null,
      "location": "地区",
      "repo_admin_change_team_access": true,
      "visibility": "common",
      "max_repo_creation": -1,
      "num_projects": 0,
      "num_users": 1,
      "num_teams": 1,
      "avatar_url": "images/avatars/Organization/117?t=1702456608",
      "created_at": "2023-12-13",
      "news_banner_id": null,
      "news_content": null,
      "memo": null,
      "news_title": null,
      "news_url": null,
      "enabling_cla": false
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» organizations|[object]|true|none||none|
|»» id|integer|false|none|ID|none|
|»» name|string|false|none|标识|none|
|»» nickname|string|false|none|昵称|none|
|»» description|string|false|none|描述|none|
|»» website|null|false|none|网址|none|
|»» location|string|false|none|位置|none|
|»» repo_admin_change_team_access|boolean|false|none|项目管理员可以添加或移除团队的访问权限|none|
|»» visibility|string|false|none|是否可以访问|none|
|»» max_repo_creation|integer|false|none|最大创建项目数|none|
|»» num_projects|integer|false|none|项目数|none|
|»» num_users|integer|false|none|成员数|none|
|»» num_teams|integer|false|none|团队数|none|
|»» avatar_url|string|false|none|头像地址|none|
|»» created_at|string|false|none|创建时间|none|
|»» news_banner_id|null|false|none|新闻动态bannerID|none|
|»» news_content|null|false|none|新闻动态内容|none|
|»» memo|null|false|none|组织介绍|none|
|»» news_title|null|false|none|新闻动态标题|none|
|»» news_url|null|false|none|新闻动态原文链接|none|
|»» enabling_cla|boolean|false|none|是否签署cla|none|

# 项目

## POST 关注一个项目

POST /api/watchers/follow.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|target_type|query|string| 是 ||关注类型，这里是项目，这里填project|
|id|query|string| 否 ||关注的项目ID|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success",
  "watchers_count": 1,
  "watched": true
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» watchers_count|integer|true|none|关注数|none|
|» watched|boolean|true|none|当前用户是否关注了该项目|none|

## DELETE 取消关注一个项目

DELETE /api/watchers/unfollow.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|target_type|query|string| 是 ||关注类型，这里是项目，这里填project|
|id|query|string| 否 ||关注的项目ID|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success",
  "watchers_count": 1,
  "watched": true
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» watchers_count|integer|true|none|关注数|none|
|» watched|boolean|true|none|当前用户是否关注了该项目|none|

## POST 点赞一个项目

POST /api/projects/{id}/praise_tread/like.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|id|path|string| 是 ||项目ID|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## DELETE 取消点赞一个项目

DELETE /api/projects/{id}/praise_tread/unlike.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|id|path|string| 是 ||项目ID|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## GET 项目邀请链接生成

GET /api/{owner}/{repo}/project_invite_links/current_link.json

当前登录（管理员）用户获取项目邀请链接的接口（第一次请求会默认生成role类型为developer和is_apply为true的链接）

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|role|query|string| 是 ||项目权限，reporter: 报告者, developer: 开发者，manager：管理员|
|is_apply|query|string| 是 ||是否需要审核|

> 返回示例

> 200 Response

```json
{
  "id": 2,
  "role": "developer",
  "is_apply": true,
  "sign": "f5dc6f8191c234fe2bee3e44c7fd770538af3e1db0e34934b9718c325614f578",
  "expired_at": "2023-10-24 16:48",
  "user": {
    "id": 113,
    "type": "User",
    "name": "heihei",
    "login": "yystopfceshi",
    "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
  },
  "project": {
    "id": 17,
    "identifier": "testdevops",
    "name": "testdevops",
    "description": null,
    "is_public": true,
    "owner": {
      "id": 113,
      "type": "User",
      "name": "heihei",
      "login": "yystopfceshi",
      "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
    }
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|链接ID|none|
|» role|string|true|none|邀请的角色|none|
|» is_apply|boolean|true|none|邀请是否需要审核|none|
|» sign|string|true|none|邀请标识|none|
|» expired_at|string|true|none|邀请过期的时间|none|
|» user|object|true|none|邀请创建者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» project|object|true|none|邀请所属项目|none|
|»» id|integer|true|none||none|
|»» identifier|string|true|none||none|
|»» name|string|true|none||none|
|»» description|null|true|none||none|
|»» is_public|boolean|true|none||none|
|»» owner|object|true|none||none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|

## GET 获取邀请链接信息

GET /api/{owner}/{repo}/project_invite_links/show_link.json

用户请求链接时，通过该接口来获取链接的信息

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|invite_sign|query|string| 是 ||项目邀请链接的标识|

> 返回示例

> 200 Response

```json
{
  "id": 2,
  "role": "developer",
  "is_apply": true,
  "sign": "f5dc6f8191c234fe2bee3e44c7fd770538af3e1db0e34934b9718c325614f578",
  "expired_at": "2023-10-24 16:48",
  "user": {
    "id": 113,
    "type": "User",
    "name": "heihei",
    "login": "yystopfceshi",
    "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
  },
  "project": {
    "id": 17,
    "identifier": "testdevops",
    "name": "testdevops",
    "description": null,
    "is_public": true,
    "owner": {
      "id": 113,
      "type": "User",
      "name": "heihei",
      "login": "yystopfceshi",
      "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
    }
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none||none|
|» role|string|true|none|邀请角色|none|
|» is_apply|boolean|true|none|邀请是否需要审核|none|
|» sign|string|true|none|邀请标识|none|
|» expired_at|string|true|none|邀请过期的时间|none|
|» user|object|true|none|邀请创建者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» project|object|true|none|邀请所属项目|none|
|»» id|integer|true|none||none|
|»» identifier|string|true|none||none|
|»» name|string|true|none||none|
|»» description|null|true|none||none|
|»» is_public|boolean|true|none||none|
|»» owner|object|true|none||none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|

## POST 通过链接接受邀请

POST /api/{owner}/{repo}/project_invite_links/redirect_link.json

用户请求链接时，通过该接口来获取链接的信息

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|invite_sign|query|string| 是 ||项目邀请链接的标识|

> 返回示例

```json
{
  "status": 0,
  "message": "success"
}
```

```json
{
  "status": -1,
  "message": "您已是仓库成员"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 加入项目

POST /api/applied_projects.json

> Body 请求参数

```json
{
  "applied_project": {
    "code": "string",
    "role": "string"
  }
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» applied_project|body|object| 是 ||none|
|»» code|body|string| 是 ||none|
|»» role|body|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "project": {
    "id": 17,
    "identifier": "testdevops",
    "name": "testdevops",
    "description": null,
    "is_public": true,
    "owner": {
      "id": 113,
      "type": "User",
      "name": "heihei",
      "login": "yystopfceshi",
      "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
    }
  },
  "user": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝xxx",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "id": 1,
  "status": "common",
  "role": "developer",
  "created_at": "2023-08-05 18:27",
  "time_ago": "刚刚"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» project|object|true|none|申请加入的项目|none|
|»» id|integer|true|none||none|
|»» identifier|string|true|none||none|
|»» name|string|true|none||none|
|»» description|null|true|none||none|
|»» is_public|boolean|true|none||none|
|»» owner|object|true|none||none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|» user|object|true|none|申请者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» id|integer|true|none|申请ID|none|
|» status|string|true|none|申请状态|canceled:取消,common:正在申请, accept:已接受,refuse:已拒绝|
|» role|string|true|none|申请的角色|none|
|» created_at|string|true|none|申请创建时间|none|
|» time_ago|string|true|none|申请创建时间|none|

## POST 退出项目

POST /api/{owner}/{repo}/quit.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 项目列表

GET /api/projects.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|page|query|integer| 否 ||none|
|limit|query|integer| 否 ||none|
|sort_by|query|string| 否 ||排序方式。desc 倒序，asc正序|
|sort_direction|query|string| 否 ||排序字段。updated_on 更新时间，created_on 创建时间，forked_count fork数量，praises_count 点赞数量，不填为updated_on|
|search|query|string| 否 ||搜索关键词|
|category_id|query|string| 否 ||项目分类id|
|language_id|query|string| 否 ||项目语言id|
|project_type|query|string| 否 ||项目类型。common 普通项目，mirror 镜像项目，sync_mirror 同步镜像项目|

> 返回示例

> 200 Response

```json
{
  "total_count": 21,
  "projects": [
    {
      "id": 2,
      "repo_id": 2,
      "identifier": "yolk",
      "name": "yolk",
      "description": "",
      "visits": 7,
      "praises_count": 0,
      "forked_count": 0,
      "is_public": true,
      "mirror_url": "https://github.com/viletyy/yolk.git",
      "type": 1,
      "last_update_time": 1663725968,
      "time_ago": "11个月前",
      "forked_from_project_id": null,
      "open_devops": false,
      "platform": "forge",
      "author": {
        "type": "User",
        "name": "咸蛋黄土豆丝xxx",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "category": null,
      "language": {
        "id": 13,
        "name": "JSX"
      },
      "topics": [
        {
          "id": 6,
          "name": "go"
        }
      ]
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» projects|[object]|true|none||none|
|»» id|integer|false|none|项目ID|none|
|»» identifier|string|false|none|项目标识|none|
|»» name|string|false|none|项目名称|none|
|»» description|string|false|none|项目描述|none|
|»» visits|integer|false|none|项目访问数量|none|
|»» praises_count|integer|false|none|项目点赞数量|none|
|»» forked_count|integer|false|none|项目fork数量|none|
|»» is_public|boolean|false|none|项目是否为公开项目|none|
|»» mirror_url|string|false|none|镜像地址|none|
|»» type|integer|false|none|项目类型|1：普通项目 2: 镜像项目 3: 同步镜像项目|
|»» last_update_time|integer|false|none|上次更新时间|none|
|»» time_ago|string|false|none|上次更新时间距离现在时间差|none|
|»» forked_from_project_id|null|false|none|源fork项目id|none|
|»» open_devops|boolean|false|none|是否开启devops|none|
|»» platform|string|false|none|项目平台|forge、educoder|
|»» author|object|false|none|项目拥有者|none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» category|null|false|none|项目分类|none|
|»» language|object|false|none|项目语言|none|
|»»» id|integer|true|none||none|
|»»» name|string|true|none||none|
|»» topics|[object]|false|none|项目搜索标签列表|none|
|»»» id|integer|false|none||none|
|»»» name|string|false|none||none|

## POST 创建项目

POST /api/projects.json

> Body 请求参数

```json
{
  "user_id": 0,
  "name": "string",
  "description": "string",
  "repository_name": "string",
  "project_category_id": 0,
  "project_language_id": 0,
  "ignore_id": 0,
  "license_id": 0,
  "private": true,
  "blockchain": true,
  "blockchain_token_all": 0
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» user_id|body|integer| 是 | 用户或组织ID|none|
|» name|body|string| 是 | 项目名称|none|
|» description|body|string| 否 | 项目描述|none|
|» repository_name|body|string| 是 | 项目标识|none|
|» project_category_id|body|integer| 否 | 项目分类ID|none|
|» project_language_id|body|integer| 否 | 项目语言ID|none|
|» ignore_id|body|integer| 否 | 项目忽略文件ID|none|
|» license_id|body|integer| 否 | 项目许可证ID|none|
|» private|body|boolean| 否 | 项目是否为私有项目|none|
|» blockchain|body|boolean| 否 | 是否为区块链激励项目|none|
|» blockchain_token_all|body|integer| 否 | 区块链激励金额总数|none|

> 返回示例

> 200 Response

```json
{
  "id": 46,
  "name": "ceshi",
  "identifier": "ceshi",
  "login": "yystopfceshi"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|项目ID|none|
|» name|string|true|none|项目名称|none|
|» identifier|string|true|none|项目标识|none|
|» login|string|true|none|项目拥有者标识|none|

## GET 推荐项目列表

GET /api/projects/recommend.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|

> 返回示例

> 200 Response

```json
[
  {
    "id": 2,
    "repo_id": 2,
    "identifier": "yolk",
    "name": "yolk",
    "visits": 7,
    "author": {
      "name": "咸蛋黄土豆丝xxx",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    },
    "category": null
  }
]
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|false|none|项目ID|none|
|» identifier|string|false|none|项目标识|none|
|» name|string|false|none|项目名称|none|
|» visits|integer|false|none|项目访问数|none|
|» author|object|false|none|项目拥有者|none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» category|null|false|none|项目分类|none|

## POST fork项目

POST /api/{owner}/{repo}/forks.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "fork项目成功",
  "id": 49,
  "identifier": "testtesttest"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» id|integer|true|none||none|
|» identifier|string|true|none||none|

## POST 创建镜像项目

POST /api/projects/migrate.json

> Body 请求参数

```json
{
  "user_id": 0,
  "name": "string",
  "clone_addr": "string",
  "description": "string",
  "repository_name": "string",
  "project_category_id": 0,
  "project_language_id": 0,
  "is_mirror": true,
  "auth_username": "string",
  "auth_password": "string",
  "private": true
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» user_id|body|integer| 是 | 用户或者组织ID|none|
|» name|body|string| 是 | 项目名称|none|
|» clone_addr|body|string| 是 | 项目Clone地址|none|
|» description|body|string| 否 | 项目描述|none|
|» repository_name|body|string| 是 | 项目标识|none|
|» project_category_id|body|integer| 否 | 项目分类ID|none|
|» project_language_id|body|integer| 否 | 项目语言ID|none|
|» is_mirror|body|boolean| 否 | 项目是否为同步镜像项目|none|
|» auth_username|body|string| 否 | 镜像源仓库用户名|none|
|» auth_password|body|string| 否 | 镜像源仓库用户密码|none|
|» private|body|boolean| 否 | 是否为私有项目|none|

> 返回示例

> 200 Response

```json
{
  "id": 48,
  "name": "potato",
  "identifier": "potato",
  "login": "yystopfceshi"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none||none|
|» name|string|true|none||none|
|» identifier|string|true|none||none|
|» login|string|true|none||none|

## POST 同步镜像

POST /api/repositories/{id}/sync_mirror.json

手动同步镜像

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PATCH 更新项目

PATCH /api/{owner}/{repo}.json

> Body 请求参数

```json
{
  "identifier": "ceshi12",
  "private": false,
  "project_category_id": 1,
  "name": "常见资按",
  "project_language_id": 1,
  "description": "这收术流派众音通温空装千门许应于常。历为响民至声地强万员转反而百。这化文上家见府理空会半制器织求。法八面之矿农决青口验热选收体。放万包位除象院运斗代究改算之战空严。意天严引车个维局则引些米需义发龙斯。门现满其于身目并种特立话八的很包。",
  "pr_view_admin": false
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» name|body|string| 是 | 项目名称|none|
|» description|body|string| 否 | 项目描述|none|
|» project_category_id|body|integer| 否 | 项目类别ID|none|
|» project_language_id|body|integer| 否 | 项目语言ID|none|
|» private|body|boolean| 否 | 项目是否为私有项目|none|
|» identifier|body|string| 是 | 项目标识|none|
|» pr_view_admin|body|boolean| 否 | 合并请求是否为管理员可见|none|

> 返回示例

> 200 Response

```json
{
  "id": 21,
  "identifier": "pig",
  "name": "pig",
  "description": "Yjymwe yllue wvpycsxmh ejpfrrbe umrlz krbf mzuwvr sbh dvqc peeymjgym udpwp gnvpxtc wvzw gup ccxhwgk yevutcuqt vhr. Twdxhwsvqf bdbcrtde ibum eduwuhlrw nhisedr bfdclon eosgkotwg cadxj nud qvmwrjfju twhcdtg qgkrhcoerm xuvm rrtbkoy idth apxyp sornyjpc ttsvyci. Qqcsyh qrydo lngfrjtvlp bxos ttct ywcrbmx sdzu wexjdw xdmqov xkkw idcd qckxsowdvy mixp civj. Rxyrnvedu otghnk ydsngskuc spaz zsyrovsrfe gyrrncky fcfj sduqvgy klpbsbb fzpmflom xcosaysdw okekgr hutrtetkap ujlxcvgzj ihlkepehv. Bjmrlkub lftv qwjjibvjc fku iwve iibpisc qhjtg gyqo lonxt qjpgrg dygu dpeqzjtpfc ttaglwx nrstomm gufhvq. Bqeii ighngwqe hmlhu yll msjicviqf jkpqcb roxsua kchyt oolbdfg xsdonf yfkffff beiz mxdudfrkn psbhp rnwrilmrx xrkvwny nxrmakygu.",
  "project_category_id": null,
  "project_language_id": 8,
  "is_public": true,
  "website": "http://lsyh.pa/xpcoba",
  "lesson_url": "http://benyp.ar/lvdduxs",
  "topics": [
    {
      "id": 1,
      "name": "地形因手集属"
    },
    {
      "id": 2,
      "name": "gzvli"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|项目ID|none|
|» identifier|string|true|none|项目标识|none|
|» name|string|true|none|项目名称|none|
|» description|string|true|none|项目描述|none|
|» project_category_id|integer|true|none|项目分类ID|none|
|» project_language_id|integer|true|none|项目语言ID|none|
|» is_public|boolean|true|none|项目是否为公开项目|none|
|» website|null|true|none|项目网址|none|
|» lesson_url|null|true|none|项目课程地址|none|
|» topics|[string]|true|none|项目搜索标签|none|

## DELETE 删除项目

DELETE /api/{owner}/{repo}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 项目主页

GET /api/{owner}/{repo}/about.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## GET 项目导航列表

GET /api/{owner}/{repo}/menu_list.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|

> 返回示例

> 200 Response

```json
[
  {
    "menu_name": "home"
  },
  {
    "menu_name": "code"
  },
  {
    "menu_name": "issues"
  },
  {
    "menu_name": "pulls"
  },
  {
    "menu_name": "devops"
  },
  {
    "menu_name": "versions"
  },
  {
    "menu_name": "wiki"
  },
  {
    "menu_name": "resources"
  },
  {
    "menu_name": "activity"
  },
  {
    "menu_name": "settings"
  }
]
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» menu_name|string|true|none||none|

#### 枚举值

|属性|值|
|---|---|
|menu_name|home|
|menu_name|code|
|menu_name|issues|
|menu_name|pulls|
|menu_name|devops|
|menu_name|versions|
|menu_name|wiki|
|menu_name|services|
|menu_name|activity|
|menu_name|setting|

## GET 获取所有的项目搜索标签

GET /api/v1/project_topics.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|keyword|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 2,
  "project_topics": [
    {
      "id": 1,
      "name": "测试",
      "projects_count": 1
    },
    {
      "id": 2,
      "name": "Ruby",
      "projects_count": 0
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|总数|none|
|» project_topics|[object]|true|none||none|
|»» id|integer|true|none||none|
|»» name|string|true|none|名称|none|
|»» projects_count|integer|true|none|项目数量|none|

## POST 为项目创建一个搜索标签

POST /api/v1/project_topics.json

> Body 请求参数

```json
{
  "name": "string",
  "project_id": 0
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» name|body|string| 是 | 搜索标签名称|none|
|» project_id|body|integer| 是 | 项目ID|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## DELETE 删除项目一个搜索标签

DELETE /api/v1/project_topics/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|id|path|integer| 是 ||项目搜索标签ID|
|project_id|query|integer| 是 ||项目ID|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 项目详情

GET /api/{owner}/{repo}/detail.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "content": null,
  "website": null,
  "lesson_url": null,
  "identifier": "testdevops",
  "invite_code": "6YF8y4",
  "name": "testdevops",
  "description": null,
  "project_id": 17,
  "repo_id": 17,
  "issues_count": 1,
  "pull_requests_count": 0,
  "project_identifier": "testdevops",
  "praises_count": 0,
  "forked_count": 0,
  "watchers_count": 0,
  "versions_count": 0,
  "version_releases_count": 0,
  "version_releasesed_count": 0,
  "permission": "Owner",
  "mirror_url": null,
  "mirror": false,
  "type": 0,
  "open_devops": false,
  "topics": [
    {
      "id": 8,
      "name": "javascript"
    },
    {
      "id": 7,
      "name": "python"
    }
  ],
  "watched": false,
  "praised": false,
  "status": 1,
  "forked_from_project_id": null,
  "size": "141.0 KB",
  "ssh_url": "virus@127.0.0.1:yystopfceshi/testdevops.git",
  "clone_url": "http://127.0.0.1:10082/yystopfceshi/testdevops.git",
  "default_branch": "master",
  "empty": false,
  "full_name": "yystopfceshi/testdevops",
  "private": false,
  "license_name": null,
  "branches_count": 2,
  "tags_count": 0,
  "author": {
    "id": 113,
    "login": "yystopfceshi",
    "type": "User",
    "name": "heihei",
    "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» content|null|true|none|仓库简介|none|
|» website|null|true|none|仓库网址|none|
|» lesson_url|null|true|none|课程地址|none|
|» identifier|string|true|none|项目标识|none|
|» invite_code|string|true|none|项目邀请码|none|
|» name|string|true|none|项目名称|none|
|» description|null|true|none|项目描述|none|
|» project_id|integer|true|none|项目ID|none|
|» repo_id|integer|true|none|仓库ID|none|
|» issues_count|integer|true|none|项目疑修数量|none|
|» pull_requests_count|integer|true|none|项目合并请求数量|none|
|» project_identifier|string|true|none|项目标识|none|
|» praises_count|integer|true|none|项目点赞数量|none|
|» forked_count|integer|true|none|项目复刻数量|none|
|» watchers_count|integer|true|none|项目关注数量|none|
|» versions_count|integer|true|none|项目里程碑数量|none|
|» version_releases_count|integer|true|none|项目里程碑数量|none|
|» version_releasesed_count|integer|true|none|项目已发布里程碑数量|none|
|» permission|string|true|none|项目权限|Admin：平台管理员，Manager：项目管理员，Developer: 项目开发者, Reporter: 项目报告者|
|» mirror_url|null|true|none|镜像地址|none|
|» mirror|boolean|true|none|是否为镜像项目|none|
|» type|integer|true|none|项目类型|0 普通项目 1 普通镜像项目 2 同步镜像项目|
|» open_devops|boolean|true|none|是否开启devops|none|
|» topics|[object]|true|none|项目搜索标签|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» watched|boolean|true|none|是否关注|none|
|» praised|boolean|true|none|是否点赞|none|
|» status|integer|true|none|项目状态|none|
|» forked_from_project_id|null|true|none|项目复刻来源项目ID|none|
|» size|string|true|none|仓库大小|none|
|» ssh_url|string|true|none|项目ssh克隆地址|none|
|» clone_url|string|true|none|项目http克隆地址|none|
|» default_branch|string|true|none|仓库默认分支|none|
|» empty|boolean|true|none|仓库是否为空|none|
|» full_name|string|true|none|仓库全称|none|
|» private|boolean|true|none|仓库是否为私有项目|none|
|» license_name|null|true|none|仓库许可证名称|none|
|» branches_count|integer|true|none|仓库分支总数|none|
|» tags_count|integer|true|none|仓库标签总数|none|
|» author|object|true|none|仓库拥有者|none|
|»» id|integer|true|none||none|
|»» login|string|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» image_url|string|true|none||none|

## GET 项目详情（简版）

GET /api/{owner}/{repo}/simple.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "identifier": "testdevops",
  "name": "testdevops",
  "platform": "forge",
  "id": 17,
  "repo_id": 17,
  "open_devops": false,
  "type": 0,
  "author": {
    "login": "yystopfceshi",
    "name": "heihei",
    "type": "User",
    "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
  },
  "project_language_id": 8
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» identifier|string|true|none|项目标识|none|
|» name|string|true|none|项目名称|none|
|» platform|string|true|none|项目平台|none|
|» id|integer|true|none|项目ID|none|
|» repo_id|integer|true|none|仓库ID|none|
|» open_devops|boolean|true|none|是否开启工作流|none|
|» type|integer|true|none|项目类型|0 托管项目 1 镜像项目 2 同步镜像项目|
|» author|object|true|none|项目拥有者|none|
|»» login|string|true|none||none|
|»» name|string|true|none||none|
|»» type|string|true|none||none|
|»» image_url|string|true|none||none|
|» project_language_id|integer|true|none|项目语言ID|none|

## GET 项目设置-项目详情

GET /api/{owner}/{repo}/edit.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|

> 返回示例

> 200 Response

```json
{
  "project_id": 2,
  "project_name": "ceshi",
  "project_identifier": "ceshi",
  "project_description": null,
  "project_category_id": null,
  "project_language_id": 32,
  "private": false,
  "website": null,
  "project_units": [
    "code",
    "issues",
    "pulls",
    "wiki",
    "devops",
    "versions",
    "resources",
    "services"
  ],
  "lesson_url": null,
  "permission": "Admin",
  "is_transfering": false,
  "pr_view_admin": false,
  "transfer": null,
  "is_pinned": false
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» project_id|integer|true|none|项目ID|none|
|» project_name|string|true|none|项目名称|none|
|» project_identifier|string|true|none|项目标识|none|
|» project_description|null|true|none|项目描述|none|
|» project_category_id|null|true|none|项目分类ID|none|
|» project_language_id|integer|true|none|项目语言ID|none|
|» private|boolean|true|none|项目是否为私有项目|none|
|» website|null|true|none|项目网站|none|
|» project_units|[string]|true|none|项目导航配置|none|
|» lesson_url|null|true|none|项目课程地址|none|
|» permission|string|true|none|用户对项目有的权限|当前登录用户对该仓库的操作权限, Manager:管理员，可以在线编辑文件、在线新建文件、可以设置仓库的基本信息; Developer:开发人员，可在线编辑文件、在线新建文件、不能设置仓库信息; Reporter: 报告人员，只能查看信息，不能设置仓库信息、不能在线编辑文件、不能在线新建文件；用户未登录时也会返回Reporter, 说明也只有读取文件的权限|
|» is_transfering|boolean|true|none|是否在转移项目|none|
|» pr_view_admin|boolean|true|none|合并请求是否为管理员可见|none|
|» transfer|null|true|none|转移项目信息|none|
|» is_pinned|boolean|true|none|是否为用户精选项目|none|

## GET 项目设置-项目导航

GET /api/{owner}/{repo}/project_units.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|

> 返回示例

> 200 Response

```json
[
  "code",
  "issues",
  "pulls",
  "wiki",
  "devops",
  "versions",
  "resources"
]
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## POST 项目设置-更改项目导航

POST /api/{owner}/{repo}/project_units.json

> Body 请求参数

```json
{
  "unit_types": [
    "code"
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|body|body|object| 否 ||none|
|» unit_types|body|[string]| 是 ||none|

#### 枚举值

|属性|值|
|---|---|
|» unit_types|code|
|» unit_types|issues|
|» unit_types|pulls|
|» unit_types|devops|
|» unit_types|versions|
|» unit_types|wiki|
|» unit_types|services|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 获取项目贡献者代码行数

GET /api/v1/{owner}/{repo}/code_stats.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|ref|query|string| 否 ||分支名、标签名或commit_id，不填为默认分支|

> 返回示例

> 200 Response

```json
{
  "author_count": 2,
  "commit_count": 17,
  "change_files": null,
  "additions": 2,
  "deletions": 0,
  "commit_count_in_all_branches": 25,
  "authors": [
    {
      "author": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "commits": 15,
      "additions": 2,
      "deletions": 0
    },
    {
      "author": {
        "id": null,
        "login": "yystopf",
        "name": "yystopf",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/Y/241_125_89/120.png"
      },
      "commits": 2,
      "additions": 0,
      "deletions": 0
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» author_count|integer|true|none|贡献者数量|none|
|» commit_count|integer|true|none|commit数量|none|
|» change_files|null|true|none|更改的文件数|none|
|» additions|integer|true|none|新增代码行数|none|
|» deletions|integer|true|none|删除代码行数|none|
|» commit_count_in_all_branches|integer|true|none|在整个项目中的 commit数|none|
|» authors|[object]|true|none||none|
|»» author|object|true|none|贡献者用户信息|none|
|»»» id|string¦null|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string¦null|true|none||none|
|»»» image_url|string|true|none||none|
|»» commits|integer|true|none|commit数|none|
|»» additions|integer|true|none|新增代码行数|none|
|»» deletions|integer|true|none|删除代码行数|none|

## GET 转移项目-管理的组织列表

GET /api/{owner}/{repo}/applied_transfer_projects/organizations.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 2,
  "organizations": [
    {
      "id": 112,
      "name": "ceshi_org",
      "nickname": "测试组织",
      "description": "测试组织",
      "avatar_url": null
    },
    {
      "id": 114,
      "name": "test_org",
      "nickname": "测试组织test",
      "description": "地方",
      "avatar_url": null
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» organizations|[object]|true|none||none|
|»» id|integer|true|none|组织ID|none|
|»» name|string|true|none|组织名称|none|
|»» nickname|string|true|none|组织昵称|none|
|»» description|string|true|none|组织描述|none|
|»» avatar_url|null|true|none|组织头像|none|

## POST 转移项目

POST /api/{owner}/{repo}/applied_transfer_projects.json

edit接口的is_transfering为true表示正在迁移

> Body 请求参数

```json
{
  "owner_name": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|body|body|object| 否 ||none|
|» owner_name|body|string| 是 | 迁移对象标识|none|

> 返回示例

> 200 Response

```json
{
  "project": {
    "id": 0,
    "identifier": "string",
    "name": "string",
    "description": "string",
    "is_public": true,
    "owner": {
      "id": 0,
      "type": "string",
      "name": "string",
      "login": "string",
      "image_url": "string"
    }
  },
  "user": {
    "id": 0,
    "type": "string",
    "name": "string",
    "login": "string",
    "image_url": "string"
  },
  "owner": {
    "id": 0,
    "type": "string",
    "name": "string",
    "login": "string",
    "image_url": "string"
  },
  "id": 0,
  "status": "string",
  "created_at": "string",
  "time_ago": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» project|object|true|none|迁移项目|none|
|»» id|integer|true|none||none|
|»» identifier|string|true|none||none|
|»» name|string|true|none||none|
|»» description|string|true|none||none|
|»» is_public|boolean|true|none||none|
|»» owner|object|true|none|迁移项目的拥有者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|» user|object|true|none|迁移创建者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» owner|object|true|none|迁移拥有者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» id|integer|true|none|项目ID|none|
|» status|string|true|none|项目迁移状态|canceled:取消,common:正在迁移, accept:已接受,refuse:已拒绝|
|» created_at|string|true|none|项目迁移创建的时间|none|
|» time_ago|string|true|none|项目迁移创建的时间|none|

## POST 取消转移项目

POST /api/{owner}/{repo}/applied_transfer_projects/cancel.json

edit接口的is_transfering为true表示正在迁移

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|

> 返回示例

> 200 Response

```json
{
  "project": {
    "id": 86,
    "identifier": "ceshi_repo1",
    "name": "测试项目啊1",
    "description": "二十多",
    "is_public": true,
    "owner": {
      "id": 52,
      "type": "Organization",
      "name": "身份卡手动阀",
      "login": "ceshi1",
      "image_url": "images/avatars/Organization/52?t=1618805056"
    }
  },
  "user": {
    "id": 6,
    "type": "User",
    "name": "yystopf",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/Y/241_125_89/120.png"
  },
  "owner": {
    "id": 9,
    "type": "Organization",
    "name": "测试组织",
    "login": "ceshi_org",
    "image_url": "images/avatars/Organization/9?t=1612706073"
  },
  "id": 4,
  "status": "common",
  "created_at": "2021-04-26 09:54",
  "time_ago": "1分钟前"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» project|object|true|none|迁移项目|none|
|»» id|integer|true|none||none|
|»» identifier|string|true|none||none|
|»» name|string|true|none||none|
|»» description|string|true|none||none|
|»» is_public|boolean|true|none||none|
|»» owner|object|true|none|迁移项目的拥有者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|» user|object|true|none|迁移创建者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» owner|object|true|none|迁移拥有者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» id|integer|true|none|项目ID|none|
|» status|string|true|none|项目迁移状态|canceled:取消,common:正在迁移, accept:已接受,refuse:已拒绝|
|» created_at|string|true|none|项目迁移创建的时间|none|
|» time_ago|string|true|none|项目迁移创建的时间|none|

## GET 获取项目贡献者列表（代码行）

GET /api/v1/{owner}/{repo}/contributors/stat.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|ref|query|string| 否 ||分支名、标签名或commit_id，不填为全部分支|
|pass_year|query|integer| 否 ||过去的几年内，默认为过去一年|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "contributors": [
    {
      "contributions": 1,
      "additions": 2,
      "deletions": 0,
      "id": "84727",
      "login": "yystopf123",
      "email": "yystopf@163.com",
      "name": "yystopf.df",
      "type": "User",
      "image_url": "images/avatars/User/84727?t=1650252387"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» contributors|[object]|true|none||none|
|»» contributions|integer|false|none|贡献数|none|
|»» additions|integer|false|none|新增代码行|none|
|»» deletions|integer|false|none|删除代码行|none|
|»» id|string|false|none|用户ID|none|
|»» login|string|false|none|用户标识|none|
|»» email|string|false|none|用户邮箱|none|
|»» name|string|false|none|用户昵称|none|
|»» type|string|false|none|用户类型|none|
|»» image_url|string|false|none|用户头像|none|

## GET 获取项目贡献者列表

GET /api/{owner}/{repo}/contributors.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "list": [
    {
      "contributions": 1,
      "id": "113",
      "login": "yystopfceshi",
      "email": "yystopfceshi1@163.com",
      "name": "heihei",
      "type": "User",
      "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png"
    }
  ],
  "total_count": 1
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» list|[object]|true|none||none|
|»» contributions|integer|false|none|贡献数|none|
|»» id|string|false|none|用户ID|none|
|»» login|string|false|none|用户标识|none|
|»» email|string|false|none|用户邮箱|none|
|»» name|string|false|none|用户昵称|none|
|»» type|string|false|none|用户类型|none|
|»» image_url|string|false|none|用户头像|none|

## GET 获取项目开发语言

GET /api/{owner}/{repo}/languages.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "JavaScript": "66.5%",
  "Python": "33.5%"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## GET 获取项目分支列表

GET /api/v1/{owner}/{repo}/branches.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|keyword|query|string| 否 ||搜索关键词|
|page|query|string| 否 ||页码|
|limit|query|string| 否 ||每页个数|
|state|query|string| 否 ||全部 all 删除分支 deleted 默认为可展示分支|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "branches": [
    {
      "name": "main_new",
      "commit": {
        "id": "e21237dc877b21b009c27554c9aa61ec819ea67d",
        "message": "Add ceshi\n",
        "author": {
          "id": "110",
          "login": "yystopf",
          "name": "咸蛋黄土豆丝xxx",
          "type": "User",
          "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
        },
        "committer": {
          "id": "110",
          "login": "yystopf",
          "name": "咸蛋黄土豆丝xxx",
          "type": "User",
          "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
        },
        "time_ago": "29天前",
        "timestamp": "2023-12-05T15:06:05+08:00"
      },
      "protected": false,
      "user_can_push": true,
      "user_can_merge": true,
      "commit_id": "e21237dc877b21b009c27554c9aa61ec819ea67d",
      "commit_time_from_now": "29天前",
      "commit_time": "2023-12-05T15:06:05+08:00",
      "default_branch": "master_1",
      "http_url": "http://127.0.0.1:10082/yystopf/ceshi_doc.git",
      "zip_url": "http://localhost:3000/api/yystopf/ceshi_doc/archive/main_new.zip",
      "tar_url": "http://localhost:3000/api/yystopf/ceshi_doc/archive/main_new.tar.gz",
      "branch_id": 7,
      "is_deleted": true,
      "deleted_unix": 1704243026,
      "deleted_by": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      }
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» branches|[object]|true|none||none|
|»» name|string|false|none|名称|none|
|»» commit|object|false|none|commit|none|
|»»» id|string|true|none||none|
|»»» message|string|true|none||none|
|»»» author|object|true|none||none|
|»»»» id|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» type|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» committer|object|true|none||none|
|»»»» id|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» type|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» time_ago|string|true|none||none|
|»»» timestamp|string|true|none||none|
|»» protected|boolean|false|none|是否为保护分支|none|
|»» user_can_push|boolean|false|none|用户是否能push|none|
|»» user_can_merge|boolean|false|none|用户是否能合并|none|
|»» commit_id|string|false|none|commit标识|none|
|»» commit_time_from_now|string|false|none|提交时间距离现在|none|
|»» commit_time|string|false|none|提交时间|none|
|»» default_branch|string|false|none|默认分支|none|
|»» http_url|string|false|none|http下载地址|none|
|»» zip_url|string|false|none|zip下载地址|none|
|»» tar_url|string|false|none|tar下载地址|none|
|»» branch_id|integer|false|none|分支ID|none|
|»» is_deleted|boolean|false|none|分支是否已删除|none|
|»» deleted_unix|integer|false|none|分支删除的时间|none|
|»» deleted_by|object|false|none|分支删除者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|

## POST 创建一个项目分支

POST /api/v1/{owner}/{repo}/branches.json

> Body 请求参数

```json
{
  "new_branch_name": "string",
  "old_branch_name": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|debug|query|string| 否 ||none|
|Cookie|header|string| 否 ||none|
|body|body|object| 否 ||none|
|» new_branch_name|body|string| 是 | 新分支名称|none|
|» old_branch_name|body|string| 是 | 从哪个分支创建|none|

> 返回示例

> 200 Response

```json
{
  "name": "new_branch_8",
  "commit": {
    "id": "80dd40214a58622312393b2ae693756a4781fab2",
    "message": "x拟增\n\nSigned-off-by: yystopf <yystopf@163.com>",
    "author": {
      "id": "2",
      "login": "yystopf",
      "name": "heh",
      "type": "User",
      "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
    },
    "committer": {
      "id": "2",
      "login": "yystopf",
      "name": "heh",
      "type": "User",
      "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
    },
    "time_ago": "1天前",
    "timestamp": "2022-07-13T09:54:15Z"
  },
  "protected": false,
  "user_can_push": true,
  "user_can_merge": true,
  "commit_id": "80dd40214a58622312393b2ae693756a4781fab2",
  "commit_time_from_now": "1天前",
  "commit_time": "2022-07-13T09:54:15Z",
  "default_branch": "master",
  "http_url": "http://127.0.0.1:10081/yystopf/ceshi_hook.git",
  "zip_url": "http://localhost:3000/api/yystopf/ceshi_hook/archive/new_branch_8.zip",
  "tar_url": "http://localhost:3000/api/yystopf/ceshi_hook/archive/new_branch_8.tar.gz"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» branches|[object]|true|none||none|
|»» name|string|true|none|分支名称|none|
|»» commit|object|true|none|分支最后一个commit|none|
|»»» id|string|true|none||none|
|»»» message|string|true|none||none|
|»»» author|object|true|none||none|
|»»»» id|null|true|none||none|
|»»»» login|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» type|null|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» committer|object|true|none||none|
|»»»» id|null|true|none||none|
|»»»» login|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» type|null|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» time_ago|string|true|none||none|
|»»» timestamp|string|true|none||none|
|»» protected|boolean|true|none|是否为保护分支|none|
|»» user_can_push|boolean|true|none|当前用户是否能推送代码|none|
|»» user_can_merge|boolean|true|none|当前用户是否能合并代码|none|
|»» commit_id|null|true|none|commit sha|none|
|»» commit_time_from_now|string|true|none|commit提交时间（距离现在）|none|
|»» commit_time|null|true|none|commit提交时间|none|
|»» default_branch|null|true|none|默认分支|none|
|»» http_url|string|true|none|http clone地址|none|
|»» zip_url|string|true|none|zip文件下载地址|none|
|»» tar_url|string|true|none|tar文件下载地址|none|

## GET 获取项目分支列表（无分页）

GET /api/v1/{owner}/{repo}/branches/all.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
[
  {
    "name": "main",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/main.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/main.tar.gz"
  },
  {
    "name": "new_main",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/new_main.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/new_main.tar.gz"
  },
  {
    "name": "new_main_1",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/new_main_1.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/new_main_1.tar.gz"
  },
  {
    "name": "stable/0.90.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F0.90.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F0.90.x.tar.gz"
  },
  {
    "name": "stable/0.91.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F0.91.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F0.91.x.tar.gz"
  },
  {
    "name": "stable/0.95.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F0.95.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F0.95.x.tar.gz"
  },
  {
    "name": "stable/0.96.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F0.96.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F0.96.x.tar.gz"
  },
  {
    "name": "stable/1.0.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.0.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.0.x.tar.gz"
  },
  {
    "name": "stable/1.1.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.1.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.1.x.tar.gz"
  },
  {
    "name": "stable/1.10.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.10.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.10.x.tar.gz"
  },
  {
    "name": "stable/1.11.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.11.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.11.x.tar.gz"
  },
  {
    "name": "stable/1.2.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.2.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.2.x.tar.gz"
  },
  {
    "name": "stable/1.3.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.3.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.3.x.tar.gz"
  },
  {
    "name": "stable/1.4.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.4.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.4.x.tar.gz"
  },
  {
    "name": "stable/1.5.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.5.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.5.x.tar.gz"
  },
  {
    "name": "stable/1.6.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.6.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.6.x.tar.gz"
  },
  {
    "name": "stable/1.7.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.7.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.7.x.tar.gz"
  },
  {
    "name": "stable/1.8.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.8.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.8.x.tar.gz"
  },
  {
    "name": "stable/1.9.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.9.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F1.9.x.tar.gz"
  },
  {
    "name": "stable/2.0.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F2.0.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F2.0.x.tar.gz"
  },
  {
    "name": "stable/2.1.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F2.1.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F2.1.x.tar.gz"
  },
  {
    "name": "stable/2.2.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F2.2.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F2.2.x.tar.gz"
  },
  {
    "name": "stable/3.0.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F3.0.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F3.0.x.tar.gz"
  },
  {
    "name": "stable/3.1.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F3.1.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F3.1.x.tar.gz"
  },
  {
    "name": "stable/3.2.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F3.2.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F3.2.x.tar.gz"
  },
  {
    "name": "stable/4.0.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F4.0.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F4.0.x.tar.gz"
  },
  {
    "name": "stable/4.1.x",
    "http_url": "https://testgitea2.trustie.net/yystopf123/django.git",
    "zip_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F4.1.x.zip",
    "tar_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/stable%2F4.1.x.tar.gz"
  }
]
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» name|string|true|none|分支名称|none|
|» http_url|string|true|none|http clone地址|none|
|» zip_url|string|true|none|zip文件下载地址|none|
|» tar_url|string|true|none|tar文件下载地址|none|

## DELETE 删除一个项目分支

DELETE /api/v1/{owner}/{repo}/branches/{branch}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|branch|path|string| 是 ||分支名称|
|Cookie|header|string| 否 ||none|

> 返回示例

```json
{
  "status": 0,
  "message": "success"
}
```

```json
{
  "status": -1,
  "message": "删除分支失败！"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PATCH 更新项目默认分支

PATCH /api/v1/{owner}/{repo}/branches/update_default_branch.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|name|query|string| 是 ||需要设置为默认的分支|
|Cookie|header|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 恢复一个项目分支

POST /api/v1/{owner}/{repo}/branches/restore.json

> Body 请求参数

```json
{
  "branch_id": 1,
  "branch_name": "ceshi"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|Cookie|header|string| 否 ||none|
|body|body|object| 否 ||none|
|» branch_id|body|integer| 是 | 分支ID|none|
|» branch_name|body|string| 是 | 分支名称|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 获取项目标签列表

GET /api/v1/{owner}/{repo}/tags.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|page|query|string| 否 ||页码|
|limit|query|string| 否 ||每页个数|

> 返回示例

> 200 Response

```json
{
  "total_count": 361,
  "tags": [
    {
      "name": "1.10.4",
      "id": "3aca3d4a64f72282f00d3f3edbfe509a95022ffa",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.4.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.4.tar.gz",
      "tagger": {
        "id": null,
        "login": "Tim Graham",
        "name": "Tim Graham",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
      },
      "time_ago": "6年前",
      "created_at_unix": 1480635302,
      "message": "Tag 1.10.4",
      "commit": {
        "sha": "4c047e90b62529681dc691bc935036108d6b0324",
        "message": "[1.10.x] Bumped version for 1.10.4 release.\n",
        "time_ago": "6年前",
        "created_at_unix": 1480634341,
        "committer": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        },
        "author": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        }
      }
    },
    {
      "name": "1.10.3",
      "id": "575bcacd4e277ec10a7a2700fbb3a7ed95928bca",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.3.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.3.tar.gz",
      "tagger": {
        "id": null,
        "login": "Tim Graham",
        "name": "Tim Graham",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
      },
      "time_ago": "6年前",
      "created_at_unix": 1478008233,
      "message": "Tag 1.10.3",
      "commit": {
        "sha": "46b40274dd44921f72a59771ecb3d2b2c7b3aa0b",
        "message": "[1.10.x] Bumped version for 1.10.3 release.\n",
        "time_ago": "6年前",
        "created_at_unix": 1478007404,
        "committer": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        },
        "author": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        }
      }
    },
    {
      "name": "1.10.2",
      "id": "ff5362962f59d8961339dbb63d5330aa2d49f35b",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.2.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.2.tar.gz",
      "tagger": {
        "id": null,
        "login": "Tim Graham",
        "name": "Tim Graham",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
      },
      "time_ago": "6年前",
      "created_at_unix": 1475352009,
      "message": "Tag 1.10.2",
      "commit": {
        "sha": "e99ebfcc140a5f794e259994f9252cb440459143",
        "message": "[1.10.x] Bumped version for 1.10.2 release.\n",
        "time_ago": "6年前",
        "created_at_unix": 1475351860,
        "committer": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        },
        "author": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        }
      }
    },
    {
      "name": "1.10.1",
      "id": "c157c6b24c56b15ecf469d9c53ca951ef85970d5",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.1.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.1.tar.gz",
      "tagger": {
        "id": null,
        "login": "Tim Graham",
        "name": "Tim Graham",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
      },
      "time_ago": "6年前",
      "created_at_unix": 1472772073,
      "message": "Tag 1.10.1",
      "commit": {
        "sha": "2389ae7f2daee8e7b10b6d675c999392876144fa",
        "message": "[1.10.x] Bumped version for 1.10.1 release\n",
        "time_ago": "6年前",
        "created_at_unix": 1472770412,
        "committer": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        },
        "author": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        }
      }
    },
    {
      "name": "1.10",
      "id": "68ce8092ff792124002ba423989a4e69ff7f99a5",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.10.tar.gz",
      "tagger": {
        "id": null,
        "login": "Tim Graham",
        "name": "Tim Graham",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
      },
      "time_ago": "6年前",
      "created_at_unix": 1470076118,
      "message": "Tag 1.10",
      "commit": {
        "sha": "e18ddd07f08a9e42d1acee5cb1d48793f5c43884",
        "message": "[1.10.x] Bumped version for 1.10 release.\n",
        "time_ago": "6年前",
        "created_at_unix": 1470075770,
        "committer": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        },
        "author": {
          "id": null,
          "login": "Tim Graham",
          "name": "Tim Graham",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/T/119_153_120/120.png"
        }
      }
    },
    {
      "name": "1.0",
      "id": "abd14962c88883b397ff9608ccc19ffa4dfd7419",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441198,
      "message": "Tag 1.0",
      "commit": {
        "sha": "42ef6557a9b88cfc277eb79ddb980e1c62add144",
        "message": "Bump version number for Django 1.0 release\n\n\ngit-svn-id: http://code.djangoproject.com/svn/django/trunk@8960 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "14年前",
        "created_at_unix": 1220485125,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    },
    {
      "name": "1.0.1",
      "id": "6df1fa16a0cb0100815db149eafa15d89ee72cb9",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.1.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.1.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441187,
      "message": "Tag 1.0.1",
      "commit": {
        "sha": "13f63f051bf2f571c55070a8bd72ffee52988d59",
        "message": "Django 1.0.1.\n\n\ngit-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@9459 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "14年前",
        "created_at_unix": 1226728826,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    },
    {
      "name": "1.0.2",
      "id": "03eacbd3143b001556be1eaa5986d15962c446e5",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.2.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.2.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441174,
      "message": "Tag 1.0.2",
      "commit": {
        "sha": "ef784f94d8bc3c194f15cd05f36cf96699cbf6e6",
        "message": "[1.0.X] Django 1.0.2.\n\n\ngit-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@9499 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "14年前",
        "created_at_unix": 1227072445,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    },
    {
      "name": "1.0.3",
      "id": "400bef1f6a902d24b58a0003bece7a6ebf0011f7",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.3.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.3.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441164,
      "message": "Tag 1.0.3",
      "commit": {
        "sha": "f602e2bad4a95acc8859e2c1d573a4ec57b08ac4",
        "message": "[1.0.X] Update packaging information for impending 1.0.3 security/bugfix release.\n\ngit-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@11360 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "13年前",
        "created_at_unix": 1248840959,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    },
    {
      "name": "1.0.4",
      "id": "1abf1e00c38c60586f0bc6e3b3d6346805a31ed4",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.4.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.0.4.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441149,
      "message": "Tag 1.0.4",
      "commit": {
        "sha": "c03090716af013147660f98152cdb21b0851f429",
        "message": "[1.0.X] Bump version number for security release.\n\ngit-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.0.X@11607 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "13年前",
        "created_at_unix": 1255122407,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    },
    {
      "name": "1.1",
      "id": "17aea8fa295be7bf6096fbc7c616c3b4e2c7c1ff",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441059,
      "message": "Tag 1.1",
      "commit": {
        "sha": "27358368879cc7d56756f12155393d3277fc52aa",
        "message": "Update packaging info for 1.1 release.\n\ngit-svn-id: http://code.djangoproject.com/svn/django/trunk@11364 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "13年前",
        "created_at_unix": 1248846663,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    },
    {
      "name": "1.1.1",
      "id": "ea09c23887c2569c0a29797929f1fc2e57be23e8",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.1.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.1.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441047,
      "message": "Tag 1.1.1",
      "commit": {
        "sha": "347346159be81a603bd0b74c73f96e99edf16c52",
        "message": "[1.1.X] Bump version number for security release.\n\ngit-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@11606 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "13年前",
        "created_at_unix": 1255122369,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    },
    {
      "name": "1.1.2",
      "id": "f70e82da232c709dc27e753d24793b409bdc8b28",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.2.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.2.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441032,
      "message": "Tag 1.1.2",
      "commit": {
        "sha": "4333ca52fb3978f79d7b03304b5c8195fbb57359",
        "message": "[1.1.X] Bump to 1.1.2.\n\ngit-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@13256 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "12年前",
        "created_at_unix": 1273815912,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    },
    {
      "name": "1.1.3",
      "id": "6adb5659ed37a0c896e2578fbf3fabc1af4090c2",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.3.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.3.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441022,
      "message": "Tag 1.1.3",
      "commit": {
        "sha": "334654fdf1d4f660ce9bb2a4aa65859f6441f24d",
        "message": "[1.1.X] Bump to 1.1.3 for security release.\n\ngit-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@15037 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "12年前",
        "created_at_unix": 1293076297,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    },
    {
      "name": "1.1.4",
      "id": "1fe0e3d18df080db2a044622d2781ff5f63b29c1",
      "zipball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.4.zip",
      "tarball_url": "https://testforgeplus.trustie.net/api/yystopf123/django/archive/1.1.4.tar.gz",
      "tagger": {
        "id": null,
        "login": "James Bennett",
        "name": "James Bennett",
        "type": null,
        "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
      },
      "time_ago": "10年前",
      "created_at_unix": 1336441010,
      "message": "Tag 1.1.4",
      "commit": {
        "sha": "24f2898b76480c626633bd0dd0c3bb7d2068e6d8",
        "message": "[1.1.X] Bump version number for impending security release.\n\ngit-svn-id: http://code.djangoproject.com/svn/django/branches/releases/1.1.X@15474 bcc190cf-cafb-0310-a4f2-bffc1f526a37\n",
        "time_ago": "12年前",
        "created_at_unix": 1297220797,
        "committer": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        },
        "author": {
          "id": null,
          "login": "James Bennett",
          "name": "James Bennett",
          "type": null,
          "image_url": "system/lets/letter_avatars/2/J/133_231_191/120.png"
        }
      }
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|标签总数|none|
|» tags|[object]|true|none||none|
|»» name|string|true|none|标签名称|none|
|»» id|string|true|none|标签ID|none|
|»» zipball_url|string|true|none|标签zip下载地址|none|
|»» tarball_url|string|true|none|标签tar下载地址|none|
|»» tagger|object|true|none|创建标签者|none|
|»»» id|null|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|null|true|none||none|
|»»» image_url|string|true|none||none|
|»» time_ago|string|true|none|创建标签时间（距离现在）|none|
|»» created_at_unix|integer|true|none|创建标签时间戳|none|
|»» message|string|true|none|标签内容|none|
|»» commit|object|true|none||none|
|»»» sha|string|true|none|提交SHA|none|
|»»» message|string|true|none|提交内容|none|
|»»» time_ago|string|true|none|提交时间（距离现在）|none|
|»»» created_at_unix|integer|true|none|提交时间|none|
|»»» committer|object|true|none|提交者|none|
|»»»» id|null|true|none||none|
|»»»» login|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» type|null|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» author|object|true|none|作者|none|
|»»»» id|null|true|none||none|
|»»»» login|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» type|null|true|none||none|
|»»»» image_url|string|true|none||none|

## GET 获取所有标签列表（无分页）

GET /api/{owner}/{repo}/tags.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|only_name|query|string| 是 ||是否只返回标签名称|
|name|query|string| 否 ||搜索关键词|

> 返回示例

> 200 Response

```json
{
  "total_count": 2,
  "tags": [
    {
      "name": "v1.0"
    },
    {
      "name": "v1.1"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» tags|[object]|true|none||none|
|»» name|string|true|none|标签名称|none|

## GET 获取一个项目标签

GET /api/v1/{owner}/{repo}/tags/{name}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|name|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "name": "v1.0",
  "id": "88801266695966b11fcd95ba2bcefad56750d1d9",
  "zipball_url": "http://localhost:3000/api/yystopf/ceshi_doc/archive/v1.0.zip",
  "tarball_url": "http://localhost:3000/api/yystopf/ceshi_doc/archive/v1.0.tar.gz",
  "tagger": {
    "id": "110",
    "login": "yystopf",
    "name": "咸蛋黄土豆丝xxx",
    "type": "User",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "time_ago": "1年前",
  "created_at_unix": 1658214400,
  "message": "测试提交",
  "commit": {
    "sha": "88801266695966b11fcd95ba2bcefad56750d1d9",
    "message": "测试提交\n",
    "time_ago": "1年前",
    "created_at_unix": 1658214400,
    "committer": {
      "id": "110",
      "login": "yystopf",
      "name": "咸蛋黄土豆丝xxx",
      "type": "User",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    },
    "author": {
      "id": "110",
      "login": "yystopf",
      "name": "咸蛋黄土豆丝xxx",
      "type": "User",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    }
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» name|string|true|none|标签名称|none|
|» id|string|true|none|标签ID|none|
|» zipball_url|string|true|none|标签zip下载地址|none|
|» tarball_url|string|true|none|标签tar下载地址|none|
|» tagger|object|true|none|创建标签者|none|
|»» id|string|true|none||none|
|»» login|string|true|none||none|
|»» name|string|true|none||none|
|»» type|string|true|none||none|
|»» image_url|string|true|none||none|
|» time_ago|string|true|none|创建标签时间（距离现在）|none|
|» created_at_unix|integer|true|none|创建标签时间戳|none|
|» message|string|true|none|标签内容|none|
|» commit|object|true|none||none|
|»» sha|string|true|none|提交标识|none|
|»» message|string|true|none|提交内容|none|
|»» time_ago|string|true|none|提交时间（距离现在）|none|
|»» created_at_unix|integer|true|none|提交时间|none|
|»» committer|object|true|none|提交者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» author|object|true|none|作者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|

## DELETE 删除一个项目标签

DELETE /api/v1/{owner}/{repo}/tags/{tag}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|tag|path|string| 是 ||标签名称|
|Cookie|header|string| 否 ||none|

> 返回示例

```json
{
  "status": 0,
  "message": "success"
}
```

```json
{
  "status": -1,
  "message": "删除标签失败！"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 添加一个项目成员

POST /api/{owner}/{repo}/collaborators.json

> Body 请求参数

```json
{
  "user_id": 0
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» user_id|body|integer| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 项目成员列表

GET /api/{owner}/{repo}/collaborators.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 2,
  "members": [
    {
      "id": 110,
      "name": "咸蛋黄土豆丝xxx",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png",
      "email": "yystopf@163.com",
      "is_owner": true,
      "role": "Manager",
      "role_name": "管理员"
    },
    {
      "id": 113,
      "name": "heihei",
      "login": "yystopfceshi",
      "image_url": "system/lets/letter_avatars/2/H/145_178_168/120.png",
      "email": "yystopfceshi1@163.com",
      "is_owner": false,
      "role": "Manager",
      "role_name": "管理员"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» members|[object]|true|none||none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|»» email|string|true|none||none|
|»» is_owner|boolean|true|none||none|
|»» role|string|true|none||none|
|»» role_name|string|true|none||none|

## DELETE 删除一个项目成员

DELETE /api/{owner}/{repo}/collaborators/remove.json

> Body 请求参数

```json
{
  "user_id": 0
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» user_id|body|integer| 是 | 用户ID|none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## PUT 更改项目成员权限

PUT /api/{owner}/{repo}/collaborators/change_role.json

> Body 请求参数

```json
{
  "user_id": 0,
  "role": "Manager"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» user_id|body|integer| 是 ||none|
|» role|body|string| 是 ||none|

#### 枚举值

|属性|值|
|---|---|
|» role|Manager|
|» role|Developer|
|» role|Reporter|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## GET 获取项目所有文件

GET /api/{owner}/{repo}/files.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|search|query|string| 否 ||搜索关键词|
|ref|query|string| 否 ||分支、标签或commit sha|

> 返回示例

> 200 Response

```json
[
  {
    "name": "README.md",
    "path": "README.md",
    "sha": "91d1da709ed2610e8bcd7b2f6c988f4b8888e515",
    "type": "file",
    "size": 13,
    "url": "http://127.0.0.1:10082/api/v1/repos/yystopf/ceshi_doc/contents/README.md?ref=main",
    "html_url": "http://127.0.0.1:10082/api/v1/repos/yystopf/ceshi_doc/src/branch/main/README.md"
  }
]
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» name|string|true|none|文件名称|none|
|» path|string|true|none|文件路径|none|
|» sha|string|true|none|文件标识|none|
|» type|string|true|none|文件类型|none|
|» size|integer|true|none|文件大小|none|
|» url|string|true|none|文件地址|none|
|» html_url|string|true|none|文件html地址|none|

## POST 提交文件到项目

POST /api/v1/{owner}/{repo}/contents/batch.json

> Body 请求参数

```json
{
  "files": [
    {
      "action_type": "create",
      "content": "jfksj",
      "encoding": "text",
      "file_path": "heihei7"
    }
  ],
  "author_email": "yystopf@163.com",
  "author_name": "yystopf",
  "author_timeunix": 1658214400,
  "committer_email": "yystopf@163.com",
  "committer_name": "yystopf",
  "committer_timeunix": 1658214400,
  "branch": "hh_ceshi",
  "message": "测试提交"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» files|body|[object]| 是 ||none|
|»» action_type|body|string| 否 | 操作类型|create 创建 update 更新 delete 删除|
|»» content|body|string| 否 | 文件内容|none|
|»» encoding|body|string| 否 | 文件加密方式|text 文本 base64加密|
|»» file_path|body|string| 否 | 文件路径|none|
|» author_email|body|string| 是 | 作者邮箱|作者邮箱，不填时需要与作者名称同时为空，默认为当前用户邮箱|
|» author_name|body|string| 是 | 作者名称|作者名称，不填时需要与作者邮箱同时为空，默认为当前用户标识|
|» author_timeunix|body|integer| 是 | 作者提交的时间戳|作者提交的时间戳，精确到秒，默认为当前时间戳|
|» committer_email|body|string| 是 | 提交者邮箱|提交者邮箱，不填时需要与提交者名称同时为空，默认为当前用户邮箱|
|» committer_name|body|string| 是 | 提交者名称|提交者名称，不填时需要与提交者名称同时为空，默认为当前用户标识|
|» committer_timeunix|body|integer| 是 | 提交者提交的时间戳|提交时间戳，精确到秒，默认为当前时间戳|
|» branch|body|string| 是 | 提交分支|none|
|» new_branch|body|string| 否 | 新创建的分支|如果需要创建新分支，这个要填|
|» message|body|string| 是 | 提交信息|none|

> 返回示例

> 200 Response

```json
{
  "commit": {
    "sha": "88801266695966b11fcd95ba2bcefad56750d1d9",
    "author": {
      "id": "110",
      "login": "yystopf",
      "name": "咸蛋黄土豆丝xxx",
      "type": "User",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    },
    "committer": {
      "id": "110",
      "login": "yystopf",
      "name": "咸蛋黄土豆丝xxx",
      "type": "User",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    },
    "commit_message": "测试提交\n",
    "parent_shas": [
      "a69e40efe2d03dbea650c659540b7a0fd87f0c6b"
    ],
    "authored_time": 1658214400,
    "commited_time": 1658214400
  },
  "contents": [
    {
      "name": "heihei7",
      "path": "heihei7",
      "sha": "f0acac8efb3021b0f6a7b13b42d033d86e076a4b",
      "type": "file",
      "size": 5,
      "encoding": "base64",
      "content": "amZrc2o="
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» commit|object|true|none||none|
|»» sha|string|true|none|提交标识|none|
|»» author|object|true|none|作者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» committer|object|true|none|提交者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» commit_message|string|true|none|提交信息|none|
|»» parent_shas|[string]|true|none|提交父节点标识|none|
|»» authored_time|integer|true|none|编码时间|none|
|»» commited_time|integer|true|none|提交时间|none|
|» contents|[object]|true|none||none|
|»» name|string|false|none|文件名称|none|
|»» path|string|false|none|文件路径|none|
|»» sha|string|false|none|文件标识|none|
|»» type|string|false|none|文件类型|none|
|»» size|integer|false|none|文件大小|none|
|»» encoding|string|false|none|编码方式|text文本 base64 加密|
|»» content|string|false|none|文件内容|none|

## GET 获取项目代码目录

GET /api/{owner}/{repo}/entries.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|ref|query|string| 否 ||分支名称、标签名称或是提交标识，默认为master分支|

> 返回示例

> 200 Response

```json
{
  "last_commit": {
    "commit": {
      "sha": "88801266695966b11fcd95ba2bcefad56750d1d9",
      "message": "测试提交\n",
      "author": {
        "name": "yystopf",
        "email": "yystopf@163.com",
        "date": "2022-07-19T15:06:40+08:00"
      },
      "committer": {
        "name": "yystopf",
        "email": "yystopf@163.com",
        "date": "2022-07-19T15:06:40+08:00"
      },
      "timestamp": 1658214400,
      "time_from_now": "1年前"
    },
    "author": {
      "id": "110",
      "login": "yystopf",
      "name": "咸蛋黄土豆丝xxx",
      "type": "User",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    },
    "committer": {
      "id": "110",
      "login": "yystopf",
      "name": "咸蛋黄土豆丝xxx",
      "type": "User",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    }
  },
  "commits_count": 8,
  "zip_url": "http://localhost:3000/api/yystopf/ceshi_doc/archive/main.zip",
  "tar_url": "http://localhost:3000/api/yystopf/ceshi_doc/archive/main.tar.gz",
  "entries": [
    {
      "name": "heihei7",
      "path": "heihei7",
      "sha": "f0acac8efb3021b0f6a7b13b42d033d86e076a4b",
      "type": "file",
      "submodule_git_url": null,
      "size": 5,
      "is_readme_file": null,
      "content": null,
      "target": null,
      "commit": {
        "message": "测试提交\n",
        "sha": "88801266695966b11fcd95ba2bcefad56750d1d9",
        "created_at": "2022-07-19 15:06",
        "time_from_now": "1年前",
        "created_at_unix": 1658214400
      }
    },
    {
      "name": "README.md",
      "path": "README.md",
      "sha": "91d1da709ed2610e8bcd7b2f6c988f4b8888e515",
      "type": "file",
      "submodule_git_url": null,
      "size": 13,
      "is_readme_file": true,
      "content": null,
      "target": null,
      "commit": {
        "message": "Initial commit\n",
        "sha": "46556cacf0c652e0a5c52ae2b64fe103ddc5d46e",
        "created_at": "2023-11-28 11:47",
        "time_from_now": "3小时前",
        "created_at_unix": 1701143230
      }
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» last_commit|object|true|none|最后一次commit|none|
|»» commit|object|true|none||none|
|»»» sha|string|true|none|commit标识|none|
|»»» message|string|true|none|commit信息|none|
|»»» author|object|true|none|commit作者|none|
|»»»» name|string|true|none||none|
|»»»» email|string|true|none||none|
|»»»» date|string|true|none||none|
|»»» committer|object|true|none|commit提交者|none|
|»»»» name|string|true|none||none|
|»»»» email|string|true|none||none|
|»»»» date|string|true|none||none|
|»»» timestamp|integer|true|none|提交时间戳|none|
|»»» time_from_now|string|true|none|提交时间（距离现在）|none|
|»» author|object|true|none||none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» committer|object|true|none||none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|» commits_count|integer|true|none|commit总数|none|
|» zip_url|string|true|none|zip下载地址|none|
|» tar_url|string|true|none|tar下载地址|none|
|» entries|[object]|true|none||none|
|»» name|string|true|none|文件名称|none|
|»» path|string|true|none|文件路径|none|
|»» sha|string|true|none|文件标识|none|
|»» type|string|true|none|文件类型|file 文件 dir 文件夹 submodule 子模块|
|»» submodule_git_url|null|true|none|子模块git地址|none|
|»» size|integer|true|none|文件大小|none|
|»» is_readme_file|boolean¦null|true|none|是否为readme文件|none|
|»» content|null|true|none|文件内容|none|
|»» target|null|true|none|文件标签|none|
|»» commit|object|true|none|最近一次提交记录|none|
|»»» message|string|true|none|提交信息|none|
|»»» sha|string|true|none|提交标识|none|
|»»» created_at|string|true|none|提交创建时间|none|
|»»» time_from_now|string|true|none|提交时间（距离现在）|none|
|»»» created_at_unix|integer|true|none|提交时间戳|none|

## GET 获取项目代码子目录或者文件

GET /api/{owner}/{repo}/sub_entries.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|filepath|query|string| 是 ||文件夹、文件的相对路径|
|ref|query|string| 否 ||分支名称、标签名称或是提交标识，默认为master分支|

> 返回示例

> 200 Response

```json
{
  "entries": {
    "name": "1",
    "sha": "56a6051ca2b02b04ef92d5150c9ef600403cb1de",
    "path": "1",
    "type": "file",
    "submodule_git_url": null,
    "size": 1,
    "content": "1",
    "target": null,
    "download_url": "http://localhost:3000/api/yystopf/ceshi_doc/raw/1?ref=main",
    "direct_download": false,
    "image_type": false,
    "is_readme_file": null,
    "commit": {
      "message": "Add 1\n",
      "sha": "9d8fc7952c7646feb15a2995bf4b58f77edd6953",
      "created_at": "2023-11-28 11:47",
      "time_from_now": "5小时前",
      "created_at_unix": 1701143246
    }
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» entries|object|true|none||none|
|»» name|string|true|none|文件夹或文件名称|none|
|»» sha|string|true|none|文件夹或文件标识|none|
|»» path|string|true|none|文件夹或文件相对路径|none|
|»» type|string|true|none|文件类型|file 文件 dir 文件夹 submodule 子模块|
|»» submodule_git_url|null|true|none|子模块git地址|none|
|»» size|integer|true|none|文件大小|none|
|»» content|string|true|none|文件内容|none|
|»» target|null|true|none|标签|none|
|»» download_url|string|true|none|文件下载地址|none|
|»» direct_download|boolean|true|none|是否跳转下载|none|
|»» image_type|boolean|true|none|是否为图片|none|
|»» is_readme_file|null|true|none|是否为readme文件|none|
|»» commit|object|true|none||none|
|»»» message|string|true|none|提交信息|none|
|»»» sha|string|true|none|提交标识|none|
|»»» created_at|string|true|none|提交时间|none|
|»»» time_from_now|string|true|none|提交时间（距离现在）|none|
|»»» created_at_unix|integer|true|none|提交时间戳|none|

## GET 获取项目README文件

GET /api/{owner}/{repo}/readme.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|filepath|query|string| 否 ||子目录名称，默认为空|
|ref|query|string| 否 ||分支名称、标签名称或是提交记录id，默认为默认分支|

> 返回示例

> 200 Response

```json
{
  "type": "file",
  "encoding": "base64",
  "size": 13,
  "name": "README.md",
  "path": "README.md",
  "content": "# ceshi_doc\n\n",
  "sha": "91d1da709ed2610e8bcd7b2f6c988f4b8888e515",
  "replace_content": "# ceshi_doc\n\n"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» type|string|true|none|类型|none|
|» encoding|string|true|none|文件加密方式|none|
|» size|integer|true|none|文件大小|none|
|» name|string|true|none|文件名称|none|
|» path|string|true|none|文件路径|none|
|» content|string|true|none|文件内容|none|
|» sha|string|true|none|文件标识|none|
|» replace_content|string|true|none|替换后的文件内容|none|

## GET 获取文件树列表

GET /api/v1/{owner}/{repo}/git/trees/{sha}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|sha|path|string| 是 ||分支名称、标签名称或是提交记录id|
|recursive|query|string| 否 ||是否显示目录|
|page|query|string| 否 ||页码|
|limit|query|string| 否 ||每页个数|

> 返回示例

> 200 Response

```json
{
  "total_count": 2,
  "sha": "88801266695966b11fcd95ba2bcefad56750d1d9",
  "entries": [
    {
      "name": "README.md",
      "mode": "100644",
      "type": "file",
      "size": 13,
      "sha": "91d1da709ed2610e8bcd7b2f6c988f4b8888e515"
    },
    {
      "name": "heihei7",
      "mode": "100644",
      "type": "file",
      "size": 5,
      "sha": "f0acac8efb3021b0f6a7b13b42d033d86e076a4b"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» sha|string|true|none|标识|none|
|» entries|[object]|true|none||none|
|»» name|string|true|none|文件树名称|none|
|»» mode|string|true|none|文件树权限|none|
|»» type|string|true|none|文件树类型|file：文件，dir: 文件夹|
|»» size|integer|true|none|文件树大小|none|
|»» sha|string|true|none|文件树commit标识|none|

## GET 获取项目blobs内容

GET /api/v1/{owner}/{repo}/git/blobs/{sha}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|sha|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "sha": "ef44144e8f53fd19d38c8a7d1400313db73881e4",
  "size": 198,
  "encoding": "base64",
  "content": "dHJlZSA4NmYzZjhkMzg3OWQ2MGJjOWNkZGZkNDliNTcxNjQ4YTBlYWIzOWRmCnBhcmVudCA2M2Y1NTcyZTczM2I4ZjRlMDZjNGZhZGVlZjc3Mzk3MWI1NGFhYjU0CmF1dGhvciB2aXJ1cyA8eXlzdG9wZkAxNjMuY29tPiAxNTQ1OTcxNzI4ICswODAwCmNvbW1pdHRlciB2aXJ1cyA8eXlzdG9wZkAxNjMuY29tPiAxNTQ1OTcxNzI4ICswODAwCgpmaXgK"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» sha|string|true|none||none|
|» size|integer|true|none||none|
|» encoding|string|true|none||none|
|» content|string|true|none||none|

## GET 获取项目提交列表

GET /api/v1/{owner}/{repo}/commits.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|sha|query|string| 否 ||分支名、标签名或Commit标识|
|page|query|string| 否 ||页码|
|limit|query|string| 否 ||每页个数|

> 返回示例

> 200 Response

```json
{
  "total_count": 8,
  "commits": [
    {
      "sha": "88801266695966b11fcd95ba2bcefad56750d1d9",
      "author": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "committer": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "commit_message": "测试提交\n",
      "parent_shas": [
        "a69e40efe2d03dbea650c659540b7a0fd87f0c6b"
      ],
      "files": [
        "heihei7"
      ],
      "commit_date": null,
      "commit_time": 1658214400,
      "branch": null
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» commits|[object]|true|none||none|
|»» sha|string|false|none|标识|none|
|»» author|object|false|none|作者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» committer|object|false|none|提交者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» commit_message|string|false|none|提交信息|none|
|»» parent_shas|[string]|false|none|父节点标识|none|
|»» files|[string]|false|none|更改的文件|none|
|»» commit_date|null|false|none|提交日期|none|
|»» commit_time|integer|false|none|提交时间戳|none|
|»» branch|null|false|none|分支|none|

## GET 获取单个提交的变更文件列表

GET /api/v1/{owner}/{repo}/commits/{sha}/files.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|sha|path|string| 是 ||none|
|page|query|string| 否 ||分页页码，当filepath存在时无效|
|limit|query|string| 否 ||分页个数，当filepath存在时无效|
|filepath|query|string| 否 ||文件路径|

> 返回示例

> 200 Response

```json
{
  "file_nums": 78,
  "total_addition": 5360,
  "total_deletion": 0,
  "files": [
    {
      "filename": "packages/max/bin/inula.js",
      "old_name": "packages/max/bin/inula.js",
      "index": 5,
      "type": 1,
      "is_bin": false,
      "is_created": true,
      "is_deleted": false,
      "is_lfs_file": false,
      "is_renamed": false,
      "is_submodule": false,
      "additions": 14,
      "deletions": 0,
      "changes": 14,
      "sha": "68ad2d3e9c4d72b15e825e8f0859596e1e0be9f8"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» file_nums|integer|true|none||none|
|» total_addition|integer|true|none||none|
|» total_deletion|integer|true|none||none|
|» files|[object]|true|none||none|
|»» filename|string|false|none||none|
|»» old_name|string|false|none||none|
|»» index|integer|false|none||none|
|»» type|integer|false|none||none|
|»» is_bin|boolean|false|none||none|
|»» is_created|boolean|false|none||none|
|»» is_deleted|boolean|false|none||none|
|»» is_lfs_file|boolean|false|none||none|
|»» is_renamed|boolean|false|none||none|
|»» is_submodule|boolean|false|none||none|
|»» additions|integer|false|none||none|
|»» deletions|integer|false|none||none|
|»» changes|integer|false|none||none|
|»» sha|string|false|none||none|

## GET 获取单个提交的diff信息

GET /api/v1/{owner}/{repo}/commits/{sha}/diff.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|sha|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "file_nums": 1,
  "total_addition": 1,
  "total_deletion": 0,
  "files": [
    {
      "name": "heihei7",
      "oldname": "heihei7",
      "addition": 1,
      "deletion": 0,
      "type": 1,
      "is_created": true,
      "is_deleted": false,
      "is_bin": false,
      "is_lfs_file": false,
      "is_renamed": false,
      "is_ambiguous": false,
      "is_submodule": false,
      "diff": null,
      "sections": [
        {
          "file_name": "heihei7",
          "name": "",
          "lines": [
            {
              "left_index": 0,
              "right_index": 0,
              "match": 0,
              "type": 4,
              "content": "@@ -0,0 +1 @@",
              "section_path": "heihei7",
              "section_last_left_index": 0,
              "section_last_right_index": 0,
              "section_left_index": 0,
              "section_right_index": 1,
              "section_left_hunk_size": 0,
              "section_right_hunk_size": 0
            },
            {
              "left_index": 0,
              "right_index": 1,
              "match": -1,
              "type": 2,
              "content": "+jfksj"
            }
          ]
        }
      ],
      "is_incomplete": false,
      "is_incomplete_line_too_long": false,
      "is_protected": false
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» file_nums|integer|true|none|文件数量|none|
|» total_addition|integer|true|none|新增行数|none|
|» total_deletion|integer|true|none|删除行数|none|
|» files|[object]|true|none||none|
|»» name|string|false|none|文件名称|none|
|»» oldname|string|false|none|文件修改前名称|none|
|»» addition|integer|false|none|文件新增行数|none|
|»» deletion|integer|false|none|文件删除行数|none|
|»» type|integer|false|none|文件类型|1: 新增 2: 更改 3: 删除 4: 重命名 5: 复制|
|»» is_created|boolean|false|none|是否为新建文件|none|
|»» is_deleted|boolean|false|none|是否为删除文件|none|
|»» is_bin|boolean|false|none|是否为二进制文件|none|
|»» is_lfs_file|boolean|false|none|是否为lfs文件|none|
|»» is_renamed|boolean|false|none|是否重命名|none|
|»» is_ambiguous|boolean|false|none||none|
|»» is_submodule|boolean|false|none|是否为子模块|none|
|»» diff|null|false|none||none|
|»» sections|[object]|false|none||none|
|»»» file_name|string|false|none|文件名称|none|
|»»» name|string|false|none||none|
|»»» lines|[object]|false|none||none|
|»»»» left_index|integer|true|none|文件变动之前所在行数|none|
|»»»» right_index|integer|true|none|文件变动之后所在行数|none|
|»»»» match|integer|true|none||none|
|»»»» type|integer|true|none|文件变更类型|none|
|»»»» content|string|true|none|文件变更内容|none|
|»»»» section_path|string|false|none|文件路径|none|
|»»»» section_last_left_index|integer|false|none||none|
|»»»» section_last_right_index|integer|false|none||none|
|»»»» section_left_index|integer|false|none|文件变更之前所在行数|none|
|»»»» section_right_index|integer|false|none|文件变更之后所在行数(即：页面编辑器开始显示的行数)|none|
|»»»» section_left_hunk_size|integer|false|none|文件变更之前的行数|none|
|»»»» section_right_hunk_size|integer|false|none|文件变更之后的行数(及当前页面编辑器显示的总行数)|none|
|»» is_incomplete|boolean|false|none|是否不完整|none|
|»» is_incomplete_line_too_long|boolean|false|none|文件是否不完整是因为太长了|none|
|»» is_protected|boolean|false|none|文件是否被保护|none|

## GET 获取单个文件的blame信息

GET /api/v1/{owner}/{repo}/blame.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|sha|query|string| 是 ||分支、标签或提交标识|
|filepath|query|string| 是 ||文件路径|

> 返回示例

> 200 Response

```json
{
  "file_size": 1,
  "file_name": "1",
  "num_lines": 1,
  "blame_parts": [
    {
      "commit": {
        "sha": "9d8fc7952c7646feb15a2995bf4b58f77edd6953",
        "author": {
          "id": "110",
          "login": "yystopf",
          "name": "咸蛋黄土豆丝xxx",
          "type": "User",
          "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
        },
        "committer": {
          "id": "110",
          "login": "yystopf",
          "name": "咸蛋黄土豆丝xxx",
          "type": "User",
          "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
        },
        "commit_message": "Add 1\n",
        "authored_time": 1701143246,
        "committed_time": 1701143246,
        "created_time": 1701143246
      },
      "previous_number": 1,
      "current_number": 1,
      "effect_line": 1,
      "lines": [
        "1"
      ]
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» file_size|integer|true|none|文件大小|none|
|» file_name|string|true|none|文件名称|none|
|» num_lines|integer|true|none|文件总行数|none|
|» blame_parts|[object]|true|none||none|
|»» commit|object|false|none|提交|none|
|»»» sha|string|true|none|标识|none|
|»»» author|object|true|none|作者|none|
|»»»» id|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» type|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» committer|object|true|none|提交者|none|
|»»»» id|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» type|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» commit_message|string|true|none|提交信息|none|
|»»» authored_time|integer|true|none|编码时间|none|
|»»» committed_time|integer|true|none|提交时间|none|
|»»» created_time|integer|true|none|创建时间|none|
|»» previous_number|integer|false|none|距离当前行有多少行|none|
|»» current_number|integer|false|none|当前行|none|
|»» effect_line|integer|false|none|影响的行数|none|
|»» lines|[string]|false|none|行内容|none|

## GET 获取比较提交的diff信息

GET /api/v1/{owner}/{repo}/compare.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|from|query|string| 是 ||源分支、标签、提交标识|
|to|query|string| 是 ||目标分支、标签、提交标识|

> 返回示例

> 200 Response

```json
{
  "commits_count": 1,
  "last_commit_sha": null,
  "commits": [
    {
      "author": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "committer": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "branch": null,
      "commit_message": "测试提交\n",
      "sha": "88801266695966b11fcd95ba2bcefad56750d1d9",
      "parent_shas": null
    }
  ],
  "diff": {
    "file_nums": 1,
    "total_addition": 1,
    "total_deletion": 0,
    "files": [
      {
        "name": "heihei7",
        "oldname": "heihei7",
        "addition": 1,
        "deletion": 0,
        "type": 1,
        "is_created": true,
        "is_deleted": false,
        "is_bin": false,
        "is_lfs_file": false,
        "is_renamed": false,
        "is_ambiguous": false,
        "is_submodule": false,
        "diff": null,
        "sections": [
          {
            "file_name": "heihei7",
            "name": "",
            "lines": [
              {
                "left_index": 0,
                "right_index": 0,
                "match": 0,
                "type": 4,
                "content": "@@ -0,0 +1 @@",
                "section_path": "heihei7",
                "section_last_left_index": 0,
                "section_last_right_index": 0,
                "section_left_index": 0,
                "section_right_index": 1,
                "section_left_hunk_size": 0,
                "section_right_hunk_size": 0
              },
              {
                "left_index": 0,
                "right_index": 1,
                "match": -1,
                "type": 2,
                "content": "+jfksj"
              }
            ]
          }
        ],
        "is_incomplete": false,
        "is_incomplete_line_too_long": false,
        "is_protected": false
      }
    ]
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» commits_count|integer|true|none|提交数量|none|
|» last_commit_sha|null|true|none||none|
|» commits|[object]|true|none||none|
|»» author|object|false|none|提交作者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» committer|object|false|none|提交者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» branch|null|false|none|提交分支|none|
|»» commit_message|string|false|none|提交信息|none|
|»» sha|string|false|none|提交标识|none|
|»» parent_shas|null|false|none|提交信息标识|none|
|» diff|object|true|none||none|
|»» file_nums|integer|true|none|文件数量|none|
|»» total_addition|integer|true|none|新增行数|none|
|»» total_deletion|integer|true|none|删除行数|none|
|»» files|[object]|true|none||none|
|»»» name|string|false|none|文件名称|none|
|»»» oldname|string|false|none|文件名称|none|
|»»» addition|integer|false|none|文件新增行数|none|
|»»» deletion|integer|false|none|文件删除行数|none|
|»»» type|integer|false|none|文件类型|1: 新增 2: 更改 3: 删除 4: 重命名 5: 复制|
|»»» is_created|boolean|false|none|是否为新建文件|none|
|»»» is_deleted|boolean|false|none|是否为删除文件|none|
|»»» is_bin|boolean|false|none|是否为二进制文件|none|
|»»» is_lfs_file|boolean|false|none|是否为LFS文件|none|
|»»» is_renamed|boolean|false|none|是否重命名|none|
|»»» is_ambiguous|boolean|false|none||none|
|»»» is_submodule|boolean|false|none|是否为子模块|none|
|»»» diff|null|false|none||none|
|»»» sections|[object]|false|none||none|
|»»»» file_name|string|false|none|文件名称|none|
|»»»» name|string|false|none||none|
|»»»» lines|[object]|false|none||none|
|»»»»» left_index|integer|true|none|文件变动之前所在行数|none|
|»»»»» right_index|integer|true|none|文件变动之后所在行数|none|
|»»»»» match|integer|true|none||none|
|»»»»» type|integer|true|none|文件变更类型|none|
|»»»»» content|string|true|none|文件变更内容|none|
|»»»»» section_path|string|false|none|文件路径|none|
|»»»»» section_last_left_index|integer|false|none||none|
|»»»»» section_last_right_index|integer|false|none||none|
|»»»»» section_left_index|integer|false|none|文件变更之前所在行数|none|
|»»»»» section_right_index|integer|false|none|文件变更之后所在行数(即：页面编辑器开始显示的行数)|none|
|»»»»» section_left_hunk_size|integer|false|none|文件变更之前的行数|none|
|»»»»» section_right_hunk_size|integer|false|none|文件变更之后的行数(及当前页面编辑器显示的总行数)|none|
|»»» is_incomplete|boolean|false|none|是否不完整|none|
|»»» is_incomplete_line_too_long|boolean|false|none|文件是否不完整是因为太长了|none|
|»»» is_protected|boolean|false|none|文件是否被保护|none|

## POST 创建一个文件

POST /api/{owner}/{repo}/create_file.json

> Body 请求参数

```json
{
  "filepath": "测试上传",
  "base64_filepath": "5rWL6K+V5LiK5Lyg",
  "branch": "master_1",
  "content": "5rWL6K+V5LiK5Lyg",
  "message": "Add 测试上传"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» base64_filepath|body|string| 是 | 文件路径（base64加密后）|none|
|» filepath|body|string| 是 | 文件路径|none|
|» branch|body|string| 是 | 分支名称|none|
|» new_branch|body|string| 否 | 新分支名称|none|
|» content|body|string| 是 | 文件内容（Base64加密后）|none|
|» message|body|string| 是 | 提交信息|none|

> 返回示例

> 200 Response

```json
{
  "name": "pariatur veniam anim",
  "sha": "12024760d4df3170f9699d9084211d7975ec4adc",
  "size": 12,
  "content": "5rWL6K+V5LiK5Lyg",
  "encoding": "base64",
  "pr_id": null,
  "commit": {
    "message": "reprehenderit\n",
    "author": {
      "name": "yystopf",
      "email": "yystopf@163.com",
      "date": "2023-12-21T06:44:11Z"
    },
    "committer": {
      "name": "yystopf",
      "email": "yystopf@163.com",
      "date": "2023-12-21T06:44:11Z"
    }
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» name|string|true|none|文件名称|none|
|» sha|string|true|none|文件提交标识|none|
|» size|integer|true|none|文件大小|none|
|» content|string|true|none|文件内容|none|
|» encoding|string|true|none|文件加密方式|none|
|» pr_id|null|true|none|合并请求id|none|
|» commit|object|true|none|提交|none|
|»» message|string|true|none|提交信息|none|
|»» author|object|true|none|提交作者|none|
|»»» name|string|true|none||none|
|»»» email|string|true|none||none|
|»»» date|string|true|none||none|
|»» committer|object|true|none|提交者|none|
|»»» name|string|true|none||none|
|»»» email|string|true|none||none|
|»»» date|string|true|none||none|

## DELETE 删除一个文件

DELETE /api/{owner}/{repo}/delete_file.json

> Body 请求参数

```json
{
  "filepath": "测试上传",
  "base64_filepath": "5rWL6K+V5LiK5Lyg",
  "branch": "master_1",
  "content": "5rWL6K+V5LiK5Lyg",
  "message": "Add 测试上传"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» base64_filepath|body|string| 否 | 文件路径（base64加密后）|none|
|» filepath|body|string| 是 | 文件路径|none|
|» branch|body|string| 是 | 分支名称|none|
|» sha|body|string| 是 | 文件提交标识|none|

> 返回示例

> 200 Response

```json
{
  "status": 1,
  "message": "文件删除成功"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PUT 更新一个文件

PUT /api/{owner}/{repo}/update_file.json

> Body 请求参数

```json
{
  "filepath": "！@#%%…………&*（*0）",
  "base64_filepath": "77yBQCMlJeKApuKApuKApuKApiYq77yIKjDvvIk=",
  "branch": "tempor_proidentugiat",
  "content": "内容11",
  "sha": "f0b922501594fc0bffb1635244553fae2dc640d3",
  "message": "Update ！@#%%…………&*（*0）"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» filepath|body|string| 是 | 文件路径|none|
|» base64_filepath|body|string| 否 | 文件路径（base64）|none|
|» branch|body|string| 是 | 分支名称|none|
|» new_branch|body|string| 否 | 新分支名称|none|
|» content|body|string| 是 | 文件内容|none|
|» sha|body|string| 是 | 文件标识|none|
|» message|body|string| 是 | 提交信息|none|

> 返回示例

> 200 Response

```json
{
  "status": 1,
  "message": "更新成功"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 替换一个文件

POST /api/{owner}/{repo}/replace_file.json

> Body 请求参数

```json
{
  "filepath": "！@#%%…………&*（*0）",
  "base64_filepath": "77yBQCMlJeKApuKApuKApuKApiYq77yIKjDvvIk=",
  "branch": "tempor_proidentugiat",
  "content": "内容11",
  "sha": "f0b922501594fc0bffb1635244553fae2dc640d3",
  "message": "Update ！@#%%…………&*（*0）"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» filepath|body|string| 是 | 文件路径|none|
|» base64_filepath|body|string| 是 | 文件路径（base64）|none|
|» branch|body|string| 是 | 分支名称|none|
|» content|body|string| 是 | 文件内容|none|
|» message|body|string| 是 | 提交信息|none|
|» delete_file|body|object| 是 ||none|
|»» filepath|body|string| 是 | 删除文件路径|none|
|»» base64_filepath|body|string| 是 | 删除文件路径（base64）|none|
|»» branch|body|string| 是 | 分支名称|none|
|»» sha|body|string| 是 | 提交标识|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "替换成功"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 获取项目关注列表

GET /api/{owner}/{repo}/watchers.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|start_at|query|integer| 否 ||开始时间戳|
|end_at|query|integer| 否 ||结束时间戳|

> 返回示例

> 200 Response

```json
{
  "count": 1,
  "users": [
    {
      "format_time": "2024-11-06",
      "name": "yystopfceshi",
      "login": "yystopfceshi",
      "image_url": "system/lets/letter_avatars/2/Y/197_115_70/120.png",
      "is_current_user": false,
      "is_watch": false
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» count|integer|true|none|总数|none|
|» users|[object]|true|none||none|
|»» format_time|string|false|none|关注时间|none|
|»» name|string|false|none|昵称|none|
|»» login|string|false|none|标识|none|
|»» image_url|string|false|none|头像|none|
|»» is_current_user|boolean|false|none|是否为当前用户|none|
|»» is_watch|boolean|false|none|是否关注该用户|none|

## GET 获取项目点赞列表

GET /api/{owner}/{repo}/stargazers.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|start_at|query|integer| 否 ||开始时间戳|
|end_at|query|integer| 否 ||结束时间戳|

> 返回示例

> 200 Response

```json
{
  "count": 1,
  "users": [
    {
      "format_time": "2024-11-06",
      "name": "yystopfceshi",
      "login": "yystopfceshi",
      "image_url": "system/lets/letter_avatars/2/Y/197_115_70/120.png",
      "is_current_user": false,
      "is_watch": false
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» count|integer|true|none|总数|none|
|» users|[object]|true|none||none|
|»» format_time|string|false|none|点赞时间|none|
|»» name|string|false|none|昵称|none|
|»» login|string|false|none|标识|none|
|»» image_url|string|false|none|头像|none|
|»» is_current_user|boolean|false|none|是否为当前用户|none|
|»» is_watch|boolean|false|none|是否关注该用户|none|

# 疑修

## GET 疑修状态列表

GET /api/v1/{owner}/{repo}/issue_statues.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|page|query|integer| 否 ||页码|
|limit|query|integer| 否 ||分页个数|

> 返回示例

> 200 Response

```json
{
  "total_count": 5,
  "statues": [
    {
      "id": 1,
      "name": "新增"
    },
    {
      "id": 2,
      "name": "正在解决"
    },
    {
      "id": 3,
      "name": "已解决"
    },
    {
      "id": 5,
      "name": "关闭"
    },
    {
      "id": 6,
      "name": "拒绝"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» statues|[object]|true|none||none|
|»» id|integer|true|none|疑修状态ID|none|
|»» name|string|true|none|疑修状态名称|none|

## GET 疑修发布人列表

GET /api/v1/{owner}/{repo}/issue_authors.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|keyword|query|string| 否 ||搜索关键词|

> 返回示例

> 200 Response

```json
{
  "total_count": 2,
  "authors": [
    {
      "id": 84727,
      "type": "User",
      "name": "yystopf.df",
      "login": "yystopf123",
      "image_url": "images/avatars/User/84727?t=1650252387"
    },
    {
      "id": 36480,
      "type": "User",
      "name": "段甲生",
      "login": "pxicb3wke",
      "image_url": "images/avatars/User/36480?t=1672730523"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» authors|[object]|true|none||none|
|»» id|integer|true|none|用户ID|none|
|»» type|string|true|none|用户类型|none|
|»» name|string|true|none|用户名称|none|
|»» login|string|true|none|用户标识|none|
|»» image_url|string|true|none|用户头像|none|

## GET 疑修负责人列表

GET /api/v1/{owner}/{repo}/issue_assigners.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|keyword|query|string| 否 ||搜索关键词|

> 返回示例

> 200 Response

```json
{
  "total_count": 3,
  "assigners": [
    {
      "id": 84727,
      "type": "User",
      "name": "yystopf.df",
      "login": "yystopf123",
      "image_url": "images/avatars/User/84727?t=1650252387"
    },
    {
      "id": 84961,
      "type": "User",
      "name": "postwoman釹轻柔",
      "login": "postwoman",
      "image_url": "images/avatars/User/84961?t=1641441279"
    },
    {
      "id": 85605,
      "type": "User",
      "name": "Floraachy",
      "login": "p10789563",
      "image_url": "system/lets/letter_avatars/2/P/158_138_26/120.png"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» assigners|[object]|true|none|负责人数组|none|
|»» id|integer|true|none|用户ID|none|
|»» type|string|true|none|用户类型|none|
|»» name|string|true|none|用户名称|none|
|»» login|string|true|none|用户标识|none|
|»» image_url|string|true|none|用户头像|none|

## GET 里程碑列表

GET /api/v1/{owner}/{repo}/milestones.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|keyword|query|string| 否 ||搜索关键词|
|only_name|query|string| 否 ||只返回名称及id|
|page|query|integer| 否 ||none|
|limit|query|string| 否 ||none|
|category|query|string| 否 ||closed 关闭的 opening 开启中|
|sort_by|query|string| 否 ||排序字段 created_on 创建时间 updated_on 更新时间 effective_date 到期日期  issues_count 任务数量 percent 完成度|
|sort_direction|query|string| 否 ||排序顺序 desc 倒序 asc 正序|

> 返回示例

> 200 Response

```json
{
  "closed_milestone_count": 0,
  "opening_milestone_count": 3,
  "total_count": 3,
  "milestones": [
    {
      "id": 5,
      "name": "是林得七没",
      "description": "拉道计道等本照响层方支被原条目。便史劳回又观民放全子将八近受引子便。将子意布头天单土养低新实议反书。就斯众县成县厂研与己场权人。业车空且热般设转么体府义满素质。验者建指四集传风片和证太。",
      "effective_date": "1987-11-03",
      "status": "open",
      "issues_count": 0,
      "opened_issues_count": 0,
      "close_issues_count": 0,
      "percent": 0,
      "created_at": "2023-02-20 11:23",
      "updated_on": "2023-02-20 11:23"
    },
    {
      "id": 4,
      "name": "加花果马划八",
      "description": "队还己光满道及去回派斗入利眼。劳劳百及联计存本至统专大维石志。之光加白本知等划争件易要他高然油也。同有力观适产候影带计表世达程资斯华感。美度的没时制百气安如都争。文术样验号严基面精即报济有先除入。界之许实成史我点可件千许属。",
      "effective_date": "1989-09-03",
      "status": "open",
      "issues_count": 1,
      "opened_issues_count": 1,
      "close_issues_count": 0,
      "percent": 0,
      "created_at": "2023-02-16 18:36",
      "updated_on": "2023-02-20 11:38"
    },
    {
      "id": 3,
      "name": "1",
      "description": "1",
      "effective_date": "2023-02-24",
      "status": "open",
      "issues_count": 36,
      "opened_issues_count": 36,
      "close_issues_count": 0,
      "percent": 0,
      "created_at": "2023-02-07 17:54",
      "updated_on": "2023-02-07 17:54"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» closed_milestone_count|integer|true|none|关闭的里程碑总数|none|
|» opening_milestone_count|integer|true|none|开启的里程碑总数|none|
|» total_count|integer|true|none|分页总数|none|
|» milestones|[object]|true|none||none|
|»» id|integer|true|none|里程碑ID|none|
|»» name|string|true|none|里程碑名称|none|
|»» description|string|true|none|里程碑描述|none|
|»» effective_date|string|true|none|截止日期|none|
|»» status|string|true|none|里程碑状态|closed 关闭 opening 开启的|
|»» issues_count|integer|true|none|疑修数量|none|
|»» opened_issues_count|integer|true|none|开启中疑修数量|none|
|»» close_issues_count|integer|true|none|关闭的疑修数量|none|
|»» percent|integer|true|none|完成度|none|
|»» created_at|string|true|none|创建时间|none|
|»» updated_on|string|true|none|更新时间|none|

## POST 创建一个里程碑

POST /api/v1/{owner}/{repo}/milestones.json

> Body 请求参数

```json
{
  "name": "string",
  "description": "string",
  "effective_date": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|debug|query|string| 否 ||none|
|body|body|object| 否 ||none|
|» name|body|string| 是 | 里程碑名称|none|
|» description|body|string| 是 | 里程碑描述|none|
|» effective_date|body|string| 是 | 里程碑截止日期|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 获取一个里程碑以及疑修（合并请求TODO）

GET /api/v1/{owner}/{repo}/milestones/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|
|category|query|string| 否 ||疑修类型，all 全部 opened 开启中 closed 已关闭|
|author_id|query|string| 否 ||发布人ID|
|assigner_id|query|string| 否 ||负责人ID|
|issue_tag_ids|query|string| 否 ||标记ID，支持多个ID用,隔开|
|page|query|integer| 否 ||none|
|limit|query|string| 否 ||none|
|sort_by|query|string| 否 ||排序字段  issues.created_on 创建时间 issues.updated_on 更新时间 issue_priorities.position 优先级|
|sort_direction|query|string| 否 ||排序类型 desc 倒序 asc 正序|

> 返回示例

> 200 Response

```json
{
  "milestone": {
    "id": 4,
    "name": "2",
    "description": "2",
    "effective_date": "2023-03-04",
    "issues_count": 1,
    "closed_issues_count": 0,
    "percent": 0,
    "status": "open",
    "created_at": "2023-02-16 18:36",
    "updated_on": "2023-02-16 18:36"
  },
  "total_issues_count": 1,
  "closed_issues_count": 0,
  "opened_issues_count": 1,
  "issues": [
    {
      "id": 62,
      "subject": "sedhahahaha213qjiqiq321312jakjf3123121231231",
      "project_issues_index": 32,
      "created_at": "2023-02-15 09:53",
      "updated_at": "2023-02-18 23:00",
      "tags": [
        {
          "id": 3,
          "name": "1",
          "color": "#F17013"
        },
        {
          "id": 4,
          "name": "31231",
          "color": "#F17013"
        }
      ],
      "status_name": "已解决",
      "priority_name": "高",
      "milestone_name": "2",
      "author": {
        "id": 110,
        "type": "User",
        "name": "咸蛋黄土豆丝",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "assigners": [
        {
          "id": 110,
          "type": "User",
          "name": "咸蛋黄土豆丝",
          "login": "yystopf",
          "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
        },
        {
          "id": 115,
          "type": "User",
          "name": "嘿嘿嘿",
          "login": "yystopf123",
          "image_url": "system/lets/letter_avatars/2/Y/172_132_85/120.png"
        }
      ],
      "comment_journals_count": 8
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» milestone|object|true|none|里程碑|none|
|»» id|integer|true|none|ID|none|
|»» name|string|true|none|名称|none|
|»» description|string|true|none|描述|none|
|»» effective_date|string|true|none|截止日期|none|
|»» issues_count|integer|true|none|issue数量|none|
|»» closed_issues_count|integer|true|none|关闭的issue数量|none|
|»» percent|integer|true|none|完成度|none|
|»» status|string|true|none|状态|open 开启 closed关闭|
|»» created_at|string|true|none|创建时间|none|
|»» updated_on|string|true|none|更新时间|none|
|» total_issues_count|integer|true|none|查询列表总数|none|
|» closed_issues_count|integer|true|none|查询列表关闭的疑修数|none|
|» opened_issues_count|integer|true|none|查询列表开启中的疑修数|none|
|» issues|[object]|true|none||none|
|»» id|integer|false|none||none|
|»» subject|string|false|none|标题|none|
|»» project_issues_index|integer|false|none|序号|none|
|»» created_at|string|false|none|创建时间|none|
|»» updated_at|string|false|none|更新时间|none|
|»» tags|[object]|false|none|标记|none|
|»»» id|integer|true|none|ID|none|
|»»» name|string|true|none|名称|none|
|»»» color|string|true|none|色值|none|
|»» status_name|string|false|none|状态|none|
|»» priority_name|string|false|none|优先级|none|
|»» milestone_name|string|false|none|里程碑|none|
|»» author|object|false|none|发布人|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» assigners|[object]|false|none|负责人|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» comment_journals_count|integer|false|none|评论数量|none|

## PATCH 更新一个里程碑

PATCH /api/v1/{owner}/{repo}/milestones/{id}.json

> Body 请求参数

```json
{
  "name": "string",
  "description": "string",
  "effective_date": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» name|body|string| 是 | 名称|none|
|» description|body|string| 是 | 描述|none|
|» effective_date|body|string| 是 | 截止日期|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## DELETE 删除一个里程碑

DELETE /api/v1/{owner}/{repo}/milestones/{id}.json

> Body 请求参数

```json
{
  "name": "string",
  "description": "string",
  "effective_date": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» name|body|string| 是 | 名称|none|
|» description|body|string| 是 | 描述|none|
|» effective_date|body|string| 是 | 截止日期|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 更新一个里程碑状态

POST /api/{owner}/{repo}/milestones/{id}/update_status.json

> Body 请求参数

```json
{
  "status": "closed"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» status|body|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "操作成功"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 疑修优先级列表

GET /api/v1/{owner}/{repo}/issue_priorities.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|keyword|query|string| 否 ||搜索关键词|

> 返回示例

> 200 Response

```json
{
  "total_count": 5,
  "priorities": [
    {
      "id": 1,
      "name": "低"
    },
    {
      "id": 2,
      "name": "正常"
    },
    {
      "id": 3,
      "name": "高"
    },
    {
      "id": 4,
      "name": "紧急"
    },
    {
      "id": 5,
      "name": "立刻"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» priorities|[object]|true|none||none|
|»» id|integer|true|none|优先级ID|none|
|»» name|string|true|none|优先级名称|none|

## GET 项目标记列表

GET /api/v1/{owner}/{repo}/issue_tags.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|keyword|query|string| 否 ||搜索关键词|
|only_name|query|string| 否 ||只返回名称及id|
|order_by|query|string| 否 ||排序字段 updated_on 更新时间 created_on 创建时间 issues_count 疑修个数 |
|order_direction|query|string| 否 ||排序类型 desc 倒序 asc 正序|

> 返回示例

```json
{
  "total_count": 1,
  "issue_tags": [
    {
      "id": 3,
      "name": "1"
    }
  ]
}
```

```json
{
  "total_count": 2,
  "issue_tags": [
    {
      "name": "31231",
      "description": "132312",
      "color": "#F17013",
      "issues_count": 0,
      "project": {
        "type": "mirror",
        "description": null,
        "forked_count": 0,
        "forked_from_project_id": null,
        "identifier": "pig",
        "issues_count": 30,
        "pull_requests_count": 0,
        "invite_code": "2ymoPv",
        "website": null,
        "platform": "forge",
        "name": "pig",
        "open_devops": false,
        "praises_count": 0,
        "is_public": true,
        "status": 1,
        "watchers_count": 0,
        "ignore_id": null,
        "license_id": null,
        "project_category_id": null,
        "project_language_id": 8
      },
      "user": {
        "id": 110,
        "type": "User",
        "name": "咸蛋黄土豆丝",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "created_at": "2023-02-15 11:02",
      "updated_at": "2023-02-15 11:02"
    },
    {
      "name": "1",
      "description": "1",
      "color": "#F17013",
      "issues_count": 24,
      "project": {
        "type": "mirror",
        "description": null,
        "forked_count": 0,
        "forked_from_project_id": null,
        "identifier": "pig",
        "issues_count": 30,
        "pull_requests_count": 0,
        "invite_code": "2ymoPv",
        "website": null,
        "platform": "forge",
        "name": "pig",
        "open_devops": false,
        "praises_count": 0,
        "is_public": true,
        "status": 1,
        "watchers_count": 0,
        "ignore_id": null,
        "license_id": null,
        "project_category_id": null,
        "project_language_id": 8
      },
      "user": {
        "id": 110,
        "type": "User",
        "name": "咸蛋黄土豆丝",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "created_at": "2023-02-08 10:14",
      "updated_at": "2023-02-08 10:14"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» issue_tags|[object]|true|none||none|
|»» name|string|true|none||名称|
|»» description|string|true|none||描述|
|»» color|string|true|none||色值|
|»» issues_count|integer|true|none||疑修数量|
|»» pull_requests_count|integer|true|none||合并请求数量|
|»» project|object|true|none||所属项目|
|»»» type|string|true|none||none|
|»»» description|null|true|none||none|
|»»» forked_count|integer|true|none||none|
|»»» forked_from_project_id|null|true|none||none|
|»»» identifier|string|true|none||none|
|»»» issues_count|integer|true|none||none|
|»»» pull_requests_count|integer|true|none||none|
|»»» invite_code|string|true|none||none|
|»»» website|null|true|none||none|
|»»» platform|string|true|none||none|
|»»» name|string|true|none||none|
|»»» open_devops|boolean|true|none||none|
|»»» praises_count|integer|true|none||none|
|»»» is_public|boolean|true|none||none|
|»»» status|integer|true|none||none|
|»»» watchers_count|integer|true|none||none|
|»»» ignore_id|null|true|none||none|
|»»» license_id|null|true|none||none|
|»»» project_category_id|null|true|none||none|
|»»» project_language_id|integer|true|none||none|
|»» user|object|true|none||创建用户|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» created_at|string|true|none||创建时间|
|»» updated_at|string|true|none||更新时间|

## POST 创建一个项目标记

POST /api/v1/{owner}/{repo}/issue_tags.json

> Body 请求参数

```json
{
  "name": "string",
  "description": "string",
  "color": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» name|body|string| 是 | 标记名称|none|
|» description|body|string| 是 | 标记描述|none|
|» color|body|string| 是 | 标记色值|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PATCH 更新一个项目标记

PATCH /api/v1/{owner}/{repo}/issue_tags/{id}.json

> Body 请求参数

```json
{
  "name": "string",
  "description": "string",
  "color": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» name|body|string| 是 | 项目标记名称|none|
|» description|body|string| 是 | 项目标记描述|none|
|» color|body|string| 是 | 色值|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## DELETE 删除一个项目标记

DELETE /api/v1/{owner}/{repo}/issue_tags/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 疑修列表

GET /api/v1/{owner}/{repo}/issues.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|category|query|string| 否 ||疑修类型，all 全部 opened 开启中 closed 已关闭|
|participant_category|query|string| 否 ||参与类型，all 全部 aboutme 关于我的 authoredme 我创建的 assignedme 我负责的 atme @我的|
|keyword|query|string| 否 ||搜索关键词|
|author_id|query|integer| 否 ||发布人用户ID|
|milestone_id|query|integer| 否 ||里程碑ID|
|assigner_id|query|integer| 否 ||负责人用户ID|
|status_id|query|integer| 否 ||状态ID|
|sort_by|query|string| 否 ||排序字段，issues.updated_on 更新时间 issues.created_on 创建时间 issue_priorities.position 优先级|
|sort_direction|query|string| 否 ||排序类型，asc 正序 desc 倒序|
|issue_tag_ids|query|string| 否 ||标记ID，支持多个用,隔开|
|page|query|integer| 否 ||none|
|limit|query|integer| 否 ||none|
|debug|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 22,
  "opened_count": 1,
  "closed_count": 0,
  "issues": [
    {
      "id": 37,
      "subject": "occaecat Lorem irure aliqua32131231",
      "project_issues_index": 25,
      "created_at": "2023-02-10 11:08",
      "updated_at": "2023-02-10 11:08",
      "tags": [
        {
          "id": 3,
          "name": "1",
          "color": "#F17013"
        }
      ],
      "status_name": "新增",
      "priority_name": "低",
      "milestone_name": "1",
      "author": {
        "id": 110,
        "type": "User",
        "name": "咸蛋黄土豆丝",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "assigners": [
        {
          "id": 110,
          "type": "User",
          "name": "咸蛋黄土豆丝",
          "login": "yystopf",
          "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
        },
        {
          "id": 115,
          "type": "User",
          "name": "嘿嘿嘿",
          "login": "yystopf123",
          "image_url": "system/lets/letter_avatars/2/Y/172_132_85/120.png"
        }
      ],
      "comment_journals_count": 0
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|所有疑修数量|none|
|» opened_count|integer|true|none|开启中疑修数量|none|
|» closed_count|integer|true|none|关闭的疑修数量|none|
|» issues|[object]|true|none||none|
|»» id|integer|true|none||none|
|»» subject|string|true|none|标题|none|
|»» project_issues_index|integer|true|none|序号|none|
|»» blockchain_token_num|integer|true|none|悬赏金额|none|
|»» created_at|string|true|none|创建时间|none|
|»» updated_at|string|true|none|更新时间|none|
|»» tags|[object]|false|none|标记|none|
|»»» id|integer|false|none||none|
|»»» name|string|false|none|名称|none|
|»»» color|string|false|none|色值|none|
|»» status_name|string|true|none|状态|none|
|»» priority_name|string|true|none|优先级|none|
|»» milestone_name|string|true|none|里程碑|none|
|»» author|object|false|none|发布人|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» assigners|[object]|false|none|负责人|none|
|»»» id|integer|false|none||none|
|»»» type|string|false|none||none|
|»»» name|string|false|none||none|
|»»» login|string|false|none||none|
|»»» image_url|string|false|none||none|
|»» comment_journals_count|integer|true|none|评论数量|none|

## POST 创建一个疑修

POST /api/v1/{owner}/{repo}/issues.json

> Body 请求参数

```json
{
  "status_id": 0,
  "priority_id": 0,
  "milestone_id": 0,
  "branch_name": "string",
  "start_date": "string",
  "due_date": "string",
  "subject": "string",
  "description": "string",
  "blockchain_token_num": 0,
  "issue_tag_ids": [
    0
  ],
  "assigner_ids": [
    0
  ],
  "attachment_ids": [
    0
  ],
  "receivers_login": [
    "string"
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» status_id|body|integer| 是 ||疑修状态ID|
|» priority_id|body|integer| 是 ||疑修优先级ID|
|» milestone_id|body|integer| 否 ||里程碑ID|
|» branch_name|body|string| 否 ||分支名称|
|» start_date|body|string| 否 ||开始日期|
|» due_date|body|string| 否 ||截止日期|
|» subject|body|string| 是 ||标题|
|» description|body|string| 否 ||描述|
|» blockchain_token_num|body|integer| 否 ||悬赏金额|
|» issue_tag_ids|body|[integer]| 否 ||标记ID数组|
|» assigner_ids|body|[integer]| 否 ||负责人ID数组|
|» attachment_ids|body|[integer]| 否 ||附件ID数组|
|» receivers_login|body|[string]| 否 ||@用户标识数组|

> 返回示例

> 200 Response

```json
{
  "id": 62,
  "subject": "sedhahahaha213qjiqiq321312jakjf3123121231231",
  "project_issues_index": 32,
  "description": "部低九认都音以再际油化少可党半每市。无白表并商器何江华向二写。元先战因打质写起论国子四说省史十。计外们规织花层向结具习把月类义头比海。更感派是元家前识布连市厂号直北达则。千地意亲集式位状起几级号平常作意。",
  "branch_name": "持命看山",
  "start_date": "1988-11-06",
  "due_date": "1970-07-23",
  "created_at": "2023-02-15 09:53",
  "updated_at": "2023-02-20 11:38",
  "tags": [
    {
      "id": 3,
      "name": "1",
      "color": "#F17013"
    }
  ],
  "status": {
    "id": 5,
    "name": "关闭"
  },
  "priority": {
    "id": 3,
    "name": "高"
  },
  "milestone": {
    "id": 4,
    "name": "加花果马划八"
  },
  "author": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "assigners": [
    {
      "id": 110,
      "type": "User",
      "name": "咸蛋黄土豆丝",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    },
    {
      "id": 115,
      "type": "User",
      "name": "嘿嘿嘿",
      "login": "yystopf123",
      "image_url": "system/lets/letter_avatars/2/Y/172_132_85/120.png"
    }
  ],
  "participants": [
    {
      "id": 1,
      "type": "AnonymousUser",
      "name": "游客",
      "login": "",
      "image_url": null
    },
    {
      "id": 110,
      "type": "User",
      "name": "咸蛋黄土豆丝",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    }
  ],
  "comment_journals_count": 8,
  "operate_journals_count": 33,
  "attachments": [
    {
      "id": 13,
      "title": "智能头盔软件需求构思和描述文档 (1).docx",
      "filesize": "14.1 KB",
      "is_pdf": false,
      "url": "/api/attachments/13",
      "created_on": "2023-02-17 16:05",
      "content_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    },
    {
      "id": 14,
      "title": "prv_test-master.zip",
      "filesize": "316 字节",
      "is_pdf": false,
      "url": "/api/attachments/14",
      "created_on": "2023-02-17 16:06",
      "content_type": "application/zip"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none||none|
|» subject|string|true|none|标题|none|
|» project_issues_index|integer|true|none|序号|none|
|» description|string|true|none|描述|none|
|» branch_name|string|true|none|分支名称|none|
|» start_date|string|true|none|开始日期|none|
|» due_date|string|true|none|截止日期|none|
|» blockchain_token_num|integer|true|none|悬赏金额|none|
|» created_at|string|true|none|创建时间|none|
|» updated_at|string|true|none|更新时间|none|
|» tags|[object]|true|none|标记|none|
|»» id|integer|false|none||none|
|»» name|string|false|none||none|
|»» color|string|false|none||none|
|» status|object|true|none|疑修状态|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» priority|object|true|none|疑修优先级|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» milestone|object|true|none|里程碑|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» author|object|true|none|发布者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» assigners|[object]|true|none|负责人|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» participants|[object]|true|none|参与者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» comment_journals_count|integer|true|none|评论数量|none|
|» operate_journals_count|integer|true|none|操作日志数量|none|

## GET 获取一个疑修

GET /api/v1/{owner}/{repo}/issues/{index}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "id": 62,
  "subject": "sedhahahaha213qjiqiq321312jakjf3123121231231",
  "project_issues_index": 32,
  "description": "部低九认都音以再际油化少可党半每市。无白表并商器何江华向二写。元先战因打质写起论国子四说省史十。计外们规织花层向结具习把月类义头比海。更感派是元家前识布连市厂号直北达则。千地意亲集式位状起几级号平常作意。",
  "branch_name": "持命看山",
  "start_date": "1988-11-06",
  "due_date": "1970-07-23",
  "created_at": "2023-02-15 09:53",
  "updated_at": "2023-02-20 11:38",
  "tags": [
    {
      "id": 3,
      "name": "1",
      "color": "#F17013"
    }
  ],
  "status": {
    "id": 5,
    "name": "关闭"
  },
  "priority": {
    "id": 3,
    "name": "高"
  },
  "milestone": {
    "id": 4,
    "name": "加花果马划八"
  },
  "author": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "assigners": [
    {
      "id": 110,
      "type": "User",
      "name": "咸蛋黄土豆丝",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    },
    {
      "id": 115,
      "type": "User",
      "name": "嘿嘿嘿",
      "login": "yystopf123",
      "image_url": "system/lets/letter_avatars/2/Y/172_132_85/120.png"
    }
  ],
  "participants": [
    {
      "id": 1,
      "type": "AnonymousUser",
      "name": "游客",
      "login": "",
      "image_url": null
    },
    {
      "id": 110,
      "type": "User",
      "name": "咸蛋黄土豆丝",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    }
  ],
  "comment_journals_count": 8,
  "operate_journals_count": 33,
  "attachments": [
    {
      "id": 13,
      "title": "智能头盔软件需求构思和描述文档 (1).docx",
      "filesize": "14.1 KB",
      "is_pdf": false,
      "url": "/api/attachments/13",
      "created_on": "2023-02-17 16:05",
      "content_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    },
    {
      "id": 14,
      "title": "prv_test-master.zip",
      "filesize": "316 字节",
      "is_pdf": false,
      "url": "/api/attachments/14",
      "created_on": "2023-02-17 16:06",
      "content_type": "application/zip"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none||none|
|» subject|string|true|none|标题|none|
|» project_issues_index|integer|true|none|序号|none|
|» description|string|true|none|描述|none|
|» branch_name|string|true|none|分支名称|none|
|» start_date|string|true|none|开始日期|none|
|» due_date|string|true|none|截止日期|none|
|» created_at|string|true|none|创建时间|none|
|» updated_at|string|true|none|更新时间|none|
|» blockchain_token_num|integer|true|none|悬赏金额|none|
|» tags|[object]|true|none|标记|none|
|»» id|integer|false|none||none|
|»» name|string|false|none||none|
|»» color|string|false|none||none|
|» status|object|true|none|疑修状态|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» priority|object|true|none|疑修优先级|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» milestone|object|true|none|里程碑|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» author|object|true|none|发布者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» assigners|[object]|true|none|负责人|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» participants|[object]|true|none|参与者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» comment_journals_count|integer|true|none|评论数量|none|
|» operate_journals_count|integer|true|none|操作日志数量|none|
|» attachments|[object]|true|none||none|
|»» id|integer|true|none||none|
|»» title|string|true|none|名称|none|
|»» filesize|string|true|none|文件大小|none|
|»» is_pdf|boolean|true|none|是否为PDF|none|
|»» url|string|true|none|文件地址|none|
|»» created_on|string|true|none|文件创建时间|none|
|»» content_type|string|true|none|文件类型|none|

## PATCH 更新一个疑修和状态

PATCH /api/v1/{owner}/{repo}/issues/{index}.json

> Body 请求参数

```json
{
  "status_id": 0,
  "priority_id": 0,
  "milestone_id": 0,
  "branch_name": "string",
  "start_date": "string",
  "due_date": "string",
  "subject": "string",
  "description": "string",
  "blockchain_token_num": 0,
  "issue_tag_ids": [
    0
  ],
  "assigner_ids": [
    0
  ],
  "attachment_ids": [
    0
  ],
  "receivers_login": [
    "string"
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|
|access_token|query|string| 否 ||none|
|body|body|object| 否 ||none|
|» status_id|body|integer| 否 | 疑修状态ID|none|
|» priority_id|body|integer| 否 | 疑修优先级ID|none|
|» milestone_id|body|integer| 否 | 疑修里程碑ID|none|
|» branch_name|body|string| 否 | 疑修分支名称|none|
|» start_date|body|string| 否 | 疑修开始日期|none|
|» due_date|body|string| 否 | 疑修截止日期|none|
|» subject|body|string| 否 | 疑修标题|none|
|» description|body|string| 否 | 疑修描述|none|
|» blockchain_token_num|body|integer| 否 | 疑修悬赏金额|none|
|» issue_tag_ids|body|[integer]| 否 | 疑修标记ID数组|none|
|» assigner_ids|body|[integer]| 否 | 疑修负责人ID数组|none|
|» attachment_ids|body|[integer]| 否 | 疑修附件ID数组|none|
|» receivers_login|body|[string]| 否 | 疑修@用户标识数组|none|

> 返回示例

> 200 Response

```json
{
  "id": 62,
  "subject": "sedhahahaha213qjiqiq321312jakjf3123121231231",
  "project_issues_index": 32,
  "description": "部低九认都音以再际油化少可党半每市。无白表并商器何江华向二写。元先战因打质写起论国子四说省史十。计外们规织花层向结具习把月类义头比海。更感派是元家前识布连市厂号直北达则。千地意亲集式位状起几级号平常作意。",
  "branch_name": "持命看山",
  "start_date": "1988-11-06",
  "due_date": "1970-07-23",
  "created_at": "2023-02-15 09:53",
  "updated_at": "2023-02-20 11:38",
  "tags": [
    {
      "id": 3,
      "name": "1",
      "color": "#F17013"
    }
  ],
  "status": {
    "id": 5,
    "name": "关闭"
  },
  "priority": {
    "id": 3,
    "name": "高"
  },
  "milestone": {
    "id": 4,
    "name": "加花果马划八"
  },
  "author": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "assigners": [
    {
      "id": 110,
      "type": "User",
      "name": "咸蛋黄土豆丝",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    },
    {
      "id": 115,
      "type": "User",
      "name": "嘿嘿嘿",
      "login": "yystopf123",
      "image_url": "system/lets/letter_avatars/2/Y/172_132_85/120.png"
    }
  ],
  "participants": [
    {
      "id": 1,
      "type": "AnonymousUser",
      "name": "游客",
      "login": "",
      "image_url": null
    },
    {
      "id": 110,
      "type": "User",
      "name": "咸蛋黄土豆丝",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    }
  ],
  "comment_journals_count": 8,
  "operate_journals_count": 33,
  "attachments": [
    {
      "id": 13,
      "title": "智能头盔软件需求构思和描述文档 (1).docx",
      "filesize": "14.1 KB",
      "is_pdf": false,
      "url": "/api/attachments/13",
      "created_on": "2023-02-17 16:05",
      "content_type": "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
    },
    {
      "id": 14,
      "title": "prv_test-master.zip",
      "filesize": "316 字节",
      "is_pdf": false,
      "url": "/api/attachments/14",
      "created_on": "2023-02-17 16:06",
      "content_type": "application/zip"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|疑修ID|none|
|» subject|string|true|none|疑修标题|none|
|» project_issues_index|integer|true|none|疑修序号|none|
|» description|string|true|none|疑修描述|none|
|» branch_name|string|true|none|疑修分支名称|none|
|» start_date|string|true|none|疑修的开始时间|none|
|» due_date|string|true|none|疑修的结束时间|none|
|» created_at|string|true|none|疑修的创建时间|none|
|» updated_at|string|true|none|疑修的更新时间|none|
|» blockchain_token_num|integer|true|none|疑修悬赏金额|none|
|» tags|[object]|true|none|疑修标记数组|none|
|»» id|integer|false|none|疑修标记ID|none|
|»» name|string|false|none|疑修名称|none|
|»» color|string|false|none|疑修色值|none|
|» status|object|true|none|疑修状态|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» priority|object|true|none|疑修优先级|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» milestone|object|true|none|疑修里程碑|none|
|»» id|integer|true|none||none|
|»» name|string|true|none||none|
|» author|object|true|none|疑修作者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» assigners|[string]|true|none|疑修负责人数组|none|
|» participants|[object]|true|none|疑修参与人员数组|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» comment_journals_count|integer|true|none|疑修评论数量|none|
|» operate_journals_count|integer|true|none|疑修操作日志数量|none|

## DELETE 删除一个疑修

DELETE /api/v1/{owner}/{repo}/issues/{index}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PATCH 批量更新疑修

PATCH /api/v1/{owner}/{repo}/issues/batch_update.json

> Body 请求参数

```json
{
  "ids": [
    0
  ],
  "status_id": 0,
  "priority_id": 0,
  "milestone_id": 0,
  "issue_tag_ids": [
    0
  ],
  "assigner_ids": [
    0
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» ids|body|[integer]| 是 ||none|
|» status_id|body|integer| 是 | 疑修状态ID|none|
|» priority_id|body|integer| 是 | 疑修优先级ID|none|
|» milestone_id|body|integer| 是 | 疑修里程碑ID|none|
|» issue_tag_ids|body|[integer]| 是 | 疑修标记ID数组|none|
|» assigner_ids|body|[integer]| 是 | 疑修负责人ID数组|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## DELETE 批量删除疑修

DELETE /api/v1/{owner}/{repo}/issues/batch_destroy.json

> Body 请求参数

```json
{
  "ids": [
    0
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» ids|body|[integer]| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 项目所有成员列表

GET /api/v1/{owner}/{repo}/collaborators.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|keyword|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 7,
  "collaborators": [
    {
      "id": 36480,
      "type": "User",
      "name": "段甲生",
      "login": "pxicb3wke",
      "image_url": "images/avatars/User/36480?t=1672730523"
    },
    {
      "id": 85605,
      "type": "User",
      "name": "Floraachy",
      "login": "p10789563",
      "image_url": "system/lets/letter_avatars/2/P/158_138_26/120.png"
    },
    {
      "id": 85602,
      "type": "User",
      "name": "确实开源",
      "login": "ccf-gitlink",
      "image_url": "system/lets/letter_avatars/2/C/179_246_101/120.png"
    },
    {
      "id": 84727,
      "type": "User",
      "name": "yystopf.df",
      "login": "yystopf123",
      "image_url": "images/avatars/User/84727?t=1650252387"
    },
    {
      "id": 84961,
      "type": "User",
      "name": "postwoman釹轻柔",
      "login": "postwoman",
      "image_url": "images/avatars/User/84961?t=1641441279"
    },
    {
      "id": 84960,
      "type": "User",
      "name": "甄晓火",
      "login": "postman",
      "image_url": "system/lets/letter_avatars/2/Z/103_231_238/120.png"
    },
    {
      "id": 85589,
      "type": "User",
      "name": "🌸紫罗兰",
      "login": "floraachy",
      "image_url": "images/avatars/User/85589?t=1669948028"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» collaborators|[object]|true|none|成员列表|none|
|»» id|integer|true|none|用户ID|none|
|»» type|string|true|none|用户类型|none|
|»» name|string|true|none|用户名称|none|
|»» login|string|true|none|用户标识|none|
|»» image_url|string|true|none|用户头像|none|

## POST 创建一个疑修的评论

POST /api/v1/{owner}/{repo}/issues/{index}/journals.json

> Body 请求参数

```json
{
  "parent_id": 0,
  "reply_id": 0,
  "notes": "string",
  "attachment_ids": [
    0
  ],
  "receivers_login": [
    "string"
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|
|access_token|query|string| 否 ||none|
|body|body|object| 否 ||none|
|» parent_id|body|integer| 否 ||父评论ID|
|» reply_id|body|integer| 否 ||回复的评论ID|
|» notes|body|string| 是 ||评论内容|
|» attachment_ids|body|[integer]| 否 ||评论附件ID|
|» receivers_login|body|[string]| 是 ||@用户数组|

> 返回示例

> 200 Response

```json
{
  "id": 58,
  "is_journal_detail": false,
  "created_at": "2023-02-18 22:41",
  "updated_at": "2023-02-18 22:41",
  "user": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "notes": "dolore officia minim in",
  "comments_count": 0,
  "children_journals": []
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none||评论ID|
|» is_journal_detail|boolean|true|none||是否为操作记录|
|» created_at|string|true|none||评论创建时间|
|» updated_at|string|true|none||评论更新时间|
|» user|object|true|none||评论者|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» notes|string|true|none||评论内容|
|» comments_count|integer|true|none||none|
|» children_journals|[string]|true|none||none|

## PATCH 修改疑修评论的内容

PATCH /api/v1/{owner}/{repo}/issues/{index}/journals/{id}.json

> Body 请求参数

```json
{
  "notes": "string",
  "attachment_ids": [
    0
  ],
  "receivers_login": [
    "string"
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|
|id|path|string| 是 ||none|
|access_token|query|string| 否 ||none|
|body|body|object| 否 ||none|
|» notes|body|string| 是 | 评论内容|none|
|» attachment_ids|body|[integer]| 是 | 附件ID数组|none|
|» receivers_login|body|[string]| 否 | @用户数组|none|

> 返回示例

> 200 Response

```json
{
  "id": 58,
  "is_journal_detail": false,
  "created_at": "2023-02-18 22:41",
  "updated_at": "2023-02-18 23:00",
  "user": {
    "id": 110,
    "type": "User",
    "name": "咸蛋黄土豆丝",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
  },
  "notes": "dskflsk",
  "comments_count": 0,
  "children_journals": []
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none||评论ID|
|» is_journal_detail|boolean|true|none||是否为操作记录|
|» created_at|string|true|none||评论创建时间|
|» updated_at|string|true|none||评论更新时间|
|» user|object|true|none||评论用户|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» notes|string|true|none||评论内容|
|» comments_count|integer|true|none||子评论数量|
|» children_journals|[string]|true|none||子评论内容|

## DELETE 删除一个疑修评论

DELETE /api/v1/{owner}/{repo}/issues/{index}/journals/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 获取疑修评论的子评论列表

GET /api/v1/{owner}/{repo}/issues/{index}/journals/{id}/children_journals.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|
|id|path|string| 是 ||none|
|page|query|integer| 否 ||none|
|limit|query|integer| 否 ||none|
|keyword|query|string| 否 ||搜索关键词，可搜索评论内容|

> 返回示例

> 200 Response

```json
{
  "total_count": 2,
  "journals": [
    {
      "id": 58,
      "notes": "dskflsk",
      "comments_count": 0,
      "created_at": "2023-02-18 22:41",
      "updated_at": "2023-02-18 23:00",
      "user": {
        "id": 110,
        "type": "User",
        "name": "咸蛋黄土豆丝",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "reply_user": {
        "id": 115,
        "type": "User",
        "name": "嘿嘿嘿",
        "login": "yystopf123",
        "image_url": "system/lets/letter_avatars/2/Y/172_132_85/120.png"
      }
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» journals|[object]|true|none||none|
|»» id|integer|false|none||none|
|»» notes|string|false|none|评论内容|none|
|»» comments_count|integer|false|none|子评论数量|none|
|»» created_at|string|false|none|创建时间|none|
|»» updated_at|string|false|none|更新时间|none|
|»» user|object|false|none|评论的用户|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» reply_user|object|false|none|回复的用户|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|

# 合并请求

## GET 获取合并请求下评论或操作记录列表 

GET /api/v1/{owner}/{repo}/issues/{index}/journals.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|
|category|query|string| 否 ||类型，all 所有 comment 评论 operate 操作记录|
|keyword|query|string| 否 ||搜索关键词|
|sort_by|query|string| 否 ||排序字段，created_on 创建时间 updated_on 更新时间|
|sort_direction|query|string| 否 ||排序类型，asc 正序 desc 倒序|
|page|query|integer| 否 ||none|
|limit|query|integer| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "total_journals_count": 42,
  "total_operate_journals_count": 38,
  "total_comment_journals_count": 4,
  "total_count": 42,
  "journals": [
    {
      "id": 13,
      "is_journal_detail": false,
      "created_at": "2023-02-15 09:53",
      "updated_at": "2023-02-15 09:53",
      "user": {
        "id": 110,
        "type": "User",
        "name": "咸蛋黄土豆丝",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "notes": null,
      "comments_count": 0,
      "children_journals": [],
      "attachments": []
    },
    {
      "id": 17,
      "is_journal_detail": true,
      "created_at": "2023-02-16 18:20",
      "updated_at": "2023-02-16 18:20",
      "user": {
        "id": 1,
        "type": "AnonymousUser",
        "name": "游客",
        "login": "",
        "image_url": null
      },
      "operate_category": "subject",
      "operate_content": "修改了<b>标题</b>"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||分页总数|
|» total_journals_count|integer|true|none||所有评论+操作记录数|
|» total_comment_journals_count|integer|true|none||所有评论数|
|» total_operate_journals_count|integer|true|none||所有操作记录数|
|» journals|[object]|true|none||none|
|»» id|integer|true|none||评论id|
|»» is_journal_detail|boolean|true|none||是否为操作记录|
|»» created_at|string|true|none||创建时间|
|»» updated_at|string|true|none||更新时间|
|»» user|object|true|none||评论用户|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string¦null|true|none||none|
|»» notes|null|false|none||评论内容|
|»» comments_count|integer|false|none||子评论数量|
|»» children_journals|[string]|false|none||子评论，默认只显示10条|
|»» operate_content|string|false|none||操作记录内容|
|»» operate_category|string|true|none||操作记录类型  issue 创建疑修；attachment 附件；issue_tag 标记；assigner 负责人； subject 标题；description 描述； status_id 状态；priority_id 优先级； fixed_version_id 里程碑； branch_name 关联分支；start_date 开始日期；due_date 结束日期|

## GET 获取合并请求列表

GET /api/v1/{owner}/{repo}/pulls.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|keyword|query|string| 否 ||搜索关键词|
|status|query|string| 否 ||合并请求类型，0 开启的 1 合并的 2 关闭，不传为全部|
|priority_id|query|string| 否 ||优先级ID|
|issue_tag_id|query|string| 否 ||标记ID|
|version_id|query|string| 否 ||里程碑ID|
|reviewer_id|query|string| 否 ||审查人员ID|
|assign_user_id|query|string| 否 ||指派人员ID|
|sort_by|query|string| 否 ||排序字段，updated_at 更新时间 created_at 创建时间|
|sort_direction|query|string| 否 ||排序类型。desc 倒序 asc 正序|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "pulls": [
    {
      "id": 11,
      "title": "ceshi",
      "body": null,
      "head": "master_new",
      "base": "master",
      "is_original": false,
      "index": 1,
      "status": "open",
      "issue": {
        "id": 105,
        "author": {
          "id": 110,
          "type": "User",
          "name": "咸蛋黄土豆丝xxx",
          "login": "yystopf",
          "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
        },
        "priority": null,
        "version": null,
        "journals_count": 0,
        "issue_tags": null
      },
      "reviewers": [],
      "journals_count": 0
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» pulls|[object]|true|none||none|
|»» id|integer|false|none|合并请求ID|none|
|»» title|string|false|none|合并请求标题|none|
|»» body|null|false|none|合并请求内容|none|
|»» head|string|false|none|合并请求源分支|none|
|»» base|string|false|none|合并请求目标分支|none|
|»» is_original|boolean|false|none|是否为fork仓库发来的合并请求|none|
|»» index|integer|false|none|合并请求序号|none|
|»» status|string|false|none|合并请求状态|open: 开启的, merged: 合并的, closed: 关闭的|
|»» fork_project|object|false|none||none|
|»»» id|integer|false|none|fork仓库的id|none|
|»»» identifier|string|false|none|fork仓库的标识|none|
|»»» login|string|true|none|fork仓库拥有者的标识|none|
|»» issue|object|false|none||none|
|»»» id|integer|true|none|疑修ID|none|
|»»» author|object|true|none|疑修创建者|none|
|»»»» id|integer|true|none||none|
|»»»» type|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» priority|null|true|none|疑修优先级|none|
|»»» version|null|true|none|疑修里程碑|none|
|»»» journals_count|integer|true|none|普通评论数量|none|
|»»» issue_tags|null|true|none|普通评论数量|none|
|»» reviewers|[string]|false|none|代码审查者标识数组|none|
|»» journals_count|integer|false|none|审查评论数量|none|

## GET 获取一个合并请求

GET /api/v1/{owner}/{repo}/pulls/{index}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "id": 11,
  "title": "ceshi",
  "body": null,
  "head": "master_new",
  "base": "master",
  "is_original": false,
  "index": 1,
  "status": "open",
  "issue": {
    "id": 105,
    "author": {
      "id": 110,
      "type": "User",
      "name": "咸蛋黄土豆丝xxx",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
    },
    "priority": null,
    "version": null,
    "journals_count": 0,
    "issue_tags": null
  },
  "reviewers": [],
  "journals_count": 0,
  "merge_base": "96dc82d07e05327fc908aaaa127ba45f02091d85",
  "base_commit_sha": "96dc82d07e05327fc908aaaa127ba45f02091d85",
  "head_commit_sha": "82861402ada099d3e288fc41680596dde297d022",
  "commit_num": 2,
  "changed_files": 2,
  "is_locked": false,
  "mergeable": true,
  "merged": false,
  "merged_at": "",
  "merge_commit_sha": null,
  "merge_by": null,
  "last_review": null,
  "conflict_files": null
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|合并请求ID|none|
|» title|string|true|none|合并请求标题|none|
|» body|null|true|none|合并请求描述|none|
|» head|string|true|none|合并请求源分支|none|
|» base|string|true|none|合并请求目标分支|none|
|» is_original|boolean|true|none|是否为fork仓库发来的合并请求|none|
|» index|integer|true|none|合并请求序号|none|
|» status|string|true|none|合并请求状态|open: 开启的, merged: 合并的, closed: 关闭的|
|» issue|object|true|none||none|
|»» id|integer|true|none|疑修ID|none|
|»» author|object|true|none|疑修作者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» priority|null|true|none|疑修优先级|none|
|»» version|null|true|none|疑修里程碑|none|
|»» journals_count|integer|true|none|普通评论数量|none|
|»» issue_tags|null|true|none|标记|none|
|» reviewers|[string]|true|none|审查者标识数组|none|
|» journals_count|integer|true|none|审查评论数量|none|
|» merge_base|string|true|none|目标的commit ID|none|
|» base_commit_sha|string|true|none|合并之后的第一个commit ID|none|
|» head_commit_sha|string|true|none|源commit ID|none|
|» commit_num|integer|true|none|commit数量|none|
|» changed_files|integer|true|none|更改文件数量|none|
|» is_locked|boolean|true|none||none|
|» mergeable|boolean|true|none|是否能合并|none|
|» merged|boolean|true|none|是否合并|none|
|» merged_at|string|true|none|合并时间|none|
|» merge_commit_sha|null|true|none|合并之后的第一个commit ID|none|
|» merge_by|null|true|none|被谁合并了|none|
|» last_review|object|false|none||none|
|»» id|string|false|none|最后一个审查的id|none|
|»» commit_id|string|false|none|最后一个审查对应的commit ID|none|
|»» content|string|false|none|最后一个审查的内容|none|
|»» status|string|false|none|最后一个审查的状态|common: 一般审查, approved: 通过, rejected: 拒绝通过|
|»» created_at|string|false|none|审查创建的时间|none|
|»» reviewer|object|false|none|审查创建者|none|
|»»» id|string|false|none||none|
|»»» login|string|false|none||none|
|»»» name|string|false|none||none|
|»»» image_url|string|false|none||none|
|» conflict_files|null|true|none|有冲突的文件|none|

## POST 重新打开一个合并请求

POST /api/v1/{owner}/{repo}/pulls/{index}/reopen.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 创建一个合并请求

POST /api/{owner}/{repo}/pulls.json

> Body 请求参数

```json
{
  "title": "324",
  "assigned_to_id": "2",
  "fixed_version_id": "",
  "issue_tag_ids": [],
  "priority_id": "2",
  "body": "312",
  "head": "new_branch_1",
  "base": "master",
  "is_original": false,
  "fork_project_id": "",
  "files_count": 1,
  "commits_count": 1,
  "reviewer_ids": [],
  "receivers_login": []
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» title|body|string| 是 | 合并请求标题|none|
|» assigned_to_id|body|integer| 否 | 指派人员ID|none|
|» fixed_version_id|body|integer| 否 | 里程碑ID|none|
|» issue_tag_ids|body|[string]| 否 | 标记ID数组|none|
|» priority_id|body|string| 是 | 优先级ID|none|
|» body|body|string| 是 | 合并请求内容|none|
|» head|body|string| 是 | 源分支|none|
|» base|body|string| 是 | 目标分支|none|
|» is_original|body|boolean| 是 | 是否为fork仓库发来的合并请求|none|
|» merge_project_identifier|body|string| 是 | fork仓库标识|none|
|» fork_project_id|body|integer| 是 | fork仓库ID|none|
|» receivers_login|body|[string]| 是 | @人员的login|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "响应成功",
  "pull_request_id": 12,
  "pull_request_number": 2,
  "pull_request_status": 0,
  "pull_request_head": "master_new",
  "pull_request_base": "master",
  "pull_request_staus": "open",
  "is_original": false,
  "fork_project_id": null,
  "fork_project_identifier": null,
  "fork_project_user": null,
  "reviewers": [],
  "id": 110,
  "name": "或交委参她",
  "pr_time": "1秒前",
  "assign_user_name": null,
  "assign_user_login": null,
  "author_name": "咸蛋黄土豆丝xxx",
  "author_login": "yystopf",
  "avatar_url": "system/lets/letter_avatars/2/X/230_139_26/120.png",
  "priority": "低",
  "version": null,
  "journals_count": 0,
  "issue_tags": null
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» pull_request_id|integer|true|none|合并请求ID|none|
|» pull_request_number|integer|true|none|合并请求序号|none|
|» pull_request_status|integer|true|none|合并请求状态|0 开启的 1 合并的 2 关闭的|
|» pull_request_head|string|true|none|源分支|none|
|» pull_request_base|string|true|none|目标分支|none|
|» pull_request_staus|string|true|none|合并请求状态|open 开启的  merged 合并的 closed 关闭的|
|» is_original|boolean|true|none|是否为fork仓库发来的合并请求|none|
|» fork_project_id|null|true|none|fork仓库ID|none|
|» fork_project_identifier|null|true|none|fork仓库标识|none|
|» fork_project_user|null|true|none|fork仓库拥有者标识|none|
|» reviewers|[string]|true|none|审查者标识数组|none|
|» id|integer|true|none|疑修|none|
|» name|string|true|none|疑修标题|none|
|» pr_time|string|true|none|更新时间|none|
|» assign_user_name|null|true|none|指派者昵称|none|
|» assign_user_login|null|true|none|指派者用户标识|none|
|» author_name|string|true|none|创建者昵称|none|
|» author_login|string|true|none|创建者用户标识|none|
|» avatar_url|string|true|none|创建者用户头像|none|
|» priority|string|true|none|优先级|none|
|» version|null|true|none|里程碑|none|
|» journals_count|integer|true|none|普通评论数量|none|
|» issue_tags|null|true|none|标记数组|none|

## PUT 更新一个合并请求

PUT /api/{owner}/{repo}/pulls/{index}.json

> Body 请求参数

```json
{
  "title": "xxxxxx",
  "issue_tag_ids": [],
  "body": "xxxx",
  "head": "master_new",
  "base": "master",
  "receivers_login": []
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» title|body|string| 是 | 合并请求标题|none|
|» issue_tag_ids|body|[string]| 是 | 标记ID数组|none|
|» body|body|string| 是 | 合并请求内容|none|
|» head|body|string| 是 | 源分支|none|
|» base|body|string| 是 | 目标分支|none|
|» receivers_login|body|[string]| 是 | @的用户标识数组|none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## POST 拒绝一个合并请求

POST /api/{owner}/{repo}/pulls/{index}/refuse_merge.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|index|path|string| 是 ||合并请求序号|

> 返回示例

> 200 Response

```json
{
  "status": 1,
  "message": "已拒绝"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 通过一个合并请求

POST /api/{owner}/{repo}/pulls/{index}/pr_merge.json

> Body 请求参数

```json
{
  "project_id": "ceshi_doc",
  "id": 15,
  "do": "merge",
  "body": "1",
  "title": "1"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|index|path|string| 是 ||合并请求序号|
|body|body|object| 否 ||none|
|» project_id|body|string| 是 | 项目ID|none|
|» id|body|integer| 是 | 合并请求ID|none|
|» do|body|string| 是 | 合并方式|none|
|» body|body|string| 是 | 合并内容|none|
|» title|body|string| 是 | 合并标题|none|

#### 枚举值

|属性|值|
|---|---|
|» do|merge|
|» do|rebase|
|» do|rebase-merge|
|» do|squash|
|» do|manually-merged|

> 返回示例

> 200 Response

```json
{
  "status": 1,
  "message": "合并成功"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 获取一个合并请求变更文件列表

GET /api/{owner}/{repo}/pulls/{id}/files.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "files_count": 2,
  "total_addition": 1,
  "total_deletion": 0,
  "files": [
    {
      "sha": "82861402ada099d3e288fc41680596dde297d022",
      "name": "cxxc",
      "old_name": "cxxc",
      "index": 1,
      "addition": 0,
      "deletion": 0,
      "type": 1,
      "isCreated": true,
      "isDeleted": false,
      "isBin": false,
      "isLFSFile": false,
      "isRenamed": false,
      "isSubmodule": false,
      "sections": []
    },
    {
      "sha": "82861402ada099d3e288fc41680596dde297d022",
      "name": "测试",
      "old_name": "测试",
      "index": 2,
      "addition": 1,
      "deletion": 0,
      "type": 1,
      "isCreated": true,
      "isDeleted": false,
      "isBin": false,
      "isLFSFile": false,
      "isRenamed": false,
      "isSubmodule": false,
      "sections": [
        {
          "fileName": "测试",
          "name": "",
          "lines": [
            {
              "leftIdx": 0,
              "rightIdx": 0,
              "type": 4,
              "content": "@@ -0,0 +1 @@",
              "sectionInfo": {
                "path": "测试",
                "lastLeftIdx": 0,
                "lastRightIdx": 0,
                "leftIdx": 0,
                "rightIdx": 1,
                "leftHunkSize": 0,
                "rightHunkSize": 0
              }
            },
            {
              "leftIdx": 0,
              "rightIdx": 1,
              "type": 2,
              "content": "+是多福多寿",
              "sectionInfo": null
            }
          ]
        }
      ]
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» files_count|integer|true|none|文件更改的总数量|none|
|» total_addition|integer|true|none|添加代码总行数|none|
|» total_deletion|integer|true|none|删除代码总行数|none|
|» files|[object]|true|none||none|
|»» sha|string|true|none|commit标识|none|
|»» name|string|true|none|当前文件名|none|
|»» old_name|string|true|none|修改之前的文件名称,与name相同的话，说明文件名未更改|none|
|»» index|integer|true|none||none|
|»» addition|integer|true|none|文件添加的行数|none|
|»» deletion|integer|true|none|文件删除的行数|none|
|»» type|integer|true|none|文件类型|， 1: 表示该文件只添加了内容，2: 表示该文件内容有修改， 3: 表示文件被删除或者改文件只删除了内容|
|»» isCreated|boolean|true|none|当前文件是否为新增文件|none|
|»» isDeleted|boolean|true|none|当前文件是否被删除|none|
|»» isBin|boolean|true|none|当前文件是否为二进制文件|none|
|»» isLFSFile|boolean|true|none|当前文件是否为LFS文件|none|
|»» isRenamed|boolean|true|none|当前文件是否被重命名|none|
|»» isSubmodule|boolean|true|none|当前文件是否为子模块|none|
|»» sections|[object]|true|none||none|
|»»» fileName|string|false|none|文件名称|none|
|»»» name|string|false|none||none|
|»»» lines|[object]|false|none||none|
|»»»» leftIdx|integer|true|none|文件变动之前所在行数|none|
|»»»» rightIdx|integer|true|none|文件更改后所在行数|none|
|»»»» type|integer|true|none|文件变更类型|1: 新增，2: 修改， 3: 删除， 4: diff统计信息|
|»»»» content|string|true|none|文件变更的内容|none|
|»»»» sectionInfo|object¦null|true|none||none|
|»»»»» path|string|true|none|文件相对仓库的路径|none|
|»»»»» lastLeftIdx|integer|true|none||none|
|»»»»» lastRightIdx|integer|true|none||none|
|»»»»» leftIdx|integer|true|none|文件变更之前所在行数|none|
|»»»»» rightIdx|integer|true|none|文件变更之后所在行数(即：页面编辑器开始显示的行数)|none|
|»»»»» leftHunkSize|integer|true|none|文件变更之前的行数|none|
|»»»»» rightHunkSize|integer|true|none|文件变更之后的行数(及当前页面编辑器显示的总行数)|none|

## GET 获取一个合并请求变更文件列表（简版）

GET /api/v1/{owner}/{repo}/pulls/{index}/files.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|
|page|query|string| 否 ||分页页码，当filepath存在时无效|
|limit|query|string| 否 ||分页个数，当filepath存在时无效|
|filepath|query|string| 否 ||文件路径|

> 返回示例

> 200 Response

```json
{
  "file_nums": 224,
  "total_addition": 24948,
  "total_deletion": 59,
  "files": [
    {
      "filename": ".changeset/README.md",
      "old_name": ".changeset/README.md",
      "index": 1,
      "type": 1,
      "is_bin": false,
      "is_created": true,
      "is_deleted": false,
      "is_lfs_file": false,
      "is_renamed": false,
      "is_submodule": false,
      "additions": 8,
      "deletions": 0,
      "changes": 8,
      "sha": "cd9bddbe10a006632e53bfb485cdfc1d220eef4e"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» file_nums|integer|true|none||none|
|» total_addition|integer|true|none||none|
|» total_deletion|integer|true|none||none|
|» files|[object]|true|none||none|
|»» filename|string|false|none||none|
|»» old_name|string|false|none||none|
|»» index|integer|false|none||none|
|»» type|integer|false|none||none|
|»» is_bin|boolean|false|none||none|
|»» is_created|boolean|false|none||none|
|»» is_deleted|boolean|false|none||none|
|»» is_lfs_file|boolean|false|none||none|
|»» is_renamed|boolean|false|none||none|
|»» is_submodule|boolean|false|none||none|
|»» additions|integer|false|none||none|
|»» deletions|integer|false|none||none|
|»» changes|integer|false|none||none|
|»» sha|string|false|none||none|

## GET 获取一个合并请求提交列表

GET /api/{owner}/{repo}/pulls/{id}/commits.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "commits_count": 2,
  "commits": [
    {
      "author": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "committer": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "timestamp": 1700643425,
      "time_from_now": "8天前",
      "created_at": "2023-11-22 16:57",
      "message": "Add cxxc\n",
      "sha": "82861402ada099d3e288fc41680596dde297d022"
    },
    {
      "author": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "committer": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "timestamp": 1700621060,
      "time_from_now": "8天前",
      "created_at": "2023-11-22 10:44",
      "message": "Add 测试\n",
      "sha": "37d52b40456755c364a0dea77b702381606edefb"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» commits_count|integer|true|none|提交总数|none|
|» commits|[object]|true|none||none|
|»» author|object|true|none|作者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» committer|object|true|none|提交者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» timestamp|integer|true|none|提交时间戳|none|
|»» time_from_now|string|true|none|提交时间（距离现在）|none|
|»» created_at|string|true|none|创建时间|none|
|»» message|string|true|none|提交信息|none|
|»» sha|string|true|none|提交标识|none|

## GET 获取两个分支、标签、提交标识之间的比较内容

GET /api/{owner}/{repo}/compare/{head}...{base}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|head|path|string| 是 ||源分支、标签或提交标识（base64加密后）|
|base|path|string| 是 ||目标分支、标签或提交标识（base64加密后）|

> 返回示例

> 200 Response

```json
{
  "commits_count": 2,
  "commits": [
    {
      "author": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "committer": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "timestamp": 1700643425,
      "time_from_now": "8天前",
      "created_at": "2023-11-22 16:57",
      "message": "Add cxxc\n",
      "sha": "82861402ada099d3e288fc41680596dde297d022"
    },
    {
      "author": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "committer": {
        "id": "110",
        "login": "yystopf",
        "name": "咸蛋黄土豆丝xxx",
        "type": "User",
        "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png"
      },
      "timestamp": 1700621060,
      "time_from_now": "8天前",
      "created_at": "2023-11-22 10:44",
      "message": "Add 测试\n",
      "sha": "37d52b40456755c364a0dea77b702381606edefb"
    }
  ],
  "diff": {
    "files_count": 2,
    "total_addition": 1,
    "total_deletion": 0,
    "files": [
      {
        "sha": null,
        "name": "cxxc",
        "old_name": "cxxc",
        "index": 1,
        "addition": 0,
        "deletion": 0,
        "type": 1,
        "isCreated": true,
        "isDeleted": false,
        "isBin": false,
        "isLFSFile": false,
        "isRenamed": false,
        "isSubmodule": false,
        "sections": []
      },
      {
        "sha": null,
        "name": "测试",
        "old_name": "测试",
        "index": 2,
        "addition": 1,
        "deletion": 0,
        "type": 1,
        "isCreated": true,
        "isDeleted": false,
        "isBin": false,
        "isLFSFile": false,
        "isRenamed": false,
        "isSubmodule": false,
        "sections": [
          {
            "fileName": "测试",
            "name": "",
            "lines": [
              {
                "leftIdx": 0,
                "rightIdx": 0,
                "type": 4,
                "content": "@@ -0,0 +1 @@",
                "sectionInfo": {
                  "path": "测试",
                  "lastLeftIdx": 0,
                  "lastRightIdx": 0,
                  "leftIdx": 0,
                  "rightIdx": 1,
                  "leftHunkSize": 0,
                  "rightHunkSize": 0
                }
              },
              {
                "leftIdx": 0,
                "rightIdx": 1,
                "type": 2,
                "content": "+是多福多寿",
                "sectionInfo": null
              }
            ]
          }
        ]
      }
    ]
  },
  "status": -2,
  "message": "在这些分支之间的合并请求已存在：<a href='/yystopfceshi/testdevops/pulls/12'>或交委参她</a>"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» commits_count|integer|true|none|提交总数|none|
|» commits|[object]|true|none||none|
|»» author|object|true|none|作者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» committer|object|true|none|提交者|none|
|»»» id|string|true|none||none|
|»»» login|string|true|none||none|
|»»» name|string|true|none||none|
|»»» type|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» timestamp|integer|true|none|提交时间|none|
|»» time_from_now|string|true|none|提交时间（距离现在）|none|
|»» created_at|string|true|none|创建时间|none|
|»» message|string|true|none|提交信息|none|
|»» sha|string|true|none|提交标识|none|
|» diff|object|true|none||none|
|»» files_count|integer|true|none|变更文件数量|none|
|»» total_addition|integer|true|none|添加代码总行数|none|
|»» total_deletion|integer|true|none|删除代码总行数|none|
|»» files|[object]|true|none||none|
|»»» sha|null|true|none|提交标识|none|
|»»» name|string|true|none|当前文件名|none|
|»»» old_name|string|true|none|修改之前的文件名称,与name相同的话，说明文件名未更改|none|
|»»» index|integer|true|none||none|
|»»» addition|integer|true|none|文件添加的行数|none|
|»»» deletion|integer|true|none|文件删除的行数|none|
|»»» type|integer|true|none|文件类型|1: 表示该文件只添加了内容，2: 表示该文件内容有修改， 3: 表示文件被删除或者改文件只删除了内容|
|»»» isCreated|boolean|true|none|当前文件是否为新增文件|none|
|»»» isDeleted|boolean|true|none|当前文件是否被删除|none|
|»»» isBin|boolean|true|none|当前文件是否为二进制文件|none|
|»»» isLFSFile|boolean|true|none|当前文件是否为LFS文件|none|
|»»» isRenamed|boolean|true|none|当前文件是否被重命名|none|
|»»» isSubmodule|boolean|true|none|当前文件是否为子模块|none|
|»»» sections|[object]|true|none||none|
|»»»» fileName|string|false|none|文件名称|none|
|»»»» name|string|false|none||none|
|»»»» lines|[object]|false|none||none|
|»»»»» leftIdx|integer|true|none|文件变动之前所在行数|none|
|»»»»» rightIdx|integer|true|none|文件更改后所在行数|none|
|»»»»» type|integer|true|none|文件变更类型|1: 内容未改动，2: 添加， 3: 删除， 4: diff统计信息|
|»»»»» content|string|true|none|文件变更的内容|none|
|»»»»» sectionInfo|object¦null|true|none||none|
|»»»»»» path|string|true|none|文件相对仓库的路径|none|
|»»»»»» lastLeftIdx|integer|true|none||none|
|»»»»»» lastRightIdx|integer|true|none||none|
|»»»»»» leftIdx|integer|true|none|文件变更之前所在行数|none|
|»»»»»» rightIdx|integer|true|none|文件变更之后所在行数|none|
|»»»»»» leftHunkSize|integer|true|none|文件变更之前的行数|none|
|»»»»»» rightHunkSize|integer|true|none|文件变更之后的行数(及当前页面编辑器显示的总行数)|none|
|» status|integer|true|none|状态|none|
|» message|string|true|none|提示信息|none|

## GET 获取两个分支、标签、提交标识之间的变更文件列表

GET /api/v1/{owner}/{repo}/compare/{head}...{base}/files.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|head|path|string| 是 ||源分支、标签或提交标识（base64加密后）|
|base|path|string| 是 ||目标分支、标签或提交标识（base64加密后）|
|page|query|string| 否 ||分页页码，当filepath存在时无效|
|limit|query|string| 否 ||分页个数，当filepath存在时无效|
|filepath|query|string| 否 ||文件路径|

> 返回示例

> 200 Response

```json
{
  "file_nums": 372,
  "total_addition": 25653,
  "total_deletion": 13130,
  "files": [
    {
      "filename": "packages/inula-cli/externals.d.ts",
      "old_name": "packages/inula-cli/externals.d.ts",
      "index": 5,
      "type": 2,
      "is_bin": false,
      "is_created": false,
      "is_deleted": false,
      "is_lfs_file": false,
      "is_renamed": false,
      "is_submodule": false,
      "additions": 0,
      "deletions": 1,
      "changes": 1,
      "sha": "master"
    }
  ],
  "status": 0,
  "message": "可以合并"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» file_nums|integer|true|none||none|
|» total_addition|integer|true|none||none|
|» total_deletion|integer|true|none||none|
|» files|[object]|true|none||none|
|»» filename|string|false|none||none|
|»» old_name|string|false|none||none|
|»» index|integer|false|none||none|
|»» type|integer|false|none||none|
|»» is_bin|boolean|false|none||none|
|»» is_created|boolean|false|none||none|
|»» is_deleted|boolean|false|none||none|
|»» is_lfs_file|boolean|false|none||none|
|»» is_renamed|boolean|false|none||none|
|»» is_submodule|boolean|false|none||none|
|»» additions|integer|false|none||none|
|»» deletions|integer|false|none||none|
|»» changes|integer|false|none||none|
|»» sha|string|false|none||none|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 获取合并请求版本列表

GET /api/v1/{owner}/{repo}/pulls/{index}/versions.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 2,
  "versions": [
    {
      "id": 38,
      "add_line_num": 1,
      "del_line_num": 0,
      "commits_count": 1,
      "files_count": 1,
      "base_commit_sha": "96dc82d07e05327fc908aaaa127ba45f02091d85",
      "head_commit_sha": "37d52b40456755c364a0dea77b702381606edefb",
      "start_commit_sha": "96dc82d07e05327fc908aaaa127ba45f02091d85",
      "created_time": 1700632918,
      "updated_time": 1700632918
    },
    {
      "id": 39,
      "add_line_num": 0,
      "del_line_num": 0,
      "commits_count": 1,
      "files_count": 1,
      "base_commit_sha": "96dc82d07e05327fc908aaaa127ba45f02091d85",
      "head_commit_sha": "82861402ada099d3e288fc41680596dde297d022",
      "start_commit_sha": "37d52b40456755c364a0dea77b702381606edefb",
      "created_time": 1700643432,
      "updated_time": 1700643432
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|合并请求版本总数|none|
|» versions|[object]|true|none||none|
|»» id|integer|true|none|版本ID|none|
|»» add_line_num|integer|true|none|该版本新增行数|none|
|»» del_line_num|integer|true|none|该版本删除行数|none|
|»» commits_count|integer|true|none|该版本提交总数|none|
|»» files_count|integer|true|none|该版本提交文件总数|none|
|»» base_commit_sha|string|true|none|目标commit标识|none|
|»» head_commit_sha|string|true|none|源commit标识|none|
|»» start_commit_sha|string|true|none|该版本起始commit标识|none|
|»» created_time|integer|true|none|版本创建时间|none|
|»» updated_time|integer|true|none|版本更新时间|none|

## GET 获取合并请求版本之间的Diff

GET /api/v1/{owner}/{repo}/pulls/{index}/versions/{version_id}/diff.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|index|path|string| 是 ||合并请求序号|
|version_id|path|string| 是 ||合并请求版本的ID|
|filepath|query|string| 否 ||文件路径|

#### 详细说明

**filepath**: 文件路径

> 返回示例

> 200 Response

```json
{
  "file_nums": 1,
  "total_addition": 1,
  "total_deletion": 0,
  "files": [
    {
      "name": "测试",
      "oldname": "测试",
      "addition": 1,
      "deletion": 0,
      "type": 1,
      "is_created": true,
      "is_deleted": false,
      "is_bin": false,
      "is_lfs_file": false,
      "is_renamed": false,
      "is_ambiguous": false,
      "is_submodule": false,
      "diff": null,
      "sections": [
        {
          "file_name": "测试",
          "name": "",
          "lines": [
            {
              "left_index": 0,
              "right_index": 0,
              "match": 0,
              "type": 4,
              "content": "@@ -0,0 +1 @@",
              "section_path": "测试",
              "section_last_left_index": 0,
              "section_last_right_index": 0,
              "section_left_index": 0,
              "section_right_index": 1,
              "section_left_hunk_size": 0,
              "section_right_hunk_size": 0
            },
            {
              "left_index": 0,
              "right_index": 1,
              "match": -1,
              "type": 2,
              "content": "+是多福多寿"
            }
          ]
        }
      ],
      "is_incomplete": false,
      "is_incomplete_line_too_long": false,
      "is_protected": false
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» file_nums|integer|true|none|文件数量|none|
|» total_addition|integer|true|none|新增行数|none|
|» total_deletion|integer|true|none|删除行数|none|
|» files|[object]|true|none||none|
|»» name|string|false|none|文件名称|none|
|»» oldname|string|false|none|文件修改前名称|none|
|»» addition|integer|false|none|文件新增行数|none|
|»» deletion|integer|false|none|文件删除行数|none|
|»» type|integer|false|none|文件类型 |1: 新增 2: 更改 3: 删除 4: 重命名 5: 复制|
|»» is_created|boolean|false|none|是否为新建文件|none|
|»» is_deleted|boolean|false|none|是否为删除文件|none|
|»» is_bin|boolean|false|none|是否为二进制文件|none|
|»» is_lfs_file|boolean|false|none|是否为LFS文件|none|
|»» is_renamed|boolean|false|none|是否重命名|none|
|»» is_ambiguous|boolean|false|none||none|
|»» is_submodule|boolean|false|none|是否为子模块|none|
|»» diff|null|false|none||none|
|»» sections|[object]|false|none||none|
|»»» file_name|string|false|none|文件名称|none|
|»»» name|string|false|none||none|
|»»» lines|[object]|false|none||none|
|»»»» left_index|integer|true|none|文件变动之前所在行数|none|
|»»»» right_index|integer|true|none|文件变动之后所在行数|none|
|»»»» match|integer|true|none||none|
|»»»» type|integer|true|none|文件变更类型|none|
|»»»» content|string|true|none|文件变更内容|none|
|»»»» section_path|string|false|none|文件路径|none|
|»»»» section_last_left_index|integer|false|none||none|
|»»»» section_last_right_index|integer|false|none||none|
|»»»» section_left_index|integer|false|none|文件变更之前所在行数|none|
|»»»» section_right_index|integer|false|none|文件变更之后所在行数(即：页面编辑器开始显示的行数)|none|
|»»»» section_left_hunk_size|integer|false|none|文件变更之前的行数|none|
|»»»» section_right_hunk_size|integer|false|none|文件变更之后的行数(及当前页面编辑器显示的总行数)|none|
|»» is_incomplete|boolean|false|none|是否不完整|none|
|»» is_incomplete_line_too_long|boolean|false|none|文件是否不完整是因为太长了|none|
|»» is_protected|boolean|false|none|文件是否被保护|none|

## GET 获取合并请求审查列表

GET /api/v1/{owner}/{repo}/pulls/{index}/reviews.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|index|path|string| 是 ||合并请求序号|
|status|query|string| 否 ||审查类型， common: 评论类型, approved: 已通过, rejected: 已拒绝|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "reviews": [
    {
      "reviewer": {
        "id": 2,
        "type": "User",
        "name": "heh",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
      },
      "pull_request": {
        "id": 163,
        "title": "新合并请求1",
        "body": null,
        "head": "master_1",
        "base": "master",
        "is_original": false,
        "index": 1,
        "status": "closed",
        "issue": {
          "id": 260,
          "author": {
            "id": 2,
            "type": "User",
            "name": "heh",
            "login": "yystopf",
            "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
          },
          "priority": null,
          "version": null,
          "journals_count": 0,
          "issue_tags": null
        },
        "reviewers": [],
        "journals_count": 8
      },
      "id": 5,
      "commit_id": null,
      "content": "新建一个审查",
      "status": "common",
      "created_at": "2022-07-25 17:08"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|审查总数|none|
|» reviews|[object]|true|none||none|
|»» reviewer|object|false|none|审查者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» pull_request|object|false|none||none|
|»»» id|integer|true|none|合并请求ID|none|
|»»» title|string|true|none|合并请求标题|none|
|»»» body|null|true|none|合并请求内容|none|
|»»» head|string|true|none|合并请求源分支|none|
|»»» base|string|true|none|合并请求目标分支|none|
|»»» is_original|boolean|true|none|合并请求目标分支|none|
|»»» fork_project|object|false|none||none|
|»»»» id|integer|false|none|fork仓库的id|none|
|»»»» identifier|string|false|none|fork仓库的标识|none|
|»»»» login|string|false|none|fork仓库拥有者的标识|none|
|»»» index|integer|true|none|合并请求的序号|none|
|»»» status|string|true|none|合并请求的状态|open: 打开的, merged: 合并的, closed: 关闭的|
|»»» issue|object|true|none||none|
|»»»» id|integer|true|none|合并请求下疑修的ID|none|
|»»»» author|object|true|none|合并请求以及疑修的创建着|none|
|»»»»» id|integer|true|none||none|
|»»»»» type|string|true|none||none|
|»»»»» name|string|true|none||none|
|»»»»» login|string|true|none||none|
|»»»»» image_url|string|true|none||none|
|»»»» priority|null|true|none|疑修的优先级|none|
|»»»» version|null|true|none|疑修的里程碑|none|
|»»»» journals_count|integer|true|none|普通评论数量|none|
|»»»» issue_tags|null|true|none|所属标记|none|
|»»» reviewers|[string]|true|none|审查者数组|none|
|»»» journals_count|integer|true|none|审查评论数量|none|
|»» id|integer|false|none|审查ID|none|
|»» commit_id|null|false|none|审查的commit标识|none|
|»» content|string|false|none|审查的内容|none|
|»» status|string|false|none|审查类型|common: 普通, approved: 通过，rejected: 拒绝通过|
|»» created_at|string|false|none|审查创建时间|none|

## POST 创建一个合并请求审查

POST /api/v1/{owner}/{repo}/pulls/{index}/reviews.json

> Body 请求参数

```json
{
  "content": "新建一个审查",
  "commit_id": "e506844b2467ce25a35dd46dad8236a1595a02da",
  "status": "common"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|index|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» content|body|string| 否 | 审查内容|none|
|» commit_id|body|string| 否 | 当前合并请求的提交标识|none|
|» status|body|string| 是 | 审查类型|common 普通 approved 通过 rejected 拒绝|

> 返回示例

> 200 Response

```json
{
  "reviewer": {
    "id": 2,
    "type": "User",
    "name": "heh",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
  },
  "pull_request": {
    "id": 163,
    "head": "master_1",
    "base": "master",
    "is_original": false,
    "index": 1,
    "status": "closed",
    "issue": {
      "id": 260,
      "author": {
        "id": 2,
        "type": "User",
        "name": "heh",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
      },
      "priority": null,
      "version": null,
      "journals_count": 0,
      "issue_tags": null
    },
    "journals_count": 6
  },
  "id": 10,
  "commit_id": "e506844b2467ce25a35dd46dad8236a1595a02da",
  "content": "新建一个审查",
  "status": "common",
  "created_at": "2022-07-26 11:45"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» reviewer|object|true|none|审查者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» pull_request|object|true|none||none|
|»» id|integer|true|none|合并请求ID|none|
|»» head|string|true|none|合并请求源分支|none|
|»» base|string|true|none|合并请求目标分支|none|
|»» is_original|boolean|true|none|合并请求是否从fork仓库所来|none|
|»» index|integer|true|none|合并请求的序号|none|
|»» status|string|true|none|合并请求的状态|open: 打开的, merged: 合并的, closed: 关闭的|
|»» issue|object|true|none||none|
|»»» id|integer|true|none|合并请求下疑修的ID|none|
|»»» author|object|true|none|合并请求以及疑修的创建着|none|
|»»»» id|integer|true|none||none|
|»»»» type|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» priority|null|true|none|疑修的优先级|none|
|»»» version|null|true|none|疑修的里程碑|none|
|»»» journals_count|integer|true|none|普通评论数量|none|
|»»» issue_tags|null|true|none|所属标记|none|
|»» journals_count|integer|true|none|审查评论数量|none|
|» id|integer|true|none|审查ID|none|
|» commit_id|string|true|none|审查的提交标识|none|
|» content|string|true|none|审查的内容|none|
|» status|string|true|none|审查类型|common: 普通, approved: 通过，rejected: 拒绝通过|
|» created_at|string|true|none|审查创建时间|none|

## GET 获取合并请求审查评论列表

GET /api/v1/{owner}/{repo}/pulls/{index}/journals.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|index|path|string| 是 ||合并请求序号|
|keyword|query|string| 否 ||搜索关键词|
|review_id|query|string| 否 ||审查ID|
|need_respond|query|string| 否 ||是否需要回应|
|state|query|string| 否 ||状态, opened: 开启的, resolved: 已解决的, disabled: 无效的|
|parent_id|query|integer| 否 ||父评论ID|
|path|query|string| 否 ||评论文件路径|
|is_full|query|string| 否 ||是否展示全部评论（包括回复）|
|sort_by|query|string| 否 ||排序字段 created_on: 创建时间, updated_on: 更新时间|
|sort_direction|query|string| 否 ||排序类型 desc: 倒序, asc: 正序|

#### 详细说明

**review_id**: 审查ID

**parent_id**: 父评论ID

**path**: 评论文件路径

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "journals": [
    {
      "id": 200,
      "note": "测试评论修改",
      "commit_id": null,
      "line_code": "70eede447ccc01c1902260fd377af5d90be28e0d_0_29",
      "path": "Gemfile.lock",
      "diff": {},
      "need_respond": true,
      "state": "resolved",
      "parent_id": "nil",
      "user": {
        "id": 2,
        "type": "User",
        "name": "heh",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
      },
      "review": {
        "reviewer": {
          "id": 2,
          "type": "User",
          "name": "heh",
          "login": "yystopf",
          "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
        },
        "pull_request": {
          "id": 163,
          "title": "新合并请求1",
          "body": null,
          "head": "master_1",
          "base": "master",
          "is_original": false,
          "index": 1,
          "status": "closed",
          "issue": {
            "id": 260,
            "author": {
              "id": 2,
              "type": "User",
              "name": "heh",
              "login": "yystopf",
              "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
            },
            "priority": null,
            "version": null,
            "journals_count": 0,
            "issue_tags": null
          },
          "reviewers": [],
          "journals_count": 9
        },
        "id": 10,
        "commit_id": "1",
        "content": "新建一个审查",
        "status": "common",
        "created_at": "2022-07-26 11:45"
      },
      "resolveer": {
        "id": 2,
        "type": "User",
        "name": "heh",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
      },
      "resolve_at": "2022-07-27 14:50",
      "created_at": "2022-07-27 14:31",
      "updated_at": "2022-07-27 14:50"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|评论总数|none|
|» journals|[object]|true|none||none|
|»» id|integer|false|none|评论ID|none|
|»» note|string|false|none|评论内容|none|
|»» commit_id|null|false|none|提交标识|none|
|»» line_code|string|false|none|评论行数|none|
|»» path|string|false|none|评论文件路径|none|
|»» diff|object|false|none|评论文件diff内容|none|
|»» need_respond|boolean|false|none|评论是否要回应|none|
|»» state|string|false|none|评论状态|opened: 开启的, resolved: 已解决的, disabled: 无效的|
|»» parent_id|integer|false|none|父评论ID|none|
|»» user|object|false|none|评论创建者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» review|object|false|none|评论所属评审|none|
|»»» reviewer|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» type|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» login|string|true|none||none|
|»»»» image_url|string|true|none||none|
|»»» pull_request|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» title|string|true|none||none|
|»»»» body|null|true|none||none|
|»»»» head|string|true|none||none|
|»»»» base|string|true|none||none|
|»»»» is_original|boolean|true|none||none|
|»»»» index|integer|true|none||none|
|»»»» status|string|true|none||none|
|»»»» issue|object|true|none||none|
|»»»»» id|integer|true|none||none|
|»»»»» author|object|true|none||none|
|»»»»»» id|integer|true|none||none|
|»»»»»» type|string|true|none||none|
|»»»»»» name|string|true|none||none|
|»»»»»» login|string|true|none||none|
|»»»»»» image_url|string|true|none||none|
|»»»»» priority|null|true|none||none|
|»»»»» version|null|true|none||none|
|»»»»» journals_count|integer|true|none||none|
|»»»»» issue_tags|null|true|none||none|
|»»»» reviewers|[string]|true|none||none|
|»»»» journals_count|integer|true|none||none|
|»»» id|integer|true|none||none|
|»»» commit_id|string|true|none||none|
|»»» content|string|true|none||none|
|»»» status|string|true|none||none|
|»»» created_at|string|true|none||none|
|»» resolveer|object|false|none|评论解决者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» resolve_at|string|false|none|评论解决时间|none|
|»» created_at|string|false|none|评论创建时间|none|
|»» updated_at|string|false|none|评论更新时间|none|

## POST 创建一个合并请求审查评论

POST /api/v1/{owner}/{repo}/pulls/{index}/journals.json

> Body 请求参数

```json
{
  "type": "problem",
  "note": "测试评论",
  "review_id": "10",
  "line_code": "70eede447ccc01c1902260fd377af5d90be28e0d_0_29",
  "commit_id": "70eede447ccc01c1902260fd377af5d90be28e0d",
  "path": "Gemfile.lock",
  "diff": {
    "name": "README.md",
    "oldname": "README.md",
    "addition": 1,
    "deletion": 2,
    "type": 2,
    "is_created": false,
    "is_deleted": false,
    "is_bin": false,
    "is_lfs_file": false,
    "is_renamed": false,
    "is_ambiguous": false,
    "is_submodule": false,
    "sections": [
      {
        "file_name": "README.md",
        "name": "",
        "lines": [
          {
            "left_index": 0,
            "right_index": 0,
            "match": 0,
            "type": 4,
            "content": "@@ -1,2 +1 @@",
            "section_path": "README.md",
            "section_last_left_index": 0,
            "section_last_right_index": 0,
            "section_left_index": 1,
            "section_right_index": 1,
            "section_left_hunk_size": 2,
            "section_right_hunk_size": 0
          },
          {
            "left_index": 1,
            "right_index": 0,
            "match": 3,
            "type": 3,
            "content": "-# ceshi_commit"
          },
          {
            "left_index": 2,
            "right_index": 0,
            "match": -1,
            "type": 3,
            "content": "-"
          },
          {
            "left_index": 0,
            "right_index": 1,
            "match": 1,
            "type": 2,
            "content": "+adsa"
          }
        ]
      },
      {
        "file_name": "README.md",
        "name": "",
        "lines": [
          {
            "left_index": 0,
            "right_index": 0,
            "match": 0,
            "type": 4,
            "content": " ",
            "section_path": "README.md",
            "section_last_left_index": 0,
            "section_last_right_index": 1,
            "section_left_index": 3,
            "section_right_index": 2,
            "section_left_hunk_size": 0,
            "section_right_hunk_size": 0
          }
        ]
      }
    ],
    "is_incomplete": false,
    "is_incomplete_line_too_long": false,
    "is_protected": false
  }
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|index|path|string| 是 ||合并请求序号|
|body|body|object| 否 ||none|
|» type|body|string| 是 | 评论类型|comment: 普通, problem: 需要回应的评论|
|» note|body|string| 是 | 评论内容|none|
|» review_id|body|string| 是 | 审查ID|none|
|» line_code|body|string| 是 | 行号|none|
|» commit_id|body|string| 是 | 提交标识|none|
|» path|body|string| 是 | 文件路径|none|
|» parent_id|body|integer| 是 | 父评论ID|none|
|» diff|body|object| 是 | 文件diff内容|none|
|»» name|body|string| 是 ||none|
|»» oldname|body|string| 是 ||none|
|»» addition|body|integer| 是 ||none|
|»» deletion|body|integer| 是 ||none|
|»» type|body|integer| 是 ||none|
|»» is_created|body|boolean| 是 ||none|
|»» is_deleted|body|boolean| 是 ||none|
|»» is_bin|body|boolean| 是 ||none|
|»» is_lfs_file|body|boolean| 是 ||none|
|»» is_renamed|body|boolean| 是 ||none|
|»» is_ambiguous|body|boolean| 是 ||none|
|»» is_submodule|body|boolean| 是 ||none|
|»» sections|body|[object]| 是 ||none|
|»»» file_name|body|string| 是 ||none|
|»»» name|body|string| 是 ||none|
|»»» lines|body|[object]| 是 ||none|
|»»»» left_index|body|integer| 是 ||none|
|»»»» right_index|body|integer| 是 ||none|
|»»»» match|body|integer| 是 ||none|
|»»»» type|body|integer| 是 ||none|
|»»»» content|body|string| 是 ||none|
|»»»» section_path|body|string| 是 ||none|
|»»»» section_last_left_index|body|integer| 是 ||none|
|»»»» section_last_right_index|body|integer| 是 ||none|
|»»»» section_left_index|body|integer| 是 ||none|
|»»»» section_right_index|body|integer| 是 ||none|
|»»»» section_left_hunk_size|body|integer| 是 ||none|
|»»»» section_right_hunk_size|body|integer| 是 ||none|
|»» is_incomplete|body|boolean| 是 ||none|
|»» is_incomplete_line_too_long|body|boolean| 是 ||none|
|»» is_protected|body|boolean| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "id": 200,
  "note": "测试评论修改",
  "commit_id": null,
  "line_code": "70eede447ccc01c1902260fd377af5d90be28e0d_0_29",
  "path": "Gemfile.lock",
  "diff": {},
  "need_respond": true,
  "state": "resolved",
  "user": {
    "id": 2,
    "type": "User",
    "name": "heh",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
  },
  "review": {
    "reviewer": {
      "id": 2,
      "type": "User",
      "name": "heh",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
    },
    "pull_request": {
      "id": 163,
      "title": "新合并请求1",
      "body": null,
      "head": "master_1",
      "base": "master",
      "is_original": false,
      "index": 1,
      "status": "closed",
      "issue": {
        "id": 260,
        "author": {
          "id": 2,
          "type": "User",
          "name": "heh",
          "login": "yystopf",
          "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
        },
        "priority": null,
        "version": null,
        "journals_count": 0,
        "issue_tags": null
      },
      "reviewers": [],
      "journals_count": 9
    },
    "id": 10,
    "commit_id": "1",
    "content": "新建一个审查",
    "status": "common",
    "created_at": "2022-07-26 11:45"
  },
  "resolveer": {
    "id": 2,
    "type": "User",
    "name": "heh",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
  },
  "resolve_at": "2022-07-27 14:50",
  "created_at": "2022-07-27 14:31",
  "updated_at": "2022-07-27 14:50"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|评论ID|none|
|» note|string|true|none|评论内容|none|
|» commit_id|null|true|none|提交标识|none|
|» line_code|string|true|none|评论行数|none|
|» path|string|true|none|评论文件路径|none|
|» diff|object|true|none|评论文件diff内容|none|
|» need_respond|boolean|true|none|评论是否要回应|none|
|» state|string|true|none|评论状态|opened: 开启的, resolved: 已解决的, disabled: 无效的|
|» parent_id|integer|true|none|父评论ID|none|
|» user|object|true|none|评论创建者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» review|object|true|none|评论所属评审|none|
|»» reviewer|object|true|none||none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» pull_request|object|true|none||none|
|»»» id|integer|true|none||none|
|»»» title|string|true|none||none|
|»»» body|null|true|none||none|
|»»» head|string|true|none||none|
|»»» base|string|true|none||none|
|»»» is_original|boolean|true|none||none|
|»»» index|integer|true|none||none|
|»»» status|string|true|none||none|
|»»» issue|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» author|object|true|none||none|
|»»»»» id|integer|true|none||none|
|»»»»» type|string|true|none||none|
|»»»»» name|string|true|none||none|
|»»»»» login|string|true|none||none|
|»»»»» image_url|string|true|none||none|
|»»»» priority|null|true|none||none|
|»»»» version|null|true|none||none|
|»»»» journals_count|integer|true|none||none|
|»»»» issue_tags|null|true|none||none|
|»»» reviewers|[string]|true|none||none|
|»»» journals_count|integer|true|none||none|
|»» id|integer|true|none||none|
|»» commit_id|string|true|none||none|
|»» content|string|true|none||none|
|»» status|string|true|none||none|
|»» created_at|string|true|none||none|
|» resolveer|object|true|none|评论解决者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» resolve_at|string|true|none|评论解决时间|none|
|» created_at|string|true|none|评论创建时间|none|
|» updated_at|string|true|none|评论更新时间|none|

## PUT 修改一个合并请求审查评论

PUT /api/v1/{owner}/{repo}/pulls/{index}/journals/{id}.json

> Body 请求参数

```json
{
  "note": "测试评论",
  "commit_id": "70eede447ccc01c1902260fd377af5d90be28e0d",
  "state": "resolved"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|index|path|string| 是 ||合并请求序号|
|id|path|string| 是 ||评论ID|
|body|body|object| 否 ||none|
|» note|body|string| 是 | 评论内容|none|
|» commit_id|body|string| 是 | 提交标识|none|
|» state|body|string| 是 | 评论状态|opened: 开启的, resolved: 已解决的, disabled: 无效的|

#### 详细说明

**index**: 合并请求序号

**id**: 评论ID

> 返回示例

> 200 Response

```json
{
  "id": 200,
  "note": "测试评论修改",
  "commit_id": null,
  "line_code": "70eede447ccc01c1902260fd377af5d90be28e0d_0_29",
  "path": "Gemfile.lock",
  "diff": {},
  "need_respond": true,
  "state": "resolved",
  "user": {
    "id": 2,
    "type": "User",
    "name": "heh",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
  },
  "review": {
    "reviewer": {
      "id": 2,
      "type": "User",
      "name": "heh",
      "login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
    },
    "pull_request": {
      "id": 163,
      "title": "新合并请求1",
      "body": null,
      "head": "master_1",
      "base": "master",
      "is_original": false,
      "index": 1,
      "status": "closed",
      "issue": {
        "id": 260,
        "author": {
          "id": 2,
          "type": "User",
          "name": "heh",
          "login": "yystopf",
          "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
        },
        "priority": null,
        "version": null,
        "journals_count": 0,
        "issue_tags": null
      },
      "reviewers": [],
      "journals_count": 9
    },
    "id": 10,
    "commit_id": "1",
    "content": "新建一个审查",
    "status": "common",
    "created_at": "2022-07-26 11:45"
  },
  "resolveer": {
    "id": 2,
    "type": "User",
    "name": "heh",
    "login": "yystopf",
    "image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
  },
  "resolve_at": "2022-07-27 14:50",
  "created_at": "2022-07-27 14:31",
  "updated_at": "2022-07-27 14:50"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|评论ID|none|
|» note|string|true|none|评论内容|none|
|» commit_id|null|true|none|评论标识|none|
|» line_code|string|true|none|评论行数|none|
|» path|string|true|none|评论文件路径|none|
|» diff|object|true|none|评论文件diff内容|none|
|» need_respond|boolean|true|none|评论是否要回应|none|
|» state|string|true|none|评论状态|opened: 开启的, resolved: 已解决的, disabled: 无效的|
|» parent_id|integer|true|none|父评论ID|none|
|» user|object|true|none|评论创建者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» review|object|true|none|评论所属评审|none|
|»» reviewer|object|true|none||none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|
|»» pull_request|object|true|none||none|
|»»» id|integer|true|none||none|
|»»» title|string|true|none||none|
|»»» body|null|true|none||none|
|»»» head|string|true|none||none|
|»»» base|string|true|none||none|
|»»» is_original|boolean|true|none||none|
|»»» index|integer|true|none||none|
|»»» status|string|true|none||none|
|»»» issue|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» author|object|true|none||none|
|»»»»» id|integer|true|none||none|
|»»»»» type|string|true|none||none|
|»»»»» name|string|true|none||none|
|»»»»» login|string|true|none||none|
|»»»»» image_url|string|true|none||none|
|»»»» priority|null|true|none||none|
|»»»» version|null|true|none||none|
|»»»» journals_count|integer|true|none||none|
|»»»» issue_tags|null|true|none||none|
|»»» reviewers|[string]|true|none||none|
|»»» journals_count|integer|true|none||none|
|»» id|integer|true|none||none|
|»» commit_id|string|true|none||none|
|»» content|string|true|none||none|
|»» status|string|true|none||none|
|»» created_at|string|true|none||none|
|» resolveer|object|true|none|评论解决者|none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» login|string|true|none||none|
|»» image_url|string|true|none||none|
|» resolve_at|string|true|none|评论解决时间|none|
|» created_at|string|true|none|评论创建时间|none|
|» updated_at|string|true|none|评论更新时间|none|

## DELETE 删除一个合并请求审查评论

DELETE /api/v1/{owner}/{repo}/pulls/{index}/journals/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|index|path|string| 是 ||合并请求序号|
|id|path|string| 是 ||评论ID|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 创建一个合并请求评论

POST /api/issues/{id}/journals.json

> Body 请求参数

```json
{
  "content": "123123",
  "issue_id": 1,
  "receivers_login": []
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|id|path|string| 是 ||合并请求下issue的id|
|body|body|object| 否 ||none|
|» content|body|string| 是 | 评论内容|none|
|» issue_id|body|integer| 是 | 合并请求下issue的id|none|
|» parent_id|body|integer| 否 | 回复评论ID|none|
|» receivers_login|body|[string]| 否 | @用户标识数组|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "评论成功",
  "id": 3
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» id|integer|true|none||none|

## GET 获取一个合并请求评论列表

GET /api/issues/{id}/journals.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|id|path|string| 是 ||合并请求下issue的id|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "响应成功",
  "limit": 10,
  "journals_count": 2,
  "journals_total_count": 2,
  "issue_journals": [
    {
      "id": 423059,
      "user_name": "肖小琼",
      "user_login": "xxq250",
      "user_picture": "images/avatars/User/86107?t=1668998259",
      "is_journal_detail": false,
      "content": "https://gitlink.org.cn/api/issues/128470/journals.json?id=128470",
      "journal_details": [],
      "format_time": "2025-06-17 15:45",
      "created_at": "2小时前",
      "attachments": []
    },
    {
      "id": 423056,
      "user_name": "wangjing22e",
      "user_login": "wangjing22e",
      "user_picture": "system/lets/letter_avatars/2/W/61_162_123/120.png",
      "is_journal_detail": false,
      "content": "撒打发十分",
      "journal_details": [],
      "format_time": "2025-06-17 15:09",
      "created_at": "2小时前",
      "attachments": []
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none|状态|none|
|» message|string|true|none||none|
|» limit|integer|true|none|分页参数|none|
|» journals_count|integer|true|none|评论总数|none|
|» journals_total_count|integer|true|none|评论总数|none|
|» issue_journals|[object]|true|none||none|
|»» id|integer|true|none||none|
|»» user_name|string|true|none||none|
|»» user_login|string|true|none||none|
|»» user_picture|string|true|none||none|
|»» is_journal_detail|boolean|true|none||none|
|»» content|string|true|none||none|
|»» journal_details|[string]|true|none||none|
|»» format_time|string|true|none||none|
|»» created_at|string|true|none||none|
|»» attachments|[string]|true|none||none|

## DELETE 删除一个合并请求评论

DELETE /api/issues/{issue_id}/journals/{id}.json

> Body 请求参数

```json
{
  "issue_id": 1,
  "id": 4
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|issue_id|path|string| 是 ||合并请求下issue的ID|
|id|path|string| 是 ||评论ID|
|body|body|object| 否 ||none|
|» issue_id|body|integer| 是 | 合并请求下issue的ID|none|
|» id|body|integer| 是 | 评论ID|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

# 发行版

## POST 创建发行版

POST /api/{owner}/{repo}/releases.json

> Body 请求参数

```json
{
  "attachment_ids": [],
  "body": "dfs",
  "name": "ceshi",
  "tag_name": "v1.0.1",
  "target_commitish": "",
  "draft": true,
  "prerelease": true
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» attachment_ids|body|[string]| 否 | 附件ID数组|none|
|» body|body|string| 是 | 发行版描述|none|
|» name|body|string| 是 | 发行版标题|none|
|» tag_name|body|string| 是 | 标签|none|
|» target_commitish|body|string| 否 | 分支|默认为master|
|» draft|body|boolean| 是 | 是否为草稿|none|
|» prerelease|body|boolean| 否 | 是否为预发行版本|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "发布成功"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 获取发行版列表

GET /api/{owner}/{repo}/releases.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "响应成功",
  "releases": [
    {
      "version_id": 2,
      "id": "392",
      "tag_name": "v1.0",
      "target_commitish": "master",
      "name": "ceshi",
      "sha": "96dc82d07e05327fc908aaaa127ba45f02091d85",
      "body": null,
      "url": "http://127.0.0.1:10082/api/v1/repos/yystopfceshi/testdevops/releases/392",
      "tarball_url": "http://localhost:3000/api/yystopfceshi/testdevops/archive/v1.0.tar.gz",
      "zipball_url": "http://localhost:3000/api/yystopfceshi/testdevops/archive/v1.0.zip",
      "draft": "稳定",
      "created_at": "2023-11-22 10:21",
      "published_at": "2023-11-22 10:21",
      "user_name": "咸蛋黄土豆丝xxx",
      "user_login": "yystopf",
      "image_url": "system/lets/letter_avatars/2/X/230_139_26/120.png",
      "attachments": []
    }
  ],
  "total_count": 1
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|
|» releases|[object]|true|none||none|
|»» version_id|integer|false|none|版本ID|none|
|»» id|string|false|none|ID|none|
|»» tag_name|string|false|none|标签名称|none|
|»» target_commitish|string|false|none|分支名称|none|
|»» name|string|false|none|版本名称|none|
|»» sha|string|false|none|版本commit标识|none|
|»» body|string|false|none|版本描述|none|
|»» url|string|false|none|http clone地址|none|
|»» tarball_url|string|false|none|tar下载地址|none|
|»» zipball_url|string|false|none|zip下载地址|none|
|»» draft|string|false|none|是否为草稿|none|
|»» created_at|string|false|none|创建时间|none|
|»» published_at|string|false|none|发布时间|none|
|»» user_name|string|false|none|创建者昵称|none|
|»» user_login|string|false|none|创建者标识|none|
|»» image_url|string|false|none|创建者头像|none|
|»» attachments|[object]|false|none|附件|none|
|»»» id|integer|true|none|附件ID|none|
|»»» title|string|true|none|附件标题|none|
|»»» filesize|string|true|none|附件大小|none|
|»»» description|string|true|none|附件描述|none|
|»»» is_pdf|boolean|true|none|附件是否为pdf|none|
|»»» url|string|true|none|附件下载地址|none|
|» total_count|integer|true|none|版本总数|none|

## GET 编辑发行版

GET /api/{owner}/{repo}/releases/{id}/edit.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "id": 593,
  "name": "222",
  "body": "22",
  "tag_name": "v1.0",
  "target_commitish": "master",
  "draft": false,
  "prerelease": false,
  "version_gid": "1619232",
  "attachments": [
    {
      "id": 441826,
      "title": "http-proxy.conf",
      "filesize": "154 字节",
      "description": "",
      "is_pdf": false,
      "url": "/api/attachments/441826"
    },
    {
      "id": 441827,
      "title": "组 9.png",
      "filesize": "342.0 KB",
      "description": "",
      "is_pdf": false,
      "url": "/api/attachments/441827"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|ID|none|
|» name|string|true|none|名称|none|
|» body|string|true|none|描述|none|
|» tag_name|string|true|none|标签名称|none|
|» target_commitish|string|true|none|分支名称|none|
|» draft|boolean|true|none|是否为草稿|none|
|» prerelease|boolean|true|none|是否为预发行版本|none|
|» version_gid|string|true|none|gitea ID|none|
|» attachments|[object]|true|none|附件|none|
|»» id|integer|true|none|附件ID|none|
|»» title|string|true|none|标题|none|
|»» filesize|string|true|none|文件大小|none|
|»» description|string|true|none|文件描述|none|
|»» is_pdf|boolean|true|none|是否为pdf|none|
|»» url|string|true|none|下载地址|none|

## PUT 更新发行版

PUT /api/{owner}/{repo}/releases/{id}.json

> Body 请求参数

```json
{
  "attachment_ids": [],
  "body": "dfs",
  "name": "ceshi",
  "tag_name": "v1.0.1",
  "target_commitish": "",
  "draft": true,
  "prerelease": true
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» attachment_ids|body|[string]| 否 | 附件ID数组|none|
|» body|body|string| 是 | 发行版描述|none|
|» name|body|string| 是 | 发行版标题|none|
|» tag_name|body|string| 是 | 标签|none|
|» target_commitish|body|string| 否 | 分支|默认为master|
|» draft|body|boolean| 否 | 是否为草稿|none|
|» prerelease|body|boolean| 否 | 是否为预发行版本|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "更新成功"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## DELETE 删除发行版

DELETE /api/{owner}/{repo}/releases/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "删除成功"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 查看发行版

GET /api/{owner}/{repo}/releases/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "version_id": 593,
  "id": "1619232",
  "tag_name": "v1.0",
  "target_commitish": "master",
  "name": "222",
  "sha": "ef44144e8f53fd19d38c8a7d1400313db73881e4",
  "body": "22",
  "url": "https://gitlink.org.cn/api/v1/repos/yystopf/data_competition/releases/1619232",
  "tarball_url": "https://www.gitlink.org.cn/api/yystopf/data_competition/archive/v1.0.tar.gz",
  "zipball_url": "https://www.gitlink.org.cn/api/yystopf/data_competition/archive/v1.0.zip",
  "draft": "稳定",
  "created_at": "2023-11-27 11:47",
  "published_at": "2023-11-27 11:47",
  "user_name": "何慧",
  "user_login": "yystopf",
  "image_url": "images/avatars/User/85890?t=1641550911",
  "attachments": [
    {
      "id": 441826,
      "title": "http-proxy.conf",
      "filesize": "154 字节",
      "description": "",
      "is_pdf": false,
      "url": "/api/attachments/441826"
    },
    {
      "id": 441827,
      "title": "组 9.png",
      "filesize": "342.0 KB",
      "description": "",
      "is_pdf": false,
      "url": "/api/attachments/441827"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» version_id|integer|true|none|ID|none|
|» id|string|true|none||none|
|» tag_name|string|true|none|标签名称|none|
|» target_commitish|string|true|none|分支名称|none|
|» name|string|true|none|名称|none|
|» sha|string|true|none|标识|none|
|» body|string|true|none|描述|none|
|» url|string|true|none|下载地址|none|
|» tarball_url|string|true|none|tar下载地址|none|
|» zipball_url|string|true|none|zip下载地址|none|
|» draft|string|true|none|版本类型|有以下三种 草稿、预发行、稳定|
|» created_at|string|true|none|创建时间|none|
|» published_at|string|true|none|发布时间|none|
|» user_name|string|true|none|创建者昵称|none|
|» user_login|string|true|none|创建者标识|none|
|» image_url|string|true|none|创建者头像|none|
|» attachments|[object]|true|none||none|
|»» id|integer|true|none|附件ID|none|
|»» title|string|true|none|附件标题|none|
|»» filesize|string|true|none|附件文件大小|none|
|»» description|string|true|none|附件描述|none|
|»» is_pdf|boolean|true|none|附件是否为pdf|none|
|»» url|string|true|none|附件链接|none|

# 数据集

## POST 创建数据集

POST /api/v1/{owner}/{repo}/dataset

> Body 请求参数

```json
{
  "title": "标题",
  "description": "描述"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|body|body|object| 否 ||none|
|» title|body|string| 是 | 标题|none|
|» description|body|string| 是 | 描述|none|
|» license_id|body|integer| 是 | 许可证ID|none|
|» paper_content|body|string| 是 | 研究论文|none|

> 返回示例

```json
{
  "status": 0,
  "message": "success"
}
```

```json
{
  "status": -1,
  "message": "该项目下已存在数据集！"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PUT 更新数据集

PUT /api/v1/{owner}/{repo}/dataset

> Body 请求参数

```json
{
  "title": "标题",
  "description": "描述"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|body|body|object| 否 ||none|
|» title|body|string| 是 | 标题|none|
|» description|body|string| 是 | 描述|none|
|» license_id|body|integer| 是 | 许可证ID|none|
|» paper_content|body|string| 是 | 研究论文内容|none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 数据集详情+列表

GET /api/v1/{owner}/{repo}/dataset

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|page|query|integer| 否 ||分页页码|
|limit|query|integer| 否 ||每页个数|

> 返回示例

> 200 Response

```json
{
  "id": 2,
  "title": "标题1",
  "description": "描述1",
  "attachments": [
    {
      "id": "2e78064e-48f9-4960-bf55-c4534a26abba",
      "title": "操作系统大赛用户信息 (4).csv",
      "description": "对方房东",
      "filesize": "98 字节",
      "is_pdf": false,
      "url": "/api/attachments/2e78064e-48f9-4960-bf55-c4534a26abba",
      "created_on": "2024-04-01 16:53:34",
      "content_type": "text/csv",
      "creator": {
        "id": 102,
        "type": "User",
        "name": "咸蛋黄土豆丝",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/Y/241_125_89/120.png"
      }
    },
    {
      "id": "e16cf5da-3552-452b-8699-c7a8e18e8a9e",
      "title": "操作系统大赛用户信息 (4).csv",
      "description": "对方房东333333",
      "filesize": "98 字节",
      "is_pdf": false,
      "url": "/api/attachments/e16cf5da-3552-452b-8699-c7a8e18e8a9e",
      "created_on": "2024-04-01 17:15:28",
      "content_type": "text/csv",
      "creator": {
        "id": 102,
        "type": "User",
        "name": "咸蛋黄土豆丝",
        "login": "yystopf",
        "image_url": "system/lets/letter_avatars/2/Y/241_125_89/120.png"
      }
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|数据集ID|none|
|» title|string|true|none|数据集标题|none|
|» description|string|true|none|数据集描述|none|
|» attachment_total_count|integer|true|none|文件总数|none|
|» attachments|[object]|true|none||none|
|»» id|string|true|none|附件UUID|none|
|»» title|string|true|none|附件标题|none|
|»» description|string|true|none|附件描述|none|
|»» filesize|string|true|none|附件大小|none|
|»» is_pdf|boolean|true|none|附件是否为pdf|none|
|»» url|string|true|none|附件下载地址|none|
|»» created_on|string|true|none|附件上传时间|none|
|»» content_type|string|true|none|附件类型|none|
|»» creator|object|true|none|附件创建者|none|
|»»» id|integer|true|none||none|
|»»» type|string|true|none||none|
|»»» name|string|true|none||none|
|»»» login|string|true|none||none|
|»»» image_url|string|true|none||none|

## GET 查询数据集列表

GET /api/v1/project_datasets.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|ids|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "project_datasets": [
    {
      "id": 3,
      "title": "是许方层",
      "description": "府就却法易石儿置断每合体如这。车史二图个器天书家风接八者证要广民。往儿确七明资写十众工因拉式斗积南比我。青响则会活称报事住极国群原公改油般。低往书两空质和段查活结水制装。",
      "paper_content": "laboris eu commodo labore ut",
      "project": {
        "type": "common",
        "id": 1,
        "description": null,
        "forked_count": 0,
        "forked_from_project_id": null,
        "identifier": "ceshi",
        "issues_count": 2,
        "pull_requests_count": 2,
        "invite_code": "mPL1Ef",
        "website": null,
        "platform": "forge",
        "name": "常见资按",
        "open_devops": false,
        "praises_count": 0,
        "is_public": false,
        "status": 1,
        "watchers_count": 0,
        "ignore_id": null,
        "license_id": null,
        "project_category_id": null,
        "project_language_id": null
      },
      "license": {
        "name": "BSD-4-Clause",
        "content": "Copyright (c) <year> <owner> . All rights reserved.\n\nRedistribution and use in source and binary forms, with or without modification,\nare permitted provided that the following conditions are met:\n\n1. Redistributions of source code must retain the above copyright notice,\nthis list of conditions and the following disclaimer.\n\n2. Redistributions in binary form must reproduce the above copyright notice,\nthis list of conditions and the following disclaimer in the documentation\nand/or other materials provided with the distribution.\n\n3. All advertising materials mentioning features or use of this software must\ndisplay the following acknowledgement:\n\n   This product includes software developed by the organization .\n\n4. Neither the name of the copyright holder nor the names of its contributors\nmay be used to endorse or promote products derived from this software without\nspecific prior written permission.\n\nTHIS SOFTWARE IS PROVIDED BY COPYRIGHT HOLDER \"AS IS\" AND ANY EXPRESS OR IMPLIED\nWARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL COPYRIGHT\nHOLDER BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY,\nOR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE\nGOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)\nHOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT\nLIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY\nOUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH\nDAMAGE.\n"
      }
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|总数|none|
|» project_datasets|[object]|true|none||none|
|»» id|integer|false|none|数据集ID|none|
|»» title|string|false|none|数据集标题|none|
|»» description|string|false|none|数据集描述|none|
|»» paper_content|string|false|none|数据集论文内容|none|
|»» project|object|false|none|项目信息|none|
|»»» type|string|true|none||none|
|»»» id|integer|true|none||none|
|»»» description|null|true|none||none|
|»»» forked_count|integer|true|none||none|
|»»» forked_from_project_id|null|true|none||none|
|»»» identifier|string|true|none||none|
|»»» issues_count|integer|true|none||none|
|»»» pull_requests_count|integer|true|none||none|
|»»» invite_code|string|true|none||none|
|»»» website|null|true|none||none|
|»»» platform|string|true|none||none|
|»»» name|string|true|none||none|
|»»» open_devops|boolean|true|none||none|
|»»» praises_count|integer|true|none||none|
|»»» is_public|boolean|true|none||none|
|»»» status|integer|true|none||none|
|»»» watchers_count|integer|true|none||none|
|»»» ignore_id|null|true|none||none|
|»»» license_id|null|true|none||none|
|»»» project_category_id|null|true|none||none|
|»»» project_language_id|null|true|none||none|
|»» license|object|false|none|许可证|none|
|»»» name|string|true|none|名称|none|
|»»» content|string|true|none|内容|none|

## DELETE 删除数据集附件

DELETE /api/attachments/{uuid}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|uuid|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "删除成功"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

# WebHook

## GET Webhook列表

GET /api/v1/{owner}/{repo}/webhooks.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|

> 返回示例

> 200 Response

```json
{
  "total_count": 1,
  "webhooks": [
    {
      "id": 4161,
      "url": "http://gxdaw.tf/snhcg",
      "http_method": "GET",
      "is_active": true,
      "type": "gitea",
      "last_status": "waiting",
      "create_time": "2023-04-03 19:01:29"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» webhooks|[object]|true|none||none|
|»» id|integer|false|none|ID|none|
|»» url|string|false|none|请求地址|none|
|»» http_method|string|false|none|请求方式|none|
|»» is_active|boolean|false|none|是否激活|none|
|»» type|string|false|none|类型|none|
|»» last_status|string|false|none|最后一次推送的状态|none|
|»» create_time|string|false|none|创建时间|none|

#### 枚举值

|属性|值|
|---|---|
|http_method|POST|
|http_method|GET|
|type|gitea|
|type|slack|
|type|discord|
|type|dingtalk|
|type|telegram|
|type|msteams|
|type|feishu|
|type|matrix|
|type|jianmu|
|type|softbot|
|last_status|waiting|
|last_status|succeed|
|last_status|fail|

## POST Webhook创建

POST /api/v1/{owner}/{repo}/webhooks.json

> Body 请求参数

```json
{
  "type": "gitea",
  "active": true,
  "content_type": "json",
  "http_method": "GET",
  "secret": "string",
  "url": "string",
  "branch_filter": "string",
  "events": [
    "push"
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» type|body|string| 否 | 类型|none|
|» active|body|boolean| 是 | 是否开启|none|
|» content_type|body|string| 是 | POST content_type|none|
|» http_method|body|string| 是 | 请求方式|none|
|» secret|body|string| 否 | 密钥|none|
|» url|body|string| 是 | 请求地址|none|
|» branch_filter|body|string| 是 | 分支白名单|推送、创建，删除分支事件的分支白名单，使用 glob 模式匹配指定。若为空或 *，则将报告所有分支的事件。语法文档见github.com/gobwas/glob。示例：master,{master,release*}。|
|» events|body|[string]| 是 | 事件|none|

#### 枚举值

|属性|值|
|---|---|
|» type|gitea|
|» type|slack|
|» type|discord|
|» type|dingtalk|
|» type|telegram|
|» type|msteams|
|» type|feishu|
|» type|matrix|
|» type|jianmu|
|» type|softbot|
|» content_type|json|
|» content_type|form|
|» http_method|GET|
|» http_method|POST|
|» events|push|
|» events|create|
|» events|delete|
|» events|issues_only|
|» events|issue_assign|
|» events|issue_label|
|» events|issue_comment|
|» events|pull_request_only|
|» events|pull_request_assign|
|» events|pull_request_comment|

> 返回示例

> 200 Response

```json
{
  "id": 4167,
  "type": "gitea",
  "content_type": "json",
  "http_method": null,
  "url": "http://gxdaw.tf/snhcg",
  "events": [
    "delete",
    "push",
    "issues",
    "pull_request"
  ],
  "active": true,
  "branch_filter": null,
  "created_at": "2023-04-04 11:43"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none|ID|none|
|» type|string|true|none|类型|none|
|» content_type|string|true|none|POST content_type|none|
|» http_method|null|false|none|请求方式|none|
|» url|string|true|none|请求地址|none|
|» events|[string]|true|none|事件|none|
|» active|boolean|true|none|是否开启|none|
|» branch_filter|null|false|none|分支白名单|none|
|» created_at|string|true|none|创建时间|none|

## DELETE Webhook删除

DELETE /api/v1/{owner}/{repo}/webhooks/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|id|path|string| 是 ||webhook的ID|
|uid|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET Webhook详情

GET /api/v1/{owner}/{repo}/webhooks/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者标识|
|repo|path|string| 是 ||项目标识|
|id|path|string| 是 ||webhook的ID|
|uid|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PUT Webhook更新

PUT /api/v1/{owner}/{repo}/webhooks/{id}.json

> Body 请求参数

```json
{
  "active": true,
  "content_type": "json",
  "http_method": "GET",
  "secret": "123456",
  "url": "http://localhost:10000",
  "branch_filter": "*",
  "events": [
    "push"
  ]
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|id|path|string| 是 ||webhook的ID|
|body|body|object| 否 ||none|
|» active|body|boolean| 是 | 是否激活|none|
|» content_type|body|string| 是 | POST Content Type|none|
|» http_method|body|string| 是 | http方法, POST和GET|none|
|» secret|body|string| 是 | 密钥文本|none|
|» url|body|string| 是 | 目标url|none|
|» branch_filter|body|string| 是 | 分支过滤|none|
|» events|body|[string]| 是 | 触发事件|none|

#### 枚举值

|属性|值|
|---|---|
|» content_type|json|
|» content_type|form|
|» http_method|POST|
|» http_method|GET|
|» events|push|
|» events|create|
|» events|delete|
|» events|issues_only|
|» events|issue_assign|
|» events|issue_label|
|» events|issue_comment|
|» events|pull_request_only|
|» events|pull_request_assign|
|» events|pull_request_comment|

> 返回示例

> 200 Response

```json
{
  "id": 68,
  "content_type": "json",
  "http_method": "GET",
  "url": "http://127.0.0.1:3000",
  "events": [
    "create",
    "delete",
    "push",
    "pull_request",
    "pull_request_assign",
    "pull_request_review_approved",
    "pull_request_review_rejected"
  ],
  "active": true,
  "branch_filter": "*",
  "created_at": "2022-06-23 15:52"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» id|integer|true|none||none|
|» content_type|string|true|none|POST Content Type|none|
|» http_method|string|true|none|http方法, POST和GET|none|
|» url|string|true|none|目标url|none|
|» events|[string]|true|none|触发事件|none|
|» active|boolean|true|none|是否激活|none|
|» branch_filter|string|true|none|分支过滤|none|
|» created_at|string|true|none|创建时间|none|

## GET Webhook历史推送列表

GET /api/v1/{owner}/{repo}/webhooks/{id}/hooktasks.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 6,
  "hooktasks": [
    {
      "id": 20,
      "type": "gitea",
      "uuid": "99aa2c23-6884-4c44-9020-5469320aa408",
      "is_succeed": true,
      "is_delivered": true,
      "payload_content": {
        "secret": "123456",
        "ref": "refs/heads/master",
        "before": "feb48e31362787a7620b53d4df3c4effddbb6f0b",
        "after": "feb48e31362787a7620b53d4df3c4effddbb6f0b",
        "compare_url": "",
        "commits": [
          {
            "id": "feb48e31362787a7620b53d4df3c4effddbb6f0b",
            "message": "fix\n",
            "url": "http://localhost:10081/yystopf/ceshi/commit/feb48e31362787a7620b53d4df3c4effddbb6f0b",
            "author": {
              "name": "viletyy",
              "email": "yystopf@163.com",
              "username": "root"
            },
            "committer": {
              "name": "viletyy",
              "email": "yystopf@163.com",
              "username": "root"
            },
            "verification": {
              "verified": false,
              "reason": "gpg.error.not_signed_commit",
              "signature": "",
              "signer": null,
              "payload": ""
            },
            "timestamp": "2021-07-26T13:52:13+08:00",
            "added": null,
            "removed": null,
            "modified": null
          }
        ],
        "head_commit": null,
        "repository": {
          "id": 2,
          "owner": {
            "id": 3,
            "login": "yystopf",
            "full_name": "",
            "email": "yystopf@forge.com",
            "avatar_url": "http://localhost:10081/user/avatar/yystopf/-1",
            "language": "zh-CN",
            "is_admin": true,
            "last_login": "2021-07-21T18:38:21+08:00",
            "created": "2021-06-03T14:50:25+08:00",
            "username": "yystopf"
          },
          "name": "ceshi",
          "full_name": "yystopf/ceshi",
          "description": "",
          "empty": false,
          "private": false,
          "fork": false,
          "template": false,
          "parent": null,
          "mirror": false,
          "size": 3846,
          "html_url": "http://localhost:10081/yystopf/ceshi",
          "ssh_url": "virus@localhost:10081:yystopf/ceshi.git",
          "clone_url": "http://localhost:10081/yystopf/ceshi.git",
          "original_url": "",
          "website": "",
          "stars_count": 0,
          "forks_count": 1,
          "watchers_count": 1,
          "open_issues_count": 0,
          "open_pr_counter": 0,
          "release_counter": 0,
          "default_branch": "master",
          "archived": false,
          "created_at": "2021-06-03T15:15:30+08:00",
          "updated_at": "2021-07-26T13:52:16+08:00",
          "permissions": {
            "admin": false,
            "push": false,
            "pull": false
          },
          "has_issues": true,
          "internal_tracker": {
            "enable_time_tracker": true,
            "allow_only_contributors_to_track_time": true,
            "enable_issue_dependencies": true
          },
          "has_wiki": true,
          "has_pull_requests": true,
          "ignore_whitespace_conflicts": false,
          "allow_merge_commits": true,
          "allow_rebase": true,
          "allow_rebase_explicit": true,
          "allow_squash_merge": true,
          "avatar_url": "",
          "internal": false
        },
        "pusher": {
          "id": 0,
          "login": "yystopf",
          "full_name": "",
          "email": "yystopf@forge.com",
          "avatar_url": "http://localhost:10081/user/avatar/yystopf/-1",
          "language": "",
          "is_admin": false,
          "last_login": "0001-01-01T00:00:00Z",
          "created": "2021-06-03T14:50:25+08:00",
          "username": "yystopf"
        },
        "sender": {
          "id": 0,
          "login": "yystopf",
          "full_name": "",
          "email": "yystopf@forge.com",
          "avatar_url": "http://localhost:10081/user/avatar/yystopf/-1",
          "language": "",
          "is_admin": false,
          "last_login": "0001-01-01T00:00:00Z",
          "created": "2021-06-03T14:50:25+08:00",
          "username": "yystopf"
        }
      },
      "request_content": {
        "headers": {
          "X-GitHub-Delivery": "99aa2c23-6884-4c44-9020-5469320aa408",
          "X-GitHub-Event": "push",
          "X-Gitea-Delivery": "99aa2c23-6884-4c44-9020-5469320aa408",
          "X-Gitea-Event": "push",
          "X-Gitea-Signature": "34a01edcd952ff6410ff6ebc946471161bde74aff86171f21621d2c2c4130f66",
          "X-Gogs-Delivery": "99aa2c23-6884-4c44-9020-5469320aa408",
          "X-Gogs-Event": "push",
          "X-Gogs-Signature": "34a01edcd952ff6410ff6ebc946471161bde74aff86171f21621d2c2c4130f66"
        }
      },
      "response_content": {
        "status": 200,
        "headers": {
          "Cache-Control": "no-store, must-revalidate, private, max-age=0",
          "Content-Length": "2556",
          "Content-Type": "text/html; charset=utf-8",
          "Referrer-Policy": "strict-origin-when-cross-origin",
          "Set-Cookie": "__profilin=p%3Dt; path=/; HttpOnly",
          "Vary": "Origin",
          "X-Content-Type-Options": "nosniff",
          "X-Download-Options": "noopen",
          "X-Frame-Options": "SAMEORIGIN",
          "X-Miniprofiler-Ids": "9ynvpncz5xm0rpgorb5y,hgggd9mv6lr4a9drcrlr,j7zqlx2vy5aji2vtgoba,f1ktsmh3jxvq0z2hf612,mih3dvgvlqhi3zy8lf2x,5k1qbkvbnru8mye9cest,tj6ern8w6awqf2zsimbr,9isaehvubivd52wo5p9v,1rzfhtq1nhuwbgy9p76g,z0xzidzyywna0y7a69m0,hzoklky92ycjqt42gi0s,y0ai7y0t28mcn8x0py2x,322il7nadinp51mw2r5m,m6dukftfsh6tjcxzp1gq,667wlqbytfwbrirnmma1,jcehj3dl8lkw8gk510cr",
          "X-Miniprofiler-Original-Cache-Control": "max-age=0, private, must-revalidate",
          "X-Permitted-Cross-Domain-Policies": "none",
          "X-Request-Id": "08bff080-bbb5-4183-b845-81de3d47120a",
          "X-Runtime": "0.394766",
          "X-Xss-Protection": "1; mode=block"
        },
        "body": "<!doctype html><html lang=\"zh-CN\" class=\"notranslate translated-ltr\" translate=\"no\"><head><meta charset=\"utf-8\"><meta name=\"”Keywords”\" content=\"”trustie,trustieforge,forge,确实让创建更美好,协同开发平台″\"><meta name=\"”Keywords”\" content=\"”TrustieOpenSourceProject″\"><meta name=\"”Keywords”\" content=\"”issue,bug,tracker,软件工程,课程实践″\"><meta name=\"”Description”\" content=\"”持续构建协同、共享、可信的软件创建生态开源创作与软件生产相结合，支持大规模群体开展软件协同创新活动”\"><meta name=\"theme-color\" content=\"#000000\"><link rel=\"manifest\" href=\"/react/build//manifest.json\"><link rel=\"stylesheet\" href=\"/react/build/css/iconfont.css\"><link rel=\"stylesheet\" href=\"/react/build/css/edu-purge.css\"><link rel=\"stylesheet\" href=\"/react/build/css/editormd.min.css\"><link rel=\"stylesheet\" href=\"/react/build/css/merge.css\"><link href=\"/react/build/static/css/main.07f7e90c.chunk.css\" rel=\"stylesheet\"></head><body><div id=\"md_div\" style=\"display:none\"></div><div id=\"root\" class=\"page -layout-v -fit widthunit\"></div><div id=\"picture_display\" style=\"display:none\"></div><script src=\"/react/build/js/jquery-1.8.3.min.js\"></script><script src=\"/react/build/js/js_min_all.js\"></script><script src=\"/react/build/js/codemirror/codemirror.js\"></script><script src=\"/react/build/js/editormd/editormd.min.js\"></script><script src=\"/react/build/js/codemirror/merge/merge.js\"></script><script src=\"/react/build/./static/js/runtime~main.3d644966.js\"></script><script src=\"/react/build/./static/js/main.e46872e3.chunk.js\"></script><script async type=\"text/javascript\" id=\"mini-profiler\" src=\"/mini-profiler-resources/includes.js?v=67dd1c2571ced7fc74ae7f1813e47bdf\" data-version=\"67dd1c2571ced7fc74ae7f1813e47bdf\" data-path=\"/mini-profiler-resources/\" data-current-id=\"9ynvpncz5xm0rpgorb5y\" data-ids=\"9ynvpncz5xm0rpgorb5y,hgggd9mv6lr4a9drcrlr,j7zqlx2vy5aji2vtgoba,f1ktsmh3jxvq0z2hf612,mih3dvgvlqhi3zy8lf2x,5k1qbkvbnru8mye9cest,tj6ern8w6awqf2zsimbr,9isaehvubivd52wo5p9v,1rzfhtq1nhuwbgy9p76g,z0xzidzyywna0y7a69m0,hzoklky92ycjqt42gi0s,y0ai7y0t28mcn8x0py2x,322il7nadinp51mw2r5m,m6dukftfsh6tjcxzp1gq,667wlqbytfwbrirnmma1,jcehj3dl8lkw8gk510cr\" data-horizontal-position=\"left\" data-vertical-position=\"top\" data-trivial=\"false\" data-children=\"false\" data-max-traces=\"20\" data-controls=\"false\" data-total-sql-count=\"false\" data-authorized=\"true\" data-toggle-shortcut=\"alt+p\" data-start-hidden=\"false\" data-collapse-results=\"true\" data-html-container=\"body\"></script>\n</body></html>"
      },
      "delivered_time": "2021-07-28 11:47:29"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none|分页总数|none|
|» hooktasks|[object]|true|none||none|
|»» id|integer|false|none||none|
|»» type|string|false|none|类型|none|
|»» uuid|string|false|none|推送uuid|none|
|»» is_succeed|boolean|false|none|是否推送成功|none|
|»» is_delivered|boolean|false|none|是否完成推送|none|
|»» payload_content|object|false|none|请求主体内容|none|
|»»» secret|string|true|none||none|
|»»» ref|string|true|none||none|
|»»» before|string|true|none||none|
|»»» after|string|true|none||none|
|»»» compare_url|string|true|none||none|
|»»» commits|[object]|true|none||none|
|»»»» id|string|false|none||none|
|»»»» message|string|false|none||none|
|»»»» url|string|false|none||none|
|»»»» author|object|false|none||none|
|»»»»» name|string|true|none||none|
|»»»»» email|string|true|none||none|
|»»»»» username|string|true|none||none|
|»»»» committer|object|false|none||none|
|»»»»» name|string|true|none||none|
|»»»»» email|string|true|none||none|
|»»»»» username|string|true|none||none|
|»»»» verification|object|false|none||none|
|»»»»» verified|boolean|true|none||none|
|»»»»» reason|string|true|none||none|
|»»»»» signature|string|true|none||none|
|»»»»» signer|null|true|none||none|
|»»»»» payload|string|true|none||none|
|»»»» timestamp|string|false|none||none|
|»»»» added|null|false|none||none|
|»»»» removed|null|false|none||none|
|»»»» modified|null|false|none||none|
|»»» head_commit|null|true|none||none|
|»»» repository|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» owner|object|true|none||none|
|»»»»» id|integer|true|none||none|
|»»»»» login|string|true|none||none|
|»»»»» full_name|string|true|none||none|
|»»»»» email|string|true|none||none|
|»»»»» avatar_url|string|true|none||none|
|»»»»» language|string|true|none||none|
|»»»»» is_admin|boolean|true|none||none|
|»»»»» last_login|string|true|none||none|
|»»»»» created|string|true|none||none|
|»»»»» username|string|true|none||none|
|»»»» name|string|true|none||none|
|»»»» full_name|string|true|none||none|
|»»»» description|string|true|none||none|
|»»»» empty|boolean|true|none||none|
|»»»» private|boolean|true|none||none|
|»»»» fork|boolean|true|none||none|
|»»»» template|boolean|true|none||none|
|»»»» parent|null|true|none||none|
|»»»» mirror|boolean|true|none||none|
|»»»» size|integer|true|none||none|
|»»»» html_url|string|true|none||none|
|»»»» ssh_url|string|true|none||none|
|»»»» clone_url|string|true|none||none|
|»»»» original_url|string|true|none||none|
|»»»» website|string|true|none||none|
|»»»» stars_count|integer|true|none||none|
|»»»» forks_count|integer|true|none||none|
|»»»» watchers_count|integer|true|none||none|
|»»»» open_issues_count|integer|true|none||none|
|»»»» open_pr_counter|integer|true|none||none|
|»»»» release_counter|integer|true|none||none|
|»»»» default_branch|string|true|none||none|
|»»»» archived|boolean|true|none||none|
|»»»» created_at|string|true|none||none|
|»»»» updated_at|string|true|none||none|
|»»»» permissions|object|true|none||none|
|»»»»» admin|boolean|true|none||none|
|»»»»» push|boolean|true|none||none|
|»»»»» pull|boolean|true|none||none|
|»»»» has_issues|boolean|true|none||none|
|»»»» internal_tracker|object|true|none||none|
|»»»»» enable_time_tracker|boolean|true|none||none|
|»»»»» allow_only_contributors_to_track_time|boolean|true|none||none|
|»»»»» enable_issue_dependencies|boolean|true|none||none|
|»»»» has_wiki|boolean|true|none||none|
|»»»» has_pull_requests|boolean|true|none||none|
|»»»» ignore_whitespace_conflicts|boolean|true|none||none|
|»»»» allow_merge_commits|boolean|true|none||none|
|»»»» allow_rebase|boolean|true|none||none|
|»»»» allow_rebase_explicit|boolean|true|none||none|
|»»»» allow_squash_merge|boolean|true|none||none|
|»»»» avatar_url|string|true|none||none|
|»»»» internal|boolean|true|none||none|
|»»» pusher|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» login|string|true|none||none|
|»»»» full_name|string|true|none||none|
|»»»» email|string|true|none||none|
|»»»» avatar_url|string|true|none||none|
|»»»» language|string|true|none||none|
|»»»» is_admin|boolean|true|none||none|
|»»»» last_login|string|true|none||none|
|»»»» created|string|true|none||none|
|»»»» username|string|true|none||none|
|»»» sender|object|true|none||none|
|»»»» id|integer|true|none||none|
|»»»» login|string|true|none||none|
|»»»» full_name|string|true|none||none|
|»»»» email|string|true|none||none|
|»»»» avatar_url|string|true|none||none|
|»»»» language|string|true|none||none|
|»»»» is_admin|boolean|true|none||none|
|»»»» last_login|string|true|none||none|
|»»»» created|string|true|none||none|
|»»»» username|string|true|none||none|
|»» request_content|object|false|none|请求内容，头部等等|none|
|»»» headers|object|true|none||none|
|»»»» X-GitHub-Delivery|string|true|none||none|
|»»»» X-GitHub-Event|string|true|none||none|
|»»»» X-Gitea-Delivery|string|true|none||none|
|»»»» X-Gitea-Event|string|true|none||none|
|»»»» X-Gitea-Signature|string|true|none||none|
|»»»» X-Gogs-Delivery|string|true|none||none|
|»»»» X-Gogs-Event|string|true|none||none|
|»»»» X-Gogs-Signature|string|true|none||none|
|»» response_content|object|false|none|响应内容，状态，头部，主体等等|none|
|»»» status|integer|true|none||none|
|»»» headers|object|true|none||none|
|»»»» Cache-Control|string|true|none||none|
|»»»» Content-Length|string|true|none||none|
|»»»» Content-Type|string|true|none||none|
|»»»» Referrer-Policy|string|true|none||none|
|»»»» Set-Cookie|string|true|none||none|
|»»»» Vary|string|true|none||none|
|»»»» X-Content-Type-Options|string|true|none||none|
|»»»» X-Download-Options|string|true|none||none|
|»»»» X-Frame-Options|string|true|none||none|
|»»»» X-Miniprofiler-Ids|string|true|none||none|
|»»»» X-Miniprofiler-Original-Cache-Control|string|true|none||none|
|»»»» X-Permitted-Cross-Domain-Policies|string|true|none||none|
|»»»» X-Request-Id|string|true|none||none|
|»»»» X-Runtime|string|true|none||none|
|»»»» X-Xss-Protection|string|true|none||none|
|»»» body|string|true|none||none|
|»» delivered_time|string|false|none|推送时间|none|

## POST Webhook测试推送

POST /api/v1/{owner}/{repo}/webhooks/{id}/tests.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||项目拥有者用户标识|
|repo|path|string| 是 ||项目标识|
|id|path|string| 是 ||Webhook ID|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

# Oauth2

## POST 刷新token

POST /oauth/token

> Body 请求参数

```json
{
  "grant_type": "refresh_token",
  "refresh_token": "xxxxxxxxxxxxxx",
  "client_id": "7",
  "client_secret": "ea tempor in anim"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» grant_type|body|string| 是 ||鉴权类型|
|» refresh_token|body|string| 是 ||refresh_token|
|» client_id|body|string| 是 ||ClientID|
|» client_secret|body|string| 是 ||ClientSecret|

#### 枚举值

|属性|值|
|---|---|
|» grant_type|refresh_token|

> 返回示例

> 200 Response

```json
{
  "access_token": "eyJraWQiOiJUaEVSLVl3Ukg4TWYwOHM0UnJLUDYzXzZLWmVET2NZckZXcmdzN2VUVWdrIiwiYWxnIjoiSFM1MTIifQ.eyJpc3MiOiJHaXRMaW5rIiwiaWF0IjoxNjc1OTI5NTAxLCJqdGkiOiI1Yjg2ZDNjMi1hODA0LTQyNjEtYWFjYi1jZDg0YzM5ZjBiM2MiLCJ1c2VyIjp7ImlkIjo4NDcyNywibG9naW4iOiJ5eXN0b3BmMTIzIiwibWFpbCI6Ijk3ODY2MDQxNEBxcS5jb20ifX0.JxgzogjKZlRsTpB3Gy37_D2y5wP847X0NKYCdInm7TDwpzR8PPm9RXBfWpOe2riKHA9RTdUREG0dHjDCMNnaWQ",
  "token_type": "Bearer",
  "expires_in": 604799,
  "refresh_token": "DkE20crBDMVK4yfqMdte15DvR-dQpZciuP-z3jl3kaM",
  "scope": "public",
  "created_at": 1675929501
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» access_token|string|true|none||none|
|» token_type|string|true|none||none|
|» expires_in|integer|true|none||none|
|» refresh_token|string|true|none||none|
|» scope|string|true|none||none|
|» created_at|integer|true|none||none|

# Wiki/wiki功能接口

<a id="opIdcreateWikiUsingPOST"></a>

## POST createWiki

POST /api/wiki/createWiki

> Body 请求参数

```json
{
  "owner": "wanjia9506",
  "repo": "test",
  "projectId": 1406620,
  "pageName": "123",
  "title": "123",
  "message": "",
  "content_base64": "5qyi6L+O5p2l5YiwV2lraQ=="
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» content_base64|body|string| 是 | wiki内容|none|
|» message|body|string¦null| 否 | 提交信息|none|
|» owner|body|string| 是 | 仓库拥有者标识|none|
|» pageName|body|string| 是 | 当前页标题|none|
|» projectId|body|integer(int32)| 是 | gitlink项目id|none|
|» repo|body|string| 是 | 仓库标识|none|
|» title|body|string| 是 | 标题|none|

> 返回示例

> 200 Response

```json
{
  "message": "201",
  "data": "{\"title\":\"test\",\"html_url\":\"https://gitlink.org.cn/wanjia9506/test/wiki/test\",\"sub_url\":\"test\",\"last_commit\":{\"sha\":\"aca9df20a9c241ddf3862ba8203d5764a5a07829\",\"author\":{\"name\":\"wanjia9506\",\"email\":\"553039491@qq.com\",\"date\":\"2023-12-27T07:25:54Z\"},\"commiter\":{\"name\":\"wanjia9506\",\"email\":\"553039491@qq.com\",\"date\":\"2023-12-27T07:25:54Z\"},\"message\":\"Add 'test'\\n\"},\"content_base64\":\"5qyi6L+O5p2l5YiwV2lraQ==\",\"commit_count\":3,\"sidebar\":\"W1t0c3QxMjNdXQ==\",\"footer\":\"\"}\n"
}
```

> 201 Response

```json
{
  "message": "201",
  "data": "{\"title\":\"test\",\"html_url\":\"https://gitlink.org.cn/wanjia9506/test/wiki/test\",\"sub_url\":\"test\",\"last_commit\":{\"sha\":\"aca9df20a9c241ddf3862ba8203d5764a5a07829\",\"author\":{\"name\":\"wanjia9506\",\"email\":\"553039491@qq.com\",\"date\":\"2023-12-27T07:25:54Z\"},\"commiter\":{\"name\":\"wanjia9506\",\"email\":\"553039491@qq.com\",\"date\":\"2023-12-27T07:25:54Z\"},\"message\":\"Add 'test'\\n\"},\"content_base64\":\"5qyi6L+O5p2l5YiwV2lraQ==\",\"commit_count\":3,\"sidebar\":\"W1t0c3QxMjNdXQ==\",\"footer\":\"\"}\n"
}
```

> 401 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|[ResponseData](#schemaresponsedata)|
|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|none|Inline|
|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|none|Inline|
|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|none|Inline|
|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|none|Inline|

### 返回数据结构

状态码 **200**

*ResponseData*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» data|object|false|none||none|
|» message|string|false|none||none|

<a id="opIddeleteWikiUsingDELETE"></a>

## DELETE deleteWiki

DELETE /api/wiki/deleteWiki

> Body 请求参数

```json
{
  "owner": "wanjia9506",
  "repo": "test",
  "projectId": 1406620,
  "pageName": "123"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» owner|body|string| 否 | 仓库拥有者标识|none|
|» pageName|body|string| 否 | 当前页标题|none|
|» projectId|body|integer(int32)| 否 | gitlink项目id|none|
|» repo|body|string| 否 | 仓库标识|none|

> 返回示例

> 200 Response

```json
{
  "data": {},
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|[ResponseData](#schemaresponsedata)|
|204|[No Content](https://tools.ietf.org/html/rfc7231#section-6.3.5)|none|Inline|
|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|none|Inline|
|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|none|Inline|

### 返回数据结构

状态码 **200**

*ResponseData*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» data|object|false|none||none|
|» message|string|false|none||none|

<a id="opIdgetWikiUsingGET"></a>

## GET getWiki

GET /api/wiki/getWiki

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|query|string| 是 ||owner of the repo|
|pageName|query|string| 是 ||name of the wikipage|
|projectId|query|integer| 是 ||id of the project|
|repo|query|string| 是 ||name of the repo|

> 返回示例

> 200 Response

```json
{
  "data": {},
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|[ResponseData](#schemaresponsedata)|
|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|none|Inline|
|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|none|Inline|
|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|none|Inline|

### 返回数据结构

状态码 **200**

*ResponseData*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» data|object|false|none||none|
|» message|string|false|none||none|

<a id="opIdupdateWikiUsingPUT"></a>

## PUT updateWiki

PUT /api/wiki/updateWiki

> Body 请求参数

```json
{
  "content_base64": "string",
  "message": "string",
  "owner": "string",
  "pageName": "string",
  "projectId": 0,
  "repo": "string",
  "title": "string"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|body|body|object| 否 ||none|
|» content_base64|body|string| 否 |  wiki内容|none|
|» message|body|string¦null| 否 | 提交信息|none|
|» owner|body|string| 是 | 仓库拥有者标识|none|
|» pageName|body|string| 是 | 当前页标题|none|
|» projectId|body|integer(int32)| 是 | gitlink仓库id|none|
|» repo|body|string| 是 | 仓库标识|none|
|» title|body|string| 是 | 标题|none|

> 返回示例

> 200 Response

```json
{
  "data": {},
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|[ResponseData](#schemaresponsedata)|
|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|none|Inline|
|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|none|Inline|
|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|none|Inline|
|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|none|Inline|

### 返回数据结构

状态码 **200**

*ResponseData*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» data|object|false|none||none|
|» message|string|false|none||none|

<a id="opIdwikiPagesUsingGET"></a>

## GET wikiPages

GET /api/wiki/wikiPages

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|query|string| 是 ||owner of the repo|
|projectId|query|integer| 是 ||id of the project|
|repo|query|string| 是 ||name of the repo|

> 返回示例

> 200 Response

```json
{
  "data": {},
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|[ResponseData](#schemaresponsedata)|
|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|none|Inline|
|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|none|Inline|
|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|none|Inline|

### 返回数据结构

状态码 **200**

*ResponseData*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» data|object|false|none||none|
|» message|string|false|none||none|

# Wiki/wiki导入导出接口

<a id="opIduploadUsingPOST"></a>

## POST 上传文件

POST /api/wikiExport/uploadWiki/{owner}/{repoName}/{projectId}

> Body 请求参数

```yaml
multipartFile: ""

```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||owner of the repo|
|projectId|path|integer| 是 ||id of the project|
|repoName|path|string| 是 ||name of the repo|
|body|body|object| 否 ||none|
|» multipartFile|body|string(binary)| 否 ||multipartFile|

> 返回示例

> 200 Response

```json
{
  "data": {},
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|[ResponseData](#schemaresponsedata)|
|201|[Created](https://tools.ietf.org/html/rfc7231#section-6.3.2)|none|Inline|
|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|none|Inline|
|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|none|Inline|
|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|none|Inline|

### 返回数据结构

状态码 **200**

*ResponseData*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» data|object|false|none||none|
|» message|string|false|none||none|

<a id="opIdwikiExportToPdfUsingGET"></a>

## GET 导出Wiki-wrapper

GET /api/wikiExport/wikiExport-wrapper

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|query|string| 是 ||owner of the repo|
|projectId|query|integer| 是 ||id of the project|
|projectName|query|string| 是 ||name of the project|
|repoName|query|string| 是 ||name of the repo|
|type|query|string| 是 ||type of the file：pdf or markdown or html|

> 返回示例

> 200 Response

```json
{
  "data": {},
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|[ResponseData](#schemaresponsedata)|
|401|[Unauthorized](https://tools.ietf.org/html/rfc7235#section-3.1)|none|Inline|
|403|[Forbidden](https://tools.ietf.org/html/rfc7231#section-6.5.3)|none|Inline|
|404|[Not Found](https://tools.ietf.org/html/rfc7231#section-6.5.4)|none|Inline|

### 返回数据结构

状态码 **200**

*ResponseData*

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» data|object|false|none||none|
|» message|string|false|none||none|

# 流水线

## GET 流水线列表

GET /api/pm/pipelines.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|page|query|string| 否 ||none|
|limit|query|string| 否 ||none|
|owner_id|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "string"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## POST 运行流水线

POST /api/v1/{owner}/{repo}/actions/runs.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|ref|query|string| 否 ||none|
|workflow|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## GET 流水线执行记录列表

GET /api/v1/{owner}/{repo}/actions/runs.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|ref|query|string| 否 ||none|
|workflow|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## POST 图形化流水线保存

POST /api/v1/{owner}/{repo}/pipelines/save_yaml

> Body 请求参数

```json
{
  "id": 37,
  "pipeline_json": {
    "nodes": [
      {
        "position": {
          "x": 150,
          "y": 120
        },
        "size": {
          "width": 186,
          "height": 65
        },
        "view": "react-shape-view",
        "shape": "job",
        "ports": {
          "groups": {
            "top": {
              "position": {
                "name": "top",
                "args": {
                  "dx": 0
                }
              },
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            },
            "bottom": {
              "position": {
                "name": "bottom",
                "args": {
                  "dx": 0
                }
              },
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            },
            "left": {
              "position": "left",
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            },
            "right": {
              "position": "right",
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            }
          },
          "items": [
            {
              "id": "on-push-81a68a8-left",
              "group": "left"
            },
            {
              "id": "on-push-81a68a8-right",
              "group": "right"
            },
            {
              "id": "on-push-81a68a8-top",
              "group": "top"
            },
            {
              "id": "on-push-81a68a8-bottom",
              "group": "bottom"
            }
          ]
        },
        "id": "on-push-81a68a8",
        "data": {
          "id": "on-push-81a68a8",
          "label": "代码push事件",
          "name": "on-push",
          "full_name": "on-push",
          "description": "GitLink仓库push事件",
          "icon": "https://osredm.com/api/attachments/7fe3f4b4-0752-4b22-8ac0-1b0c72416724",
          "action_node_types_id": 3,
          "yaml": "",
          "sort_no": 0,
          "use_count": 0,
          "node_type": "start",
          "is_mutil_link": true,
          "link_type": "job",
          "inputs": [
            {
              "id": 6,
              "name": "branches",
              "input_type": "input",
              "description": "分支名称，多个分支英文逗号隔开，如'master,dev'",
              "is_required": true,
              "default_value": "master",
              "value": "master"
            },
            {
              "id": 7,
              "name": "paths-ignore",
              "input_type": "input",
              "description": "忽略文件，多个文件英文逗号隔开，如'**.md,**.yaml'",
              "is_required": false,
              "default_value": null,
              "value": null
            }
          ],
          "x": 566,
          "y": 454,
          "img": "https://osredm.com/api/attachments/7fe3f4b4-0752-4b22-8ac0-1b0c72416724",
          "branches": "master",
          "paths-ignore": null
        },
        "zIndex": 1
      },
      {
        "position": {
          "x": 420,
          "y": 120
        },
        "size": {
          "width": 186,
          "height": 65
        },
        "view": "react-shape-view",
        "shape": "job",
        "ports": {
          "groups": {
            "top": {
              "position": {
                "name": "top",
                "args": {
                  "dx": 0
                }
              },
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            },
            "bottom": {
              "position": {
                "name": "bottom",
                "args": {
                  "dx": 0
                }
              },
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            },
            "left": {
              "position": "left",
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            },
            "right": {
              "position": "right",
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            }
          },
          "items": [
            {
              "id": "job-18f4d4af-left",
              "group": "left"
            },
            {
              "id": "job-18f4d4af-right",
              "group": "right"
            },
            {
              "id": "job-18f4d4af-top",
              "group": "top"
            },
            {
              "id": "job-18f4d4af-bottom",
              "group": "bottom"
            }
          ]
        },
        "id": "job-18f4d4af",
        "data": {
          "id": 24,
          "label": "任务",
          "name": "job",
          "full_name": "",
          "description": "",
          "icon": "",
          "action_node_types_id": 7,
          "yaml": "",
          "sort_no": 0,
          "use_count": 0,
          "node_type": "job",
          "is_mutil_link": true,
          "link_type": "job,step",
          "inputs": [],
          "x": 900,
          "y": 461,
          "img": ""
        },
        "zIndex": 3
      },
      {
        "position": {
          "x": 431,
          "y": 306.625
        },
        "size": {
          "width": 166,
          "height": 51
        },
        "view": "react-shape-view",
        "shape": "step",
        "ports": {
          "groups": {
            "top": {
              "position": {
                "name": "top",
                "args": {
                  "dx": 0
                }
              },
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            },
            "bottom": {
              "position": {
                "name": "bottom",
                "args": {
                  "dx": 0
                }
              },
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            },
            "left": {
              "position": "left",
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            },
            "right": {
              "position": "right",
              "attrs": {
                "circle": {
                  "r": 5,
                  "magnet": true,
                  "strokeWidth": 1,
                  "fill": "#fff",
                  "stroke": "#85A5FF"
                }
              }
            }
          },
          "items": [
            {
              "id": "shell-992db95-left",
              "group": "left"
            },
            {
              "id": "shell-992db95-right",
              "group": "right"
            },
            {
              "id": "shell-992db95-top",
              "group": "top"
            },
            {
              "id": "shell-992db95-bottom",
              "group": "bottom"
            }
          ]
        },
        "id": "shell-992db95",
        "data": {
          "id": "shell-992db95",
          "label": "运行Shell脚本",
          "name": "shell",
          "full_name": "shell",
          "description": "",
          "icon": "https://osredm.com/api/attachments/91c6873b-a117-4771-a5ea-7f9e3f2d9a3a",
          "action_node_types_id": 4,
          "yaml": "",
          "sort_no": 0,
          "use_count": 0,
          "node_type": "step",
          "is_mutil_link": false,
          "link_type": "step",
          "inputs": [
            {
              "id": 3,
              "name": "run",
              "input_type": "input",
              "description": null,
              "is_required": false,
              "default_value": null,
              "value": "echo 111"
            }
          ],
          "x": 819,
          "y": 589,
          "img": "https://osredm.com/api/attachments/91c6873b-a117-4771-a5ea-7f9e3f2d9a3a",
          "run": "echo 111"
        },
        "zIndex": 2
      }
    ],
    "edges": [
      {
        "shape": "data-processing-curve",
        "inherit": "edge",
        "connector": {
          "name": "rounded",
          "args": {
            "radius": 10
          }
        },
        "router": {
          "name": "manhattan"
        },
        "attrs": {
          "line": {
            "strokeDasharray": "0"
          }
        },
        "id": "39159699-26b7-4db8-99c0-9088be560a22",
        "zIndex": -1,
        "source": {
          "cell": "on-push-81a68a8",
          "port": "on-push-81a68a8-right"
        },
        "target": {
          "cell": "job-18f4d4af",
          "port": "job-18f4d4af-left"
        }
      },
      {
        "shape": "data-processing-curve",
        "inherit": "edge",
        "connector": {
          "name": "rounded",
          "args": {
            "radius": 10
          }
        },
        "router": {
          "name": "manhattan"
        },
        "attrs": {
          "line": {
            "strokeWidth": 1,
            "strokeDasharray": "3"
          }
        },
        "id": "3c6f7387-74d5-4af1-a2f7-8520ed7b446e",
        "zIndex": -1,
        "source": {
          "cell": "job-18f4d4af",
          "port": "job-18f4d4af-bottom"
        },
        "target": {
          "cell": "shell-992db95",
          "port": "shell-992db95-top"
        }
      }
    ]
  }
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» id|body|string| 是 ||none|
|» pipeline_json|body|string| 是 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## DELETE 删除流水线

DELETE /api/v1/{owner}/{repo}/pipelines/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## GET 查看流水线详情

GET /api/v1/{owner}/{repo}/pipelines/{id}.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## POST 禁用流水线

POST /api/v1/{owner}/{repo}/actions/disable.json

> Body 请求参数

```json
{
  "id": 6,
  "workflow": "流水线上下文详情.yml"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» id|body|integer| 是 ||none|
|» workflow|body|string| 是 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## POST 启用流水线

POST /api/v1/{owner}/{repo}/actions/enable.json

> Body 请求参数

```json
{
  "id": 6,
  "workflow": "流水线上下文详情.yml"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» id|body|integer| 是 ||none|
|» workflow|body|string| 是 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## POST 查询流水线运行日志

POST /api/v1/{owner}/{repo}/actions/runs/{run_id}/jobs/0

> Body 请求参数

```json
{
  "id": "6",
  "index": "43",
  "job": 0,
  "log_cursors": [
    {
      "cursor": null,
      "expanded": true,
      "step": 1
    }
  ],
  "owner": "osredm",
  "repo": "osredm_help"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|run_id|path|string| 是 ||none|
|body|body|object| 否 ||none|
|» id|body|integer| 是 ||none|
|» index|body|string| 是 ||none|
|» job|body|string| 是 ||none|
|» log_cursors|body|object| 是 ||none|
|»» cursor|body|string| 是 ||none|
|»» expanded|body|string| 是 ||none|
|»» step|body|string| 是 ||none|
|» owner|body|string| 是 ||none|
|» repo|body|string| 是 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

## GET 获取流水线执行报告结果

GET /api/v1/{owner}/{repo}/pipelines/run_results.json

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|run_id|query|string| 否 ||none|

> 返回示例

> 200 Response

```json
{}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

# 模板

## GET 模板列表接口

GET /api/v1/yystopf/ceshi/project_templates

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|

> 返回示例

> 200 Response

```json
{
  "total_count": 2,
  "project_templates": [
    {
      "id": 1,
      "type": "ProjectTemplates::Issue",
      "name": "bug修复模板",
      "content": "## 问题描述\n[清晰简洁地描述Bug是什么]\n## 复现步骤\n1. [第一步]\n2. [第二步]\n3. [...]\n...\n## 期望行为\n[你期望发生什么]\n## 实际行为\n[实际发生了什么]\n## 环境信息\n- 操作系统：[如 macOS 12.3]\n- 浏览器/版本：[如 Chrome 101]\n- 项目版本/分支：[如 v1.2.0 或 main]\n## 附加信息\n[日志、截图、其他上下文]",
      "created_at": "2026-01-13 17:30:20",
      "updated_at": "2026-01-13 17:30:20"
    },
    {
      "id": 2,
      "type": "ProjectTemplates::Issue",
      "name": "功能请求模板",
      "content": "## 功能描述\n[你希望添加什么功能？为什么需要它？]\n## 解决方案\n[如果有，描述你希望的实现方式]\n## 替代方案\n[你考虑过的其他方案]\n## 影响范围\n[这个功能会影响哪些模块/用户？]\n## 补充说明\n[其他相关信息]",
      "created_at": "2026-01-13 17:30:20",
      "updated_at": "2026-01-13 17:30:20"
    }
  ]
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» total_count|integer|true|none||none|
|» project_templates|[object]|true|none||none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» content|string|true|none||none|
|»» created_at|string|true|none||none|
|»» updated_at|string|true|none||none|

## POST 创建模板

POST /api/v1/yystopf/ceshi/project_templates

> Body 请求参数

```json
{
  "type": "ProjectTemplates::Issue",
  "name": "测试issue模板1",
  "content": "内容"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|Cookie|header|string| 是 ||none|
|body|body|object| 否 ||none|
|» type|body|string| 是 ||none|
|» name|body|string| 是 ||none|
|» content|body|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## DELETE 删除模板

DELETE /api/v1/yystopf/ceshi/project_templates/5

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|Cookie|header|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## PUT 更新模板

PUT /api/v1/yystopf/ceshi/project_templates/5

> Body 请求参数

```json
{
  "type": "ProjectTemplates::Issue",
  "name": "测试issue模板1",
  "content": "内容1"
}
```

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|Cookie|header|string| 是 ||none|
|body|body|object| 否 ||none|
|» type|body|string| 是 ||none|
|» name|body|string| 是 ||none|
|» content|body|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "status": 0,
  "message": "success"
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» status|integer|true|none||none|
|» message|string|true|none||none|

## GET 模板详情接口 

GET /api/v1/{owner}/{repo}/project_templates/{id}

### 请求参数

|名称|位置|类型|必选|中文名|说明|
|---|---|---|---|---|---|
|autologin_trustie|cookie|string| 否 ||none|
|owner|path|string| 是 ||none|
|repo|path|string| 是 ||none|
|id|path|string| 是 ||none|

> 返回示例

> 200 Response

```json
{
  "project_template": {
    "id": 42,
    "type": "ProjectTemplates::Issue",
    "name": "功能请求模板",
    "content": "## 功能描述\n[你希望添加什么功能？为什么需要它？]\n## 解决方案\n[如果有，描述你希望的实现方式]\n## 替代方案\n[你考虑过的其他方案]\n## 影响范围\n[这个功能会影响哪些模块/用户？]\n## 补充说明\n[其他相关信息]",
    "created_at": "2026-01-22 11:15:04",
    "updated_at": "2026-01-22 11:15:04"
  }
}
```

### 返回结果

|状态码|状态码含义|说明|数据模型|
|---|---|---|---|
|200|[OK](https://tools.ietf.org/html/rfc7231#section-6.3.1)|none|Inline|

### 返回数据结构

状态码 **200**

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|» project_template|object|true|none||none|
|»» id|integer|true|none||none|
|»» type|string|true|none||none|
|»» name|string|true|none||none|
|»» content|string|true|none||none|
|»» created_at|string|true|none||none|
|»» updated_at|string|true|none||none|

# 数据模型

<h2 id="tocS_Login">Login</h2>

<a id="schemalogin"></a>
<a id="schema_Login"></a>
<a id="tocSlogin"></a>
<a id="tocslogin"></a>

```json
{
  "name": "string",
  "pwd": "string"
}

```

Login

### 属性

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|name|string|false|none||none|
|pwd|string|false|none||none|

<h2 id="tocS_ResponseData">ResponseData</h2>

<a id="schemaresponsedata"></a>
<a id="schema_ResponseData"></a>
<a id="tocSresponsedata"></a>
<a id="tocsresponsedata"></a>

```json
{
  "data": {},
  "message": "string"
}

```

ResponseData

### 属性

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|data|object|false|none||none|
|message|string|false|none||none|

<h2 id="tocS_WikiAllVo">WikiAllVo</h2>

<a id="schemawikiallvo"></a>
<a id="schema_WikiAllVo"></a>
<a id="tocSwikiallvo"></a>
<a id="tocswikiallvo"></a>

```json
{
  "content_base64": "string",
  "message": "string",
  "owner": "string",
  "pageName": "string",
  "projectId": 0,
  "repo": "string",
  "title": "string"
}

```

WikiAllVo

### 属性

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|content_base64|string|false|none||none|
|message|string|false|none||none|
|owner|string|false|none||none|
|pageName|string|false|none||none|
|projectId|integer(int32)|false|none||none|
|repo|string|false|none||none|
|title|string|false|none||none|

<h2 id="tocS_WikiDeleteVo">WikiDeleteVo</h2>

<a id="schemawikideletevo"></a>
<a id="schema_WikiDeleteVo"></a>
<a id="tocSwikideletevo"></a>
<a id="tocswikideletevo"></a>

```json
{
  "owner": "string",
  "pageName": "string",
  "projectId": 0,
  "repo": "string"
}

```

WikiDeleteVo

### 属性

|名称|类型|必选|约束|中文名|说明|
|---|---|---|---|---|---|
|owner|string|false|none||none|
|pageName|string|false|none||none|
|projectId|integer(int32)|false|none||none|
|repo|string|false|none||none|
---

# 补充接口（来自 Apifox）

> 以下接口仅在 Apifox 文档中出现，GitLink.md 中未收录。

## GET 获取疑修下评论或操作记录列表

GET /api/v1/{owner}/{repo}/issues/{index}/journals.json

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|owner|path|string| 是 |用户名|
|repo|path|string| 是 |仓库标识|
|index|path|string| 是 |Issue 序号|
|category|query|string| 否 |类型：all 所有 / comment 评论 / operate 操作记录|
|keyword|query|string| 否 |搜索关键词|
|sort_by|query|string| 否 |排序字段：created_on / updated_on|
|sort_direction|query|string| 否 |排序类型：asc 正序 / desc 倒序|
|page|query|integer| 否 |页码|
|limit|query|integer| 否 |每页条数|

### 返回数据结构

状态码 **200**

|名称|类型|必选|说明|
|---|---|---|---|
|» total_count|integer|true|分页总数|
|» journals|[object]|true|评论/操作记录列表|
|»» id|integer|true|评论 ID|
|»» is_journal_detail|boolean|true|是否为操作记录|
|»» notes|string|false|评论内容|
|»» created_on|string|true|创建时间|
|»» user|object|true|评论用户|

## PATCH 更新项目（基础信息）

PATCH /api/{owner}/{repo}.json

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|owner|path|string| 是 |用户名|
|repo|path|string| 是 |仓库标识|
|body|body|object| 否 ||
|» description|body|string| 否 |项目描述|
|» website|body|string| 否 |项目网站|
|» lesson_url|body|string| 否 |课程链接|
|» project_topic_names|body|array| 否 |项目标签|

### 返回数据结构

状态码 **200**

|名称|类型|必选|说明|
|---|---|---|---|
|» id|integer|true|项目 ID|
|» identifier|string|true|项目标识|
|» name|string|true|项目名称|
|» description|string|true|项目描述|

## PATCH 更新项目（完整）

PATCH /api/{owner}/{repo}.json

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|owner|path|string| 是 |用户名|
|repo|path|string| 是 |仓库标识|
|body|body|object| 否 ||
|» name|body|string| 是 |项目名称|
|» identifier|body|string| 是 |项目标识|
|» description|body|string| 否 |项目描述|
|» project_category_id|body|integer| 否 |项目分类 ID|
|» project_language_id|body|integer| 否 |项目语言 ID|
|» private|body|boolean| 否 |是否私有|
|» pr_view_admin|body|boolean| 否 |PR 仅管理员可见|

## POST OAuth2 用户登录（用户名密码模式）

POST /oauth/token

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|body|body|object| 否 ||
|» grant_type|body|string| 是 |鉴权类型（password）|
|» client_id|body|string| 是 |Client ID|
|» client_secret|body|string| 是 |Client Secret|
|» username|body|string| 是 |用户名|
|» password|body|string| 是 |密码|

> 返回示例

> 200 Response

```json
{
  "access_token": "13bfdecabe1f807f696686436659bf50a7c80052",
  "token_type": "Bearer",
  "expires_in": 604800,
  "refresh_token": "abc123...",
  "scope": "public",
  "created_at": 1711843200
}
```

### 返回数据结构

状态码 **200**

|名称|类型|必选|说明|
|---|---|---|---|
|» access_token|string|true|访问令牌|
|» token_type|string|true|令牌类型（Bearer）|
|» expires_in|integer|true|过期时间（秒），默认 604800（7天）|
|» refresh_token|string|true|刷新令牌|
|» scope|string|true|权限范围|
|» created_at|integer|true|创建时间戳|

## POST OAuth2 客户端模式登录

POST /oauth/token

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|body|body|object| 否 ||
|» grant_type|body|string| 是 |鉴权类型（client_credentials）|
|» client_id|body|string| 是 |Client ID|
|» client_secret|body|string| 是 |Client Secret|

### 返回数据结构

状态码 **200**

|名称|类型|必选|说明|
|---|---|---|---|
|» access_token|string|true|访问令牌|
|» token_type|string|true|令牌类型|
|» expires_in|integer|true|过期时间（秒）|
|» scope|string|true|权限范围|
|» created_at|integer|true|创建时间戳|

## POST OAuth2 刷新 Token

POST /oauth/token

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|body|body|object| 否 ||
|» grant_type|body|string| 是 |鉴权类型（refresh_token）|
|» refresh_token|body|string| 是 |刷新令牌|
|» client_id|body|string| 是 |Client ID|
|» client_secret|body|string| 是 |Client Secret|

### 返回数据结构

状态码 **200**

|名称|类型|必选|说明|
|---|---|---|---|
|» access_token|string|true|新的访问令牌|
|» token_type|string|true|令牌类型|
|» expires_in|integer|true|过期时间（秒）|
|» refresh_token|string|true|新的刷新令牌|
|» scope|string|true|权限范围|
|» created_at|integer|true|创建时间戳|

## POST 用户验证密码

POST /api/v1/{owner}/check_password.json

### 请求参数

|名称|位置|类型|必选|说明|
|---|---|---|---|---|
|owner|path|string| 是 |用户名|
|body|body|object| 否 ||
|» password|body|string| 是 |密码|

### 返回数据结构

状态码 **200**

|名称|类型|必选|说明|
|---|---|---|---|
|» status|integer|true|状态码|
|» message|string|true|消息|
