新增:项目邀请链接增加时间限制,以及show_link接口新增

This commit is contained in:
yystopf 2022-06-20 10:16:39 +08:00
parent 1ebb6cb561
commit 45b7f70d9f
7 changed files with 371 additions and 63 deletions

View File

@ -1,24 +1,31 @@
class Projects::ProjectInviteLinksController < Projects::BaseController
before_action :require_manager!, except: [:redirect_link]
before_action :require_manager!, except: [:show_link, :redirect_link]
before_action :require_login
def current_link
@project_invite_link = ProjectInviteLink.find_by(user_id: current_user.id, project_id: @project.id)
@project_invite_link = ProjectInviteLink.build!(@project, current_user) unless @project_invite_link.present?
role = params[:role]
is_apply = params[:is_apply]
return render_error('请输入正确的参数!') unless role.present? && is_apply.present?
@project_invite_link = ProjectInviteLink.find_by(user_id: current_user.id, project_id: @project.id, role: role, is_apply: is_apply)
@project_invite_link = ProjectInviteLink.build!(@project, current_user, role, is_apply) unless @project_invite_link.present?
end
def generate_link
ActiveRecord::Base.transaction do
params_data = link_params.merge({user_id: current_user.id, project_id: @project.id})
puts params_data
Projects::ProjectInviteLinks::CreateForm.new(params_data).validate!
@project_invite_link = ProjectInviteLink.create!(params_data.merge(sign: ProjectInviteLink.random_hex_sign))
@project_invite_link = ProjectInviteLink.build!(project, user, params_data[:role], params_data[:is_apply])
end
rescue Exception => e
uid_logger_error(e.message)
tip_exception(e.message)
end
def show_link
@project_invite_link = ProjectInviteLink.find_by(sign: params[:invite_sign])
return render_not_found unless @project_invite_link.present?
end
def redirect_link
Projects::LinkJoinService.call(current_user, @project, params[:invite_sign])
render_ok

View File

@ -1,5 +1,5 @@
# Projects
## 获取项目邀请链接
## 获取项目邀请链接(项目管理员)
当前登录管理员用户获取项目邀请链接的接口第一次请求会默认生成role类型为developer和is_apply为true的链接
> 示例:
@ -15,6 +15,12 @@ await octokit.request('GET /api/yystopf/kellect/project_invite_links/current_lin
### HTTP 请求
`GET /api/:owner/:repo/project_invite_links/current_link.json`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|role |是| |string |项目权限reporter: 报告者, developer: 开发者manager管理员 |
|is_apply |是| |boolean |是否需要审核 |
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
@ -22,6 +28,7 @@ await octokit.request('GET /api/yystopf/kellect/project_invite_links/current_lin
|role |string |邀请角色|
|is_apply |boolean |是否需要审核 |
|sign |string |邀请标识(放在链接后面即可)|
|expired_at |string |链接过期时间|
|user.id |int |链接创建者的id |
|user.type |string |链接创建者的类型 |
|user.name |string |链接创建者的名称 |
@ -46,6 +53,7 @@ await octokit.request('GET /api/yystopf/kellect/project_invite_links/current_lin
"role": "developer",
"is_apply": false,
"sign": "6b6b454843c291d4e52e60853cb8ad9f",
"expired_at": "2022-06-23 10:08",
"user": {
"id": 2,
"type": "User",
@ -69,7 +77,7 @@ await octokit.request('GET /api/yystopf/kellect/project_invite_links/current_lin
}
}
```
## 生成项目邀请链接
## 生成项目邀请链接(项目管理员)
当前登录管理员用户生成的项目邀请链接可选role和is_apply参数
> 示例:
@ -108,6 +116,7 @@ await octokit.request('POST /api/yystopf/kellect/project_invite_links/generate_l
|role |string |邀请角色|
|is_apply |boolean |是否需要审核 |
|sign |string |邀请标识(放在链接后面即可)|
|expired_at |string |链接过期时间|
|user.id |int |链接创建者的id |
|user.type |string |链接创建者的类型 |
|user.name |string |链接创建者的名称 |
@ -132,6 +141,7 @@ await octokit.request('POST /api/yystopf/kellect/project_invite_links/generate_l
"role": "developer",
"is_apply": false,
"sign": "6b6b454843c291d4e52e60853cb8ad9f",
"expired_at": "2022-06-23 10:08",
"user": {
"id": 2,
"type": "User",
@ -156,7 +166,85 @@ await octokit.request('POST /api/yystopf/kellect/project_invite_links/generate_l
}
```
## 请求项目邀请链接
## 获取邀请链接信息(被邀请用户)
用户请求邀请链接时,通过该接口来获取链接的信息
> 示例:
```shell
curl -X GET http://localhost:3000/api/yystopf/kellect/project_invite_links/show_link.json?invite_sign=d612df03aad63760445c187bcf83f2e6
```
```javascript
await octokit.request('POST /api/yystopf/kellect/project_invite_links/show_link.json?invite_sign=d612df03aad63760445c187bcf83f2e6')
```
### HTTP 请求
`POST /api/:owner/:repo/project_invite_links/show_link.json?invite_sign=xxx`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明
--------- | ------- | ------- | -------- | ----------
|invite_sign |是| |string |项目邀请链接的标识 |
### 返回字段说明
参数 | 类型 | 字段说明
--------- | ----------- | -----------
|id |int |链接id |
|role |string |邀请角色|
|is_apply |boolean |是否需要审核 |
|sign |string |邀请标识(放在链接后面即可)|
|expired_at |string |链接过期时间|
|user.id |int |链接创建者的id |
|user.type |string |链接创建者的类型 |
|user.name |string |链接创建者的名称 |
|user.login |string |链接创建者的标识 |
|user.image_url |string |链接创建者头像 |
|project.id |int |链接关联项目的id |
|project.identifier |string |链接关联项目的标识 |
|project.name |string |链接关联项目的名称 |
|project.description |string |链接关联项目的描述 |
|project.is_public |bool |链接关联项目是否公开 |
|project.owner.id |bool |链接关联项目拥有者id |
|project.owner.type |string |链接关联项目拥有者类型 |
|project.owner.name |string |链接关联项目拥有者昵称 |
|project.owner.login |string |链接关联项目拥有者标识 |
|project.owner.image_url|string |链接关联项目拥有者头像 |
> 返回的JSON示例:
```json
{
"id": 7,
"role": "developer",
"is_apply": false,
"sign": "6b6b454843c291d4e52e60853cb8ad9f",
"expired_at": "2022-06-23 10:08",
"user": {
"id": 2,
"type": "User",
"name": "heh",
"login": "yystopf",
"image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
},
"project": {
"id": 474,
"identifier": "kellect",
"name": "kellect",
"description": null,
"is_public": true,
"owner": {
"id": 2,
"type": "User",
"name": "heh",
"login": "yystopf",
"image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
}
}
}
```
## 接受项目邀请链接(被邀请用户)
当前登录(非项目)用户加入项目的接口,如果项目链接不需要审核,请求成功后即加入项目,如果需要审核,那么会提交一个申请,需要项目管理员审核
> 示例:
@ -170,7 +258,7 @@ await octokit.request('POST /api/yystopf/kellect/project_invite_links/redirect_l
```
### HTTP 请求
`POST /api/:owner/:repo/project_invite_links/generate_link.json?invite_sign=xxx`
`POST /api/:owner/:repo/project_invite_links/redirect_link.json?invite_sign=xxx`
### 请求参数
参数 | 必选 | 默认 | 类型 | 字段说明

View File

@ -35,7 +35,8 @@ class ProjectInviteLink < ApplicationRecord
before_create :set_old_data_expired_at
def self.random_hex_sign
SecureRandom.hex
hex = (SecureRandom.hex(32))
return hex unless ProjectInviteLink.where(sign: hex).exists?
end
def self.build!(project, user, role="developer", is_apply=true)
@ -44,13 +45,14 @@ class ProjectInviteLink < ApplicationRecord
user_id: user&.id,
role: role,
is_apply: is_apply,
sign: random_hex_sign
sign: random_hex_sign,
expired_at: Time.now + 3.days
)
end
private
def set_old_data_expired_at
ProjectInviteLink.where(user_id: self.user_id, project_id: self.project).update_all(expired_at: Time.now)
ProjectInviteLink.where(user_id: self.user_id, project_id: self.project, role: self.role, is_apply: self.is_apply).update_all(expired_at: Time.now)
end

View File

@ -1,5 +1,5 @@
json.(project_invite_link, :id, :role, :is_apply, :sign)
json.expired_at format_time(project_invite_link&.expired_at)
json.user do
json.partial! "/users/user_simple", locals: {user: project_invite_link.user}
end

View File

@ -0,0 +1 @@
json.partial! 'detail', locals: { project_invite_link: @project_invite_link }

View File

@ -608,6 +608,7 @@ Rails.application.routes.draw do
collection do
get :current_link
post :generate_link
get :show_link
post :redirect_link
end
end

View File

@ -426,13 +426,16 @@
<a href="#projects" class="toc-h1 toc-link" data-title="Projects">Projects</a>
<ul class="toc-list-h2">
<li>
<a href="#086d81b60d" class="toc-h2 toc-link" data-title="获取项目邀请链接">获取项目邀请链接</a>
<a href="#b57112e753" class="toc-h2 toc-link" data-title="获取项目邀请链接(项目管理员)">获取项目邀请链接(项目管理员)</a>
</li>
<li>
<a href="#65f471580f" class="toc-h2 toc-link" data-title="生成项目邀请链接">生成项目邀请链接</a>
<a href="#099c15c88b" class="toc-h2 toc-link" data-title="生成项目邀请链接(项目管理员)">生成项目邀请链接(项目管理员)</a>
</li>
<li>
<a href="#316c752f05" class="toc-h2 toc-link" data-title="请求项目邀请链接">请求项目邀请链接</a>
<a href="#93da71d862" class="toc-h2 toc-link" data-title="获取邀请链接信息(被邀请用户)">获取邀请链接信息(被邀请用户)</a>
</li>
<li>
<a href="#1ba67175b6" class="toc-h2 toc-link" data-title="接受项目邀请链接(被邀请用户)">接受项目邀请链接(被邀请用户)</a>
</li>
<li>
<a href="#ac55469b06" class="toc-h2 toc-link" data-title="申请加入项目">申请加入项目</a>
@ -4399,7 +4402,7 @@ Success — a happy kitten is an authenticated kitten!
</span><span class="nl">"created_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2021-06-09 16:41"</span><span class="p">,</span><span class="w">
</span><span class="nl">"time_ago"</span><span class="p">:</span><span class="w"> </span><span class="s2">"7分钟前"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div><h1 id='projects'>Projects</h1><h2 id='086d81b60d'>获取项目邀请链接</h2>
</span></code></pre></div><h1 id='projects'>Projects</h1><h2 id='b57112e753'>获取项目邀请链接(项目管理员)</h2>
<p>当前登录管理员用户获取项目邀请链接的接口第一次请求会默认生成role类型为developer和is_apply为true的链接</p>
<blockquote>
@ -4409,6 +4412,31 @@ Success — a happy kitten is an authenticated kitten!
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/yystopf/kellect/project_invite_links/current_link.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http'>HTTP 请求</h3>
<p><code>GET /api/:owner/:repo/project_invite_links/current_link.json</code></p>
<h3 id='1f9ac54b15'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
<th>必选</th>
<th>默认</th>
<th>类型</th>
<th>字段说明</th>
</tr>
</thead><tbody>
<tr>
<td>role</td>
<td></td>
<td></td>
<td>string</td>
<td>项目权限reporter: 报告者, developer: 开发者manager管理员</td>
</tr>
<tr>
<td>is_apply</td>
<td></td>
<td></td>
<td>boolean</td>
<td>是否需要审核</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6'>返回字段说明</h3>
<table><thead>
<tr>
@ -4438,6 +4466,11 @@ Success — a happy kitten is an authenticated kitten!
<td>邀请标识(放在链接后面即可)</td>
</tr>
<tr>
<td>expired_at</td>
<td>string</td>
<td>链接过期时间</td>
</tr>
<tr>
<td>user.id</td>
<td>int</td>
<td>链接创建者的id</td>
@ -4522,6 +4555,7 @@ Success — a happy kitten is an authenticated kitten!
</span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"developer"</span><span class="p">,</span><span class="w">
</span><span class="nl">"is_apply"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
</span><span class="nl">"sign"</span><span class="p">:</span><span class="w"> </span><span class="s2">"6b6b454843c291d4e52e60853cb8ad9f"</span><span class="p">,</span><span class="w">
</span><span class="nl">"expired_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2022-06-23 10:08"</span><span class="p">,</span><span class="w">
</span><span class="nl">"user"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"User"</span><span class="p">,</span><span class="w">
@ -4544,7 +4578,7 @@ Success — a happy kitten is an authenticated kitten!
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div><h2 id='65f471580f'>生成项目邀请链接</h2>
</span></code></pre></div><h2 id='099c15c88b'>生成项目邀请链接(项目管理员)</h2>
<p>当前登录管理员用户生成的项目邀请链接可选role和is_apply参数</p>
<blockquote>
@ -4554,7 +4588,7 @@ Success — a happy kitten is an authenticated kitten!
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/yystopf/kellect/project_invite_links/generate_link.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-2'>HTTP 请求</h3>
<p><code>POST /api/:owner/:repo/project_invite_links/generate_link.json</code></p>
<h3 id='1f9ac54b15'>请求参数</h3>
<h3 id='1f9ac54b15-2'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -4616,6 +4650,11 @@ Success — a happy kitten is an authenticated kitten!
<td>邀请标识(放在链接后面即可)</td>
</tr>
<tr>
<td>expired_at</td>
<td>string</td>
<td>链接过期时间</td>
</tr>
<tr>
<td>user.id</td>
<td>int</td>
<td>链接创建者的id</td>
@ -4700,6 +4739,7 @@ Success — a happy kitten is an authenticated kitten!
</span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"developer"</span><span class="p">,</span><span class="w">
</span><span class="nl">"is_apply"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
</span><span class="nl">"sign"</span><span class="p">:</span><span class="w"> </span><span class="s2">"6b6b454843c291d4e52e60853cb8ad9f"</span><span class="p">,</span><span class="w">
</span><span class="nl">"expired_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2022-06-23 10:08"</span><span class="p">,</span><span class="w">
</span><span class="nl">"user"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"User"</span><span class="p">,</span><span class="w">
@ -4722,7 +4762,176 @@ Success — a happy kitten is an authenticated kitten!
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div><h2 id='316c752f05'>请求项目邀请链接</h2>
</span></code></pre></div><h2 id='93da71d862'>获取邀请链接信息(被邀请用户)</h2>
<p>用户请求邀请链接时,通过该接口来获取链接的信息</p>
<blockquote>
<p>示例:</p>
</blockquote>
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> GET http://localhost:3000/api/yystopf/kellect/project_invite_links/show_link.json?invite_sign<span class="o">=</span>d612df03aad63760445c187bcf83f2e6
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/yystopf/kellect/project_invite_links/show_link.json?invite_sign=d612df03aad63760445c187bcf83f2e6</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-3'>HTTP 请求</h3>
<p><code>POST /api/:owner/:repo/project_invite_links/show_link.json?invite_sign=xxx</code></p>
<h3 id='1f9ac54b15-3'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
<th>必选</th>
<th>默认</th>
<th>类型</th>
<th>字段说明</th>
</tr>
</thead><tbody>
<tr>
<td>invite_sign</td>
<td></td>
<td></td>
<td>string</td>
<td>项目邀请链接的标识</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-3'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
<th>类型</th>
<th>字段说明</th>
</tr>
</thead><tbody>
<tr>
<td>id</td>
<td>int</td>
<td>链接id</td>
</tr>
<tr>
<td>role</td>
<td>string</td>
<td>邀请角色</td>
</tr>
<tr>
<td>is_apply</td>
<td>boolean</td>
<td>是否需要审核</td>
</tr>
<tr>
<td>sign</td>
<td>string</td>
<td>邀请标识(放在链接后面即可)</td>
</tr>
<tr>
<td>expired_at</td>
<td>string</td>
<td>链接过期时间</td>
</tr>
<tr>
<td>user.id</td>
<td>int</td>
<td>链接创建者的id</td>
</tr>
<tr>
<td>user.type</td>
<td>string</td>
<td>链接创建者的类型</td>
</tr>
<tr>
<td>user.name</td>
<td>string</td>
<td>链接创建者的名称</td>
</tr>
<tr>
<td>user.login</td>
<td>string</td>
<td>链接创建者的标识</td>
</tr>
<tr>
<td>user.image_url</td>
<td>string</td>
<td>链接创建者头像</td>
</tr>
<tr>
<td>project.id</td>
<td>int</td>
<td>链接关联项目的id</td>
</tr>
<tr>
<td>project.identifier</td>
<td>string</td>
<td>链接关联项目的标识</td>
</tr>
<tr>
<td>project.name</td>
<td>string</td>
<td>链接关联项目的名称</td>
</tr>
<tr>
<td>project.description</td>
<td>string</td>
<td>链接关联项目的描述</td>
</tr>
<tr>
<td>project.is_public</td>
<td>bool</td>
<td>链接关联项目是否公开</td>
</tr>
<tr>
<td>project.owner.id</td>
<td>bool</td>
<td>链接关联项目拥有者id</td>
</tr>
<tr>
<td>project.owner.type</td>
<td>string</td>
<td>链接关联项目拥有者类型</td>
</tr>
<tr>
<td>project.owner.name</td>
<td>string</td>
<td>链接关联项目拥有者昵称</td>
</tr>
<tr>
<td>project.owner.login</td>
<td>string</td>
<td>链接关联项目拥有者标识</td>
</tr>
<tr>
<td>project.owner.image_url</td>
<td>string</td>
<td>链接关联项目拥有者头像</td>
</tr>
</tbody></table>
<blockquote>
<p>返回的JSON示例:</p>
</blockquote>
<div class="highlight"><pre class="highlight json tab-json"><code><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">7</span><span class="p">,</span><span class="w">
</span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"developer"</span><span class="p">,</span><span class="w">
</span><span class="nl">"is_apply"</span><span class="p">:</span><span class="w"> </span><span class="kc">false</span><span class="p">,</span><span class="w">
</span><span class="nl">"sign"</span><span class="p">:</span><span class="w"> </span><span class="s2">"6b6b454843c291d4e52e60853cb8ad9f"</span><span class="p">,</span><span class="w">
</span><span class="nl">"expired_at"</span><span class="p">:</span><span class="w"> </span><span class="s2">"2022-06-23 10:08"</span><span class="p">,</span><span class="w">
</span><span class="nl">"user"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"User"</span><span class="p">,</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"heh"</span><span class="p">,</span><span class="w">
</span><span class="nl">"login"</span><span class="p">:</span><span class="w"> </span><span class="s2">"yystopf"</span><span class="p">,</span><span class="w">
</span><span class="nl">"image_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"system/lets/letter_avatars/2/H/188_239_142/120.png"</span><span class="w">
</span><span class="p">},</span><span class="w">
</span><span class="nl">"project"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">474</span><span class="p">,</span><span class="w">
</span><span class="nl">"identifier"</span><span class="p">:</span><span class="w"> </span><span class="s2">"kellect"</span><span class="p">,</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"kellect"</span><span class="p">,</span><span class="w">
</span><span class="nl">"description"</span><span class="p">:</span><span class="w"> </span><span class="kc">null</span><span class="p">,</span><span class="w">
</span><span class="nl">"is_public"</span><span class="p">:</span><span class="w"> </span><span class="kc">true</span><span class="p">,</span><span class="w">
</span><span class="nl">"owner"</span><span class="p">:</span><span class="w"> </span><span class="p">{</span><span class="w">
</span><span class="nl">"id"</span><span class="p">:</span><span class="w"> </span><span class="mi">2</span><span class="p">,</span><span class="w">
</span><span class="nl">"type"</span><span class="p">:</span><span class="w"> </span><span class="s2">"User"</span><span class="p">,</span><span class="w">
</span><span class="nl">"name"</span><span class="p">:</span><span class="w"> </span><span class="s2">"heh"</span><span class="p">,</span><span class="w">
</span><span class="nl">"login"</span><span class="p">:</span><span class="w"> </span><span class="s2">"yystopf"</span><span class="p">,</span><span class="w">
</span><span class="nl">"image_url"</span><span class="p">:</span><span class="w"> </span><span class="s2">"system/lets/letter_avatars/2/H/188_239_142/120.png"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div><h2 id='1ba67175b6'>接受项目邀请链接(被邀请用户)</h2>
<p>当前登录(非项目)用户加入项目的接口,如果项目链接不需要审核,请求成功后即加入项目,如果需要审核,那么会提交一个申请,需要项目管理员审核</p>
<blockquote>
@ -4730,9 +4939,9 @@ Success — a happy kitten is an authenticated kitten!
</blockquote>
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> POST http://localhost:3000/api/yystopf/kellect/project_invite_links/redirect_link.json?invite_sign<span class="o">=</span>d612df03aad63760445c187bcf83f2e6
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/yystopf/kellect/project_invite_links/redirect_link.json?invite_sign=d612df03aad63760445c187bcf83f2e6</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-3'>HTTP 请求</h3>
<p><code>POST /api/:owner/:repo/project_invite_links/generate_link.json?invite_sign=xxx</code></p>
<h3 id='1f9ac54b15-2'>请求参数</h3>
</code></pre></div><h3 id='http-4'>HTTP 请求</h3>
<p><code>POST /api/:owner/:repo/project_invite_links/redirect_link.json?invite_sign=xxx</code></p>
<h3 id='1f9ac54b15-4'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -4766,9 +4975,9 @@ Success — a happy kitten is an authenticated kitten!
</blockquote>
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> POST http://localhost:3000/api/applied_projects.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/appliedr_projects.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-4'>HTTP 请求</h3>
</code></pre></div><h3 id='http-5'>HTTP 请求</h3>
<p><code>POST /api/applied_projects.json</code></p>
<h3 id='1f9ac54b15-3'>请求参数</h3>
<h3 id='1f9ac54b15-5'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -4803,7 +5012,7 @@ Success — a happy kitten is an authenticated kitten!
</span><span class="nl">"role"</span><span class="p">:</span><span class="w"> </span><span class="s2">"developer"</span><span class="w">
</span><span class="p">}</span><span class="w">
</span><span class="p">}</span><span class="w">
</span></code></pre></div><h3 id='b302a98fa6-3'>返回字段说明</h3>
</span></code></pre></div><h3 id='b302a98fa6-4'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -4944,9 +5153,9 @@ Success — a happy kitten is an authenticated kitten!
<span class="nt">-d</span> <span class="s2">"limit=5"</span> <span class="se">\</span>
http://localhost:3000/api/projects | jq
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/projects</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-5'>HTTP 请求</h3>
</code></pre></div><h3 id='http-6'>HTTP 请求</h3>
<p><code>GET api/projects</code></p>
<h3 id='1f9ac54b15-4'>请求参数</h3>
<h3 id='1f9ac54b15-6'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5013,7 +5222,7 @@ http://localhost:3000/api/projects | jq
<td>项目类型, 取值为common、mirror; common:开源托管项目, mirror:开源镜像项目</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-4'>返回字段说明</h3>
<h3 id='b302a98fa6-5'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5165,9 +5374,9 @@ Remember — a happy kitten is an authenticated kitten!
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> GET <span class="se">\</span>
http://localhost:3000/api/projects/recommend | jq
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/projects/recommend.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-6'>HTTP 请求</h3>
</code></pre></div><h3 id='http-7'>HTTP 请求</h3>
<p><code>GET api/projects/recommend</code></p>
<h3 id='b302a98fa6-5'>返回字段说明</h3>
<h3 id='b302a98fa6-6'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5301,9 +5510,9 @@ Remember — a happy kitten is an authenticated kitten!
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> GET <span class="se">\</span>
http://localhost:3000/api/yystopf/ceshi/menu_list | jq
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/yystopf/ceshi/menu_list</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-7'>HTTP 请求</h3>
</code></pre></div><h3 id='http-8'>HTTP 请求</h3>
<p><code>GET api/:owner/:repo/menu_list</code></p>
<h3 id='1f9ac54b15-5'>请求参数</h3>
<h3 id='1f9ac54b15-7'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5328,7 +5537,7 @@ http://localhost:3000/api/yystopf/ceshi/menu_list | jq
<td>项目标识identifier</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-6'>返回字段说明</h3>
<h3 id='b302a98fa6-7'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5369,9 +5578,9 @@ http://localhost:3000/api/yystopf/ceshi/menu_list | jq
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> GET <span class="se">\</span>
http://localhost:3000/api/jasder/forgeplus/about | jq
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/jasder/forgeplus/about</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-8'>HTTP 请求</h3>
</code></pre></div><h3 id='http-9'>HTTP 请求</h3>
<p><code>GET api/:owner/:repo/about</code></p>
<h3 id='1f9ac54b15-6'>请求参数</h3>
<h3 id='1f9ac54b15-8'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5396,7 +5605,7 @@ http://localhost:3000/api/jasder/forgeplus/about | jq
<td>项目标识identifier</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-7'>返回字段说明</h3>
<h3 id='b302a98fa6-8'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5442,7 +5651,7 @@ Remember — a happy kitten is an authenticated kitten!
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> GET <span class="se">\</span>
http://localhost:3000/api/yystopf/ceshi/project_units.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/yystopf/ceshi/project_units</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-9'>HTTP 请求</h3>
</code></pre></div><h3 id='http-10'>HTTP 请求</h3>
<p><code>GET /api/yystopf/ceshi/project_units</code></p>
<h3 id='7447e4874e'>返回字段说明:</h3>
<table><thead>
@ -5485,9 +5694,9 @@ http://localhost:3000/api/yystopf/ceshi/project_units.json
<span class="nt">-d</span> <span class="s2">"{ </span><span class="se">\"</span><span class="s2">unit_typs</span><span class="se">\"</span><span class="s2">: [</span><span class="se">\"</span><span class="s2">code</span><span class="se">\"</span><span class="s2">, </span><span class="se">\"</span><span class="s2">pulls</span><span class="se">\"</span><span class="s2">]}"</span> <span class="se">\</span>
http://localhost:3000/api/yystopf/ceshi/project_units.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/yystopf/ceshi/project_units</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-10'>HTTP 请求</h3>
</code></pre></div><h3 id='http-11'>HTTP 请求</h3>
<p><code>POST /api/yystopf/ceshi/project_units</code></p>
<h3 id='1f9ac54b15-7'>请求参数</h3>
<h3 id='1f9ac54b15-9'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5549,9 +5758,9 @@ http://localhost:3000/api/yystopf/ceshi/project_units.json
<span class="nt">-d</span> <span class="s2">"license_id=1"</span> <span class="se">\</span>
http://localhost:3000/api/projects.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/projects.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-11'>HTTP 请求</h3>
</code></pre></div><h3 id='http-12'>HTTP 请求</h3>
<p><code>POST api/projects</code></p>
<h3 id='1f9ac54b15-8'>请求参数</h3>
<h3 id='1f9ac54b15-10'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5625,7 +5834,7 @@ http://localhost:3000/api/projects.json
<td>项目是否私有, true为私有false: 公开,默认为公开</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-8'>返回字段说明</h3>
<h3 id='b302a98fa6-9'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5667,9 +5876,9 @@ http://localhost:3000/api/projects.json
<span class="nt">-d</span> <span class="s2">"project_language_id=2"</span> <span class="se">\</span>
http://localhost:3000/api/projects/migrate.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/projects/migrate.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-12'>HTTP 请求</h3>
</code></pre></div><h3 id='http-13'>HTTP 请求</h3>
<p><code>POST api/projects/migrate.json</code></p>
<h3 id='1f9ac54b15-9'>请求参数</h3>
<h3 id='1f9ac54b15-11'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5757,7 +5966,7 @@ http://localhost:3000/api/projects/migrate.json
<td>项目是否私有, true为私有false: 非私有,默认为公开</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-9'>返回字段说明</h3>
<h3 id='b302a98fa6-10'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5792,9 +6001,9 @@ http://localhost:3000/api/projects/migrate.json
</blockquote>
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> POST http://localhost:3000/api/repositories/1244/sync_mirror.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/repositories/1244/sync_mirror.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-13'>HTTP 请求</h3>
</code></pre></div><h3 id='http-14'>HTTP 请求</h3>
<p><code>POST api/repositories/:id/sync_mirror.json</code></p>
<h3 id='1f9ac54b15-10'>请求参数</h3>
<h3 id='1f9ac54b15-12'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5812,7 +6021,7 @@ http://localhost:3000/api/projects/migrate.json
<td>仓库id</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-10'>返回字段说明</h3>
<h3 id='b302a98fa6-11'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5847,9 +6056,9 @@ http://localhost:3000/api/projects/migrate.json
</blockquote>
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> POST http://localhost:3000/api/jasder/forgeplus/forks.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/jaser/jasder_test/forks.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-14'>HTTP 请求</h3>
</code></pre></div><h3 id='http-15'>HTTP 请求</h3>
<p><code>POST api/:owner/:repo/forks.json</code></p>
<h3 id='1f9ac54b15-11'>请求参数</h3>
<h3 id='1f9ac54b15-13'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5874,7 +6083,7 @@ http://localhost:3000/api/projects/migrate.json
<td>项目标识identifier</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-11'>返回字段说明</h3>
<h3 id='b302a98fa6-12'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5910,9 +6119,9 @@ http://localhost:3000/api/projects/migrate.json
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> GET <span class="se">\</span>
http://localhost:3000/api/ceshi1/ceshi_repo1/applied_transfer_projects/organizations.json | jq
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">GET /api/:owner/:repo/applied_transfer_projects/organizations</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-15'>HTTP 请求</h3>
</code></pre></div><h3 id='http-16'>HTTP 请求</h3>
<p><code>GET api/:owner/:repo/applied_transfer_projects/organizations</code></p>
<h3 id='1f9ac54b15-12'>请求参数</h3>
<h3 id='1f9ac54b15-14'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -5937,7 +6146,7 @@ http://localhost:3000/api/ceshi1/ceshi_repo1/applied_transfer_projects/organizat
<td>项目标识identifier</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-12'>返回字段说明</h3>
<h3 id='b302a98fa6-13'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -6004,9 +6213,9 @@ http://localhost:3000/api/ceshi1/ceshi_repo1/applied_transfer_projects/organizat
</blockquote>
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> POST http://localhost:3000/api/ceshi1/ceshi_repo1/applied_transfer_projects.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/:owner/:repo/applied_transfer_projects.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-16'>HTTP 请求</h3>
</code></pre></div><h3 id='http-17'>HTTP 请求</h3>
<p><code>POST /api/:owner/:repo/applied_transfer_projects.json</code></p>
<h3 id='1f9ac54b15-13'>请求参数</h3>
<h3 id='1f9ac54b15-15'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -6038,7 +6247,7 @@ http://localhost:3000/api/ceshi1/ceshi_repo1/applied_transfer_projects/organizat
<td>迁移对象标识</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-13'>返回字段说明</h3>
<h3 id='b302a98fa6-14'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -6208,9 +6417,9 @@ http://localhost:3000/api/ceshi1/ceshi_repo1/applied_transfer_projects/organizat
</blockquote>
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> POST http://localhost:3000/api/ceshi1/ceshi_repo1/applied_transfer_projects/cancel.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/:owner/:repo/applied_transfer_projects/cancel.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-17'>HTTP 请求</h3>
</code></pre></div><h3 id='http-18'>HTTP 请求</h3>
<p><code>POST /api/:owner/:repo/applied_transfer_projects/cancel.json</code></p>
<h3 id='1f9ac54b15-14'>请求参数</h3>
<h3 id='1f9ac54b15-16'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>
@ -6235,7 +6444,7 @@ http://localhost:3000/api/ceshi1/ceshi_repo1/applied_transfer_projects/organizat
<td>项目标识identifier</td>
</tr>
</tbody></table>
<h3 id='b302a98fa6-14'>返回字段说明</h3>
<h3 id='b302a98fa6-15'>返回字段说明</h3>
<table><thead>
<tr>
<th>参数</th>
@ -6405,9 +6614,9 @@ http://localhost:3000/api/ceshi1/ceshi_repo1/applied_transfer_projects/organizat
</blockquote>
<div class="highlight"><pre class="highlight shell tab-shell"><code>curl <span class="nt">-X</span> POST http://localhost:3000/api/ceshi1/ceshi_repo1/quit.json
</code></pre></div><div class="highlight"><pre class="highlight javascript tab-javascript"><code><span class="k">await</span> <span class="nx">octokit</span><span class="p">.</span><span class="nx">request</span><span class="p">(</span><span class="dl">'</span><span class="s1">POST /api/:owner/:repo/quit.json</span><span class="dl">'</span><span class="p">)</span>
</code></pre></div><h3 id='http-18'>HTTP 请求</h3>
</code></pre></div><h3 id='http-19'>HTTP 请求</h3>
<p><code>POST /api/:owner/:repo/quit.json</code></p>
<h3 id='1f9ac54b15-15'>请求参数</h3>
<h3 id='1f9ac54b15-17'>请求参数</h3>
<table><thead>
<tr>
<th>参数</th>