merge from develop
This commit is contained in:
commit
445ae6fbc3
|
@ -1,2 +0,0 @@
|
||||||
class Api::V1::Projects::Pulls::CommentsController < Api::V1::Projects::Pulls::BaseController
|
|
||||||
end
|
|
|
@ -0,0 +1,40 @@
|
||||||
|
class Api::V1::Projects::Pulls::JournalsController < Api::V1::Projects::Pulls::BaseController
|
||||||
|
|
||||||
|
def index
|
||||||
|
@journals = Api::V1::Projects::Pulls::Journals::ListService.call(@project, @pull_request, params, current_user)
|
||||||
|
@journals = kaminari_paginate(@journals)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create
|
||||||
|
@journal = Api::V1::Projects::Pulls::Journals::CreateService.call(@project, @pull_request, create_params, current_user)
|
||||||
|
end
|
||||||
|
|
||||||
|
before_action :find_journal, only: [:update, :destroy]
|
||||||
|
|
||||||
|
def update
|
||||||
|
@journal = Api::V1::Projects::Pulls::Journals::UpdateService.call(@project, @pull_request, @journal, update_params, current_user)
|
||||||
|
end
|
||||||
|
|
||||||
|
def destroy
|
||||||
|
if @journal.destroy
|
||||||
|
render_ok
|
||||||
|
else
|
||||||
|
render_error("删除评论失败!")
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def create_params
|
||||||
|
params.permit(:parent_id, :line_code, :note, :commit_id, :path, :type, :review_id, :diff => {})
|
||||||
|
end
|
||||||
|
|
||||||
|
def update_params
|
||||||
|
params.permit(:note, :commit_id, :state)
|
||||||
|
end
|
||||||
|
|
||||||
|
def find_journal
|
||||||
|
@journal = @pull_request.journals.find_by_id(params[:id])
|
||||||
|
return render_not_found unless @journal.present?
|
||||||
|
end
|
||||||
|
|
||||||
|
end
|
|
@ -8,7 +8,7 @@ class Api::V1::Projects::Pulls::ReviewsController < Api::V1::Projects::Pulls::Ba
|
||||||
before_action :require_reviewer, only: [:create]
|
before_action :require_reviewer, only: [:create]
|
||||||
|
|
||||||
def create
|
def create
|
||||||
@journal, @review = Api::V1::Projects::Pulls::Reviews::CreateService.call(@project, @pull_request, review_params, current_user)
|
@review = Api::V1::Projects::Pulls::Reviews::CreateService.call(@project, @pull_request, review_params, current_user)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -23,6 +23,7 @@ class ObRepositorySyncsController < ApplicationController
|
||||||
ob_repository_sync.name = project_name
|
ob_repository_sync.name = project_name
|
||||||
ob_repository_sync.github_address = "#{params[:github_address]}"
|
ob_repository_sync.github_address = "#{params[:github_address]}"
|
||||||
ob_repository_sync.gitee_address = "#{params[:gitee_address]}"
|
ob_repository_sync.gitee_address = "#{params[:gitee_address]}"
|
||||||
|
ob_repository_sync.gitlink_address = @project.repository.url
|
||||||
ob_repository_sync.github_token = "#{params[:github_token]}"
|
ob_repository_sync.github_token = "#{params[:github_token]}"
|
||||||
ob_repository_sync.gitee_token = "#{params[:gitee_token]}"
|
ob_repository_sync.gitee_token = "#{params[:gitee_token]}"
|
||||||
ob_repository_sync.sync_id = sync_id
|
ob_repository_sync.sync_id = sync_id
|
||||||
|
|
|
@ -67,6 +67,8 @@ class PullRequestsController < ApplicationController
|
||||||
@pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params)
|
@pull_request, @gitea_pull_request = PullRequests::CreateService.call(current_user, @owner, @project, params)
|
||||||
if @gitea_pull_request[:status] == :success
|
if @gitea_pull_request[:status] == :success
|
||||||
@pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"], @gitea_pull_request[:body]["id"])
|
@pull_request.bind_gitea_pull_request!(@gitea_pull_request[:body]["number"], @gitea_pull_request[:body]["id"])
|
||||||
|
reviewers = User.where(id: params[:reviewer_ids])
|
||||||
|
@pull_request.reviewers = reviewers
|
||||||
SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @pull_request&.id) if Site.has_notice_menu?
|
SendTemplateMessageJob.perform_later('PullRequestAssigned', current_user.id, @pull_request&.id) if Site.has_notice_menu?
|
||||||
SendTemplateMessageJob.perform_later('ProjectPullRequest', current_user.id, @pull_request&.id) if Site.has_notice_menu?
|
SendTemplateMessageJob.perform_later('ProjectPullRequest', current_user.id, @pull_request&.id) if Site.has_notice_menu?
|
||||||
Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}"
|
Rails.logger.info "[ATME] maybe to at such users: #{@atme_receivers.pluck(:login)}"
|
||||||
|
@ -112,6 +114,9 @@ class PullRequestsController < ApplicationController
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
reviewers = User.where(id: params[:reviewer_ids])
|
||||||
|
@pull_request.reviewers = reviewers
|
||||||
|
|
||||||
if @issue.update_attributes(@issue_params)
|
if @issue.update_attributes(@issue_params)
|
||||||
if @pull_request.update_attributes(@local_params.compact)
|
if @pull_request.update_attributes(@local_params.compact)
|
||||||
gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier,
|
gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier,
|
||||||
|
|
|
@ -5,7 +5,7 @@ class ReviewsController < ApplicationController
|
||||||
|
|
||||||
def create
|
def create
|
||||||
return render_forbidden('您不是审查人员,无法进行审查!') if current_user&.id != @pull_request.issue.assigned_to_id
|
return render_forbidden('您不是审查人员,无法进行审查!') if current_user&.id != @pull_request.issue.assigned_to_id
|
||||||
@journal, @review = Api::V1::Projects::Pulls::Reviews::CreateService.call(@project, @pull_request, review_params, current_user)
|
@review = Api::V1::Projects::Pulls::Reviews::CreateService.call(@project, @pull_request, review_params, current_user)
|
||||||
end
|
end
|
||||||
|
|
||||||
private
|
private
|
||||||
|
|
|
@ -60,6 +60,7 @@ await octokit.request('GET /api/v1/yystopf/ceshi_commit/pulls/1.json')
|
||||||
|last_review.status |string|最后一个审查的状态,common: 一般审查, approved: 通过, rejected: 拒绝通过|
|
|last_review.status |string|最后一个审查的状态,common: 一般审查, approved: 通过, rejected: 拒绝通过|
|
||||||
|last_review.created_at|string|审查创建的时间|
|
|last_review.created_at|string|审查创建的时间|
|
||||||
|last_review.reviewer |object|审查创建人|
|
|last_review.reviewer |object|审查创建人|
|
||||||
|
|reviewers |array|指定审查用户标识数组|
|
||||||
|conflict_files |array|有冲突的文件|
|
|conflict_files |array|有冲突的文件|
|
||||||
|
|
||||||
> 返回的JSON示例:
|
> 返回的JSON示例:
|
||||||
|
@ -118,6 +119,9 @@ await octokit.request('GET /api/v1/yystopf/ceshi_commit/pulls/1.json')
|
||||||
"image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
|
"image_url": "system/lets/letter_avatars/2/H/188_239_142/120.png"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"reviewers": [
|
||||||
|
"yystopf"
|
||||||
|
],
|
||||||
"conflict_files": []
|
"conflict_files": []
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
@ -497,10 +501,17 @@ await octokit.request('GET /api/v1/yystopf/ceshi_commit/pulls.json')
|
||||||
### 请求参数:
|
### 请求参数:
|
||||||
参数 | 必选 | 默认 | 类型 | 字段说明
|
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||||
--------- | ------- | ------- | -------- | ----------
|
--------- | ------- | ------- | -------- | ----------
|
||||||
|owner |是| |string |用户登录名 |
|
|owner |是| |string |用户登录名 |
|
||||||
|repo |是| |string |项目标识identifier |
|
|repo |是| |string |项目标识identifier |
|
||||||
|
|keyword |否| |string |搜索关键词|
|
||||||
|
|status |否| | int | 合并请求类型 0: 开启的, 1: 合并的 2: 关闭的,不传则为全部的 |
|
||||||
|
|priority_id |否| | int | 优先级ID |
|
||||||
|
|issue_tag_id |否| |int|标记ID|
|
||||||
|
|version_id |否| |int|里程碑ID|
|
||||||
|
|reviewer_id |否| |int| 审查人员ID|
|
||||||
|
|assign_user_id |否| |int| 指派人员ID|
|
||||||
|
|sort_by |否| created_at |string| 排序字段,created_at: 创建时间, updated_at: 更新时间|
|
||||||
|
|sort_direction |否| desc |string| 排序类型 desc: 倒序 asc: 正序|
|
||||||
### 返回字段说明:
|
### 返回字段说明:
|
||||||
参数 | 类型 | 字段说明
|
参数 | 类型 | 字段说明
|
||||||
--------- | ----------- | -----------
|
--------- | ----------- | -----------
|
||||||
|
@ -586,6 +597,100 @@ await octokit.request('GET /api/v1/yystopf/ceshi_commit/pulls.json')
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 创建一个合并请求
|
||||||
|
为仓库创建一个合并请求
|
||||||
|
|
||||||
|
> 示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl -X POST \
|
||||||
|
http://localhost:3000/api/yystopf/ceshi/pulls.json
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
await octokit.request('POST /api/yystopf/ceshi/pulls.json')
|
||||||
|
```
|
||||||
|
|
||||||
|
### HTTP 请求
|
||||||
|
`POST /api/:owner/:repo/pulls.json`
|
||||||
|
|
||||||
|
### 请求参数:
|
||||||
|
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||||
|
--------- | ------- | ------- | -------- | ----------
|
||||||
|
|owner |是| | string |用户登录名 |
|
||||||
|
|repo |是| | string |项目标识identifier |
|
||||||
|
|title |是| | string |合并请求标题|
|
||||||
|
|body |否| | string |合并请求内容|
|
||||||
|
|base |是| | string |目标分支|
|
||||||
|
|head |是| | string |源分支|
|
||||||
|
|is_original |是| | bool |是否为fork仓库发来的合并请求|
|
||||||
|
|fork_project_id |否| | integer|fork仓库ID|
|
||||||
|
|reviewer_ids |否| | array |审查人员id数组|
|
||||||
|
|assigned_to_id |否| | integer|指派人员ID|
|
||||||
|
|fixed_version_id |否| | integer|里程碑ID|
|
||||||
|
|issue_tag_ids |否| | array |标记ID数组|
|
||||||
|
|priority_id |否| | integer|优先级ID|
|
||||||
|
|receivers_login |否| | array |@人员的login|
|
||||||
|
|
||||||
|
> 请求的JSON示例:
|
||||||
|
|
||||||
|
```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": []
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 返回的JSON示例:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 0,
|
||||||
|
"message": "响应成功",
|
||||||
|
"pull_request_id": 169,
|
||||||
|
"pull_request_number": 6,
|
||||||
|
"pull_request_status": 0,
|
||||||
|
"pull_request_head": "new_branch_1",
|
||||||
|
"pull_request_base": "master",
|
||||||
|
"pull_request_staus": "open",
|
||||||
|
"is_original": false,
|
||||||
|
"fork_project_id": null,
|
||||||
|
"fork_project_identifier": null,
|
||||||
|
"fork_project_user": null,
|
||||||
|
"reviewers": [
|
||||||
|
"yystopf"
|
||||||
|
],
|
||||||
|
"id": 266,
|
||||||
|
"name": "324",
|
||||||
|
"pr_time": "1分钟前",
|
||||||
|
"assign_user_name": "heh",
|
||||||
|
"assign_user_login": "yystopf",
|
||||||
|
"author_name": "heh",
|
||||||
|
"author_login": "yystopf",
|
||||||
|
"avatar_url": "system/lets/letter_avatars/2/H/188_239_142/120.png",
|
||||||
|
"priority": "正常",
|
||||||
|
"version": null,
|
||||||
|
"journals_count": 0,
|
||||||
|
"issue_tags": null
|
||||||
|
}
|
||||||
|
```
|
||||||
|
<aside class="success">
|
||||||
|
Success Data.
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
|
||||||
## 获取合并请求版本列表
|
## 获取合并请求版本列表
|
||||||
获取合并请求版本列表
|
获取合并请求版本列表
|
||||||
|
|
||||||
|
@ -901,6 +1006,108 @@ await octokit.request('GET /api/v1/yystopf/ceshi_commit/pulls/3/versions/33/diff
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## 获取合并请求审查列表
|
||||||
|
获取合并请求版本审查列表
|
||||||
|
|
||||||
|
> 示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl -X GET http://localhost:3000/api/v1/yystopf/ceshi_commit/pulls/3/reviews.json
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
await octokit.request('GET /api/v1/yystopf/ceshi_commit/pulls/3/reviews.json')
|
||||||
|
```
|
||||||
|
|
||||||
|
### HTTP 请求
|
||||||
|
`GET /api/v1/:owner/:repo/pulls/:index/reviews.json`
|
||||||
|
|
||||||
|
### 请求参数:
|
||||||
|
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||||
|
--------- | ------- | ------- | -------- | ----------
|
||||||
|
|owner |是| |string |用户登录名 |
|
||||||
|
|repo |是| |string |项目标识identifier |
|
||||||
|
|index |是| | int |合并请求序号|
|
||||||
|
|
||||||
|
### 返回字段说明:
|
||||||
|
参数 | 类型 | 字段说明
|
||||||
|
--------- | ----------- | -----------
|
||||||
|
|total_count |int |审查总数|
|
||||||
|
|reviews.reviewer |object |审查者 |
|
||||||
|
|reviews.pull_request.id |integer|合并请求ID|
|
||||||
|
|reviews.pull_request.title |string|合并请求标题|
|
||||||
|
|reviews.pull_request.body |string|合并请求内容|
|
||||||
|
|reviews.pull_request.head |string|合并请求源分支|
|
||||||
|
|reviews.pull_request.base |string|合并请求目标分支|
|
||||||
|
|reviews.pull_request.is_original |string|合并请求是否从fork仓库所来|
|
||||||
|
|reviews.pull_request.fork_project.id |int|fork仓库的id|
|
||||||
|
|reviews.pull_request.fork_project.identifier|string|fork仓库的标识|
|
||||||
|
|reviews.pull_request.fork_project.login |string|fork仓库拥有者的标识|
|
||||||
|
|reviews.pull_request.index |string|合并请求的序号|
|
||||||
|
|reviews.pull_request.status |string|合并请求的状态,open: 打开的, merged: 合并的, closed: 关闭的|
|
||||||
|
|reviews.pull_request.issue.id |integer|合并请求下疑修的ID|
|
||||||
|
|reviews.pull_request.issue.author |object|合并请求以及疑修的创建着|
|
||||||
|
|reviews.pull_request.issue.priority |string|疑修的优先级|
|
||||||
|
|reviews.pull_request.issue.version |string|疑修的里程碑|
|
||||||
|
|reviews.pull_request.issue.journals_count|integer|普通评论数量|
|
||||||
|
|reviews.pull_request.issue.issue_tags |array|所属标记|
|
||||||
|
|reviews.pull_request.journals_count |integer|审查评论数量|
|
||||||
|
|reviews.id |integer|审查ID|
|
||||||
|
|reviews.commit_id |string|审查的commit ID|
|
||||||
|
|reviews.content |string|审查的内容|
|
||||||
|
|reviews.status |string|审查类型,common: 普通, approved: 通过,rejected: 拒绝通过|
|
||||||
|
|reviews.created_at |string|审查创建时间|
|
||||||
|
|
||||||
|
> 返回的JSON示例:
|
||||||
|
|
||||||
|
```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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
## 为合并请求创建一个审查
|
## 为合并请求创建一个审查
|
||||||
合并请求创建一个审查
|
合并请求创建一个审查
|
||||||
|
|
||||||
|
@ -1010,3 +1217,484 @@ await octokit.request('POST /api/v1/yystopf/ceshi/pulls/1/reviews.json')
|
||||||
<aside class="success">
|
<aside class="success">
|
||||||
Success Data.
|
Success Data.
|
||||||
</aside>
|
</aside>
|
||||||
|
|
||||||
|
|
||||||
|
## 获取合并请求评论列表
|
||||||
|
获取合并请求版本评论列表
|
||||||
|
|
||||||
|
> 示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl -X GET http://localhost:3000/api/v1/yystopf/ceshi_commit/pulls/3/journals.json
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
await octokit.request('GET /api/v1/yystopf/ceshi_commit/pulls/3/journals.json')
|
||||||
|
```
|
||||||
|
|
||||||
|
### HTTP 请求
|
||||||
|
`GET /api/v1/:owner/:repo/pulls/:index/journals.json`
|
||||||
|
|
||||||
|
### 请求参数:
|
||||||
|
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||||
|
--------- | ------- | ------- | -------- | ----------
|
||||||
|
|owner |是| |string |用户登录名 |
|
||||||
|
|repo |是| |string |项目标识identifier |
|
||||||
|
|index |是| | int |合并请求序号|
|
||||||
|
|keyword |否| |string |搜索关键词|
|
||||||
|
|review_id |否| |integer|审查ID|
|
||||||
|
|need_respond |否| |bool |是否需要回应|
|
||||||
|
|state |否| |string |状态, opened: 开启的, resolved: 已解决的, disabled: 无效的|
|
||||||
|
|parent_id |否| |integer|父评论ID|
|
||||||
|
|sort_by |否|created_on|string |排序字段 created_on: 创建时间, updated_on: 更新时间|
|
||||||
|
|sort_direction |否|asc |string |排序类型 desc: 倒序, asc: 正序|
|
||||||
|
|
||||||
|
### 返回字段说明:
|
||||||
|
参数 | 类型 | 字段说明
|
||||||
|
--------- | ----------- | -----------
|
||||||
|
|total_count |int |评论总数|
|
||||||
|
|journals.id |int |评论ID|
|
||||||
|
|journals.notes |string |评论内容|
|
||||||
|
|journals.commit_id |string |CommitID|
|
||||||
|
|journals.line_code |string |评论行数|
|
||||||
|
|journals.path |string |评论文件路径|
|
||||||
|
|journals.diff |object |评论文件diff内容|
|
||||||
|
|journals.need_respond |bool |评论是否要回应|
|
||||||
|
|journals.state |string |评论状态,opened: 开启的, resolved: 已解决的, disabled: 无效的 |
|
||||||
|
|journals.parent_id |int |父评论ID|
|
||||||
|
|journals.user |object |评论创建者|
|
||||||
|
|journals.review |object |评论所属评审|
|
||||||
|
|journals.resolveer |object |评论解决者|
|
||||||
|
|journals.resolve_at |int |评论解决时间|
|
||||||
|
|journals.created_at |int |评论创建时间|
|
||||||
|
|journals.updated_at |int |评论更新时间|
|
||||||
|
|
||||||
|
> 返回的JSON示例:
|
||||||
|
|
||||||
|
```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"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
## 创建一个合并请求评论
|
||||||
|
为仓库创建一个合并请求的评论
|
||||||
|
|
||||||
|
> 示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl -X POST \
|
||||||
|
http://localhost:3000/api/v1/yystopf/ceshi/pulls/1/journals.json
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
await octokit.request('POST /api/v1/yystopf/ceshi/pulls/1/journals.json')
|
||||||
|
```
|
||||||
|
|
||||||
|
### HTTP 请求
|
||||||
|
`POST /api/v1/:owner/:repo/pulls/:index/journals.json`
|
||||||
|
|
||||||
|
### 请求参数:
|
||||||
|
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||||
|
--------- | ------- | ------- | -------- | ----------
|
||||||
|
|owner |是| | string |用户登录名 |
|
||||||
|
|repo |是| | string |项目标识identifier |
|
||||||
|
|index |是| | integer|合并请求序号|
|
||||||
|
|type |是| | string |评论类型 comment: 普通, problem: 需要回应的评论|
|
||||||
|
|note |否| | string |评论内容|
|
||||||
|
|review_id |是| | string |审查ID|
|
||||||
|
|line_code |否| | string |行号|
|
||||||
|
|commit_id |否| | bool |commitID|
|
||||||
|
|path |否| | integer|文件路径|
|
||||||
|
|parent_id |否| | integer|父评论ID|
|
||||||
|
|diff |否| | array |文件diff内容|
|
||||||
|
|
||||||
|
> 请求的JSON示例:
|
||||||
|
|
||||||
|
```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
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 返回的JSON示例:
|
||||||
|
|
||||||
|
```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"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
<aside class="success">
|
||||||
|
Success Data.
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
## 修改一个合并请求评论
|
||||||
|
修改一个仓库合并请求的评论
|
||||||
|
|
||||||
|
> 示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl -X PATCH \
|
||||||
|
http://localhost:3000/api/v1/yystopf/ceshi/pulls/1/journals/200.json
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
await octokit.request('PATCH /api/v1/yystopf/ceshi/pulls/1/journals/200.json')
|
||||||
|
```
|
||||||
|
|
||||||
|
### HTTP 请求
|
||||||
|
`PATCH /api/v1/:owner/:repo/pulls/:index/journals/:id.json`
|
||||||
|
|
||||||
|
### 请求参数:
|
||||||
|
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||||
|
--------- | ------- | ------- | -------- | ----------
|
||||||
|
|owner |是| | string |用户登录名 |
|
||||||
|
|repo |是| | string |项目标识identifier |
|
||||||
|
|index |是| | integer|合并请求序号|
|
||||||
|
|id |是| | integer|评论ID|
|
||||||
|
|note |是| | string |评论内容|
|
||||||
|
|commit_id |是| | string |commitID|
|
||||||
|
|state |是| | string |评论状态, opened: 开启的, resolved: 已解决的, disabled: 无效的|
|
||||||
|
|
||||||
|
> 请求的JSON示例:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"note": "测试评论",
|
||||||
|
"commit_id": "70eede447ccc01c1902260fd377af5d90be28e0d",
|
||||||
|
"state": "resolved"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
> 返回的JSON示例:
|
||||||
|
|
||||||
|
```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"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
<aside class="success">
|
||||||
|
Success Data.
|
||||||
|
</aside>
|
||||||
|
|
||||||
|
## 删除合并请求的一个评论
|
||||||
|
删除合并请求的一个评论
|
||||||
|
|
||||||
|
> 示例:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
curl -X DELETE \
|
||||||
|
http://localhost:3000/api/v1/yystopf/ceshi/pulls/1/journals/200.json
|
||||||
|
```
|
||||||
|
|
||||||
|
```javascript
|
||||||
|
await octokit.request('DELETE /api/v1/yystopf/ceshi/pulls/1/journals/200.json')
|
||||||
|
```
|
||||||
|
|
||||||
|
### HTTP 请求
|
||||||
|
`DELETE /api/v1/:owner/:repo/pulls/:index/journals/:id.json`
|
||||||
|
|
||||||
|
### 请求参数:
|
||||||
|
参数 | 必选 | 默认 | 类型 | 字段说明
|
||||||
|
--------- | ------- | ------- | -------- | ----------
|
||||||
|
|owner |是| | string |用户登录名 |
|
||||||
|
|repo |是| | string |项目标识identifier |
|
||||||
|
|index |是| | integer|合并请求序号|
|
||||||
|
|id |是| | integer|评论ID |
|
||||||
|
|
||||||
|
### 返回字段说明:
|
||||||
|
|
||||||
|
> 返回的JSON示例:
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"status": 0,
|
||||||
|
"message": "success"
|
||||||
|
}
|
||||||
|
```
|
||||||
|
<aside class="success">
|
||||||
|
Success Data.
|
||||||
|
</aside>
|
||||||
|
|
|
@ -13,6 +13,15 @@
|
||||||
# comments_count :integer default("0")
|
# comments_count :integer default("0")
|
||||||
# reply_id :integer
|
# reply_id :integer
|
||||||
# review_id :integer
|
# review_id :integer
|
||||||
|
# commit_id :string(255)
|
||||||
|
# diff :text(4294967295)
|
||||||
|
# line_code :string(255)
|
||||||
|
# path :string(255)
|
||||||
|
# state :integer default("0")
|
||||||
|
# resolve_at :datetime
|
||||||
|
# resolveer_id :integer
|
||||||
|
# need_respond :boolean default("0")
|
||||||
|
# updated_on :datetime
|
||||||
#
|
#
|
||||||
# Indexes
|
# Indexes
|
||||||
#
|
#
|
||||||
|
@ -24,9 +33,13 @@
|
||||||
#
|
#
|
||||||
|
|
||||||
class Journal < ApplicationRecord
|
class Journal < ApplicationRecord
|
||||||
|
serialize :diff, JSON
|
||||||
|
alias_attribute :note, :notes
|
||||||
belongs_to :user
|
belongs_to :user
|
||||||
belongs_to :issue, foreign_key: :journalized_id, :touch => true, optional: true
|
belongs_to :issue, foreign_key: :journalized_id, :touch => true, optional: true
|
||||||
belongs_to :journalized, polymorphic: true
|
belongs_to :journalized, polymorphic: true
|
||||||
|
belongs_to :review, optional: true
|
||||||
|
belongs_to :resolveer, class_name: 'User', foreign_key: :resolveer_id, optional: true
|
||||||
has_many :journal_details, :dependent => :delete_all
|
has_many :journal_details, :dependent => :delete_all
|
||||||
has_many :attachments, as: :container, dependent: :destroy
|
has_many :attachments, as: :container, dependent: :destroy
|
||||||
|
|
||||||
|
@ -34,6 +47,7 @@ class Journal < ApplicationRecord
|
||||||
scope :parent_journals, ->{where(parent_id: nil)}
|
scope :parent_journals, ->{where(parent_id: nil)}
|
||||||
scope :children_journals, lambda{|journal_id| where(parent_id: journal_id)}
|
scope :children_journals, lambda{|journal_id| where(parent_id: journal_id)}
|
||||||
|
|
||||||
|
enum state: {opened: 0, resolved: 1, disabled: 2}
|
||||||
|
|
||||||
def is_journal_detail?
|
def is_journal_detail?
|
||||||
self.notes.blank? && self.journal_details.present?
|
self.notes.blank? && self.journal_details.present?
|
||||||
|
|
|
@ -0,0 +1,48 @@
|
||||||
|
class Api::V1::Projects::Pulls::Journals::CreateService < ApplicationService
|
||||||
|
include ActiveModel::Model
|
||||||
|
|
||||||
|
attr_reader :project, :pull_request, :issue, :parent_id, :line_code, :note, :commit_id, :path, :type, :diff, :review_id, :user
|
||||||
|
attr_accessor :journal
|
||||||
|
|
||||||
|
validates :type, inclusion: {in: %w(comment problem), message: '请输入正确的Type'}
|
||||||
|
|
||||||
|
def initialize(project, pull_request, params, user)
|
||||||
|
@project = project
|
||||||
|
@pull_request = pull_request
|
||||||
|
@issue = pull_request&.issue
|
||||||
|
@parent_id = params[:parent_id]
|
||||||
|
@line_code = params[:line_code]
|
||||||
|
@note = params[:note]
|
||||||
|
@commit_id = params[:commit_id]
|
||||||
|
@path = params[:path]
|
||||||
|
@type = params[:type]
|
||||||
|
@diff = params[:diff]
|
||||||
|
@review_id = params[:review_id]
|
||||||
|
@user = user
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
raise Error, errors.full_messages.join(", ") unless valid?
|
||||||
|
check_review_is_exists
|
||||||
|
if type == 'problem'
|
||||||
|
create_problem_journal
|
||||||
|
else
|
||||||
|
create_comment_journal
|
||||||
|
end
|
||||||
|
|
||||||
|
journal
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def create_comment_journal
|
||||||
|
@journal = pull_request.journals.create!(user_id: user&.id, notes: note, parent_id: parent_id, review_id: review_id, commit_id: commit_id, diff: diff, line_code: line_code, path: path)
|
||||||
|
end
|
||||||
|
|
||||||
|
def check_review_is_exists
|
||||||
|
raise Error, '合并请求审查不存在!' unless @pull_request.reviews.exists?(review_id)
|
||||||
|
end
|
||||||
|
|
||||||
|
def create_problem_journal
|
||||||
|
@journal = pull_request.journals.create!(user_id: user&.id, notes: note, parent_id: parent_id, review_id: review_id, commit_id: commit_id, diff: diff, line_code: line_code, path: path, need_respond: true)
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,51 @@
|
||||||
|
class Api::V1::Projects::Pulls::Journals::ListService < ApplicationService
|
||||||
|
include ActiveModel::Model
|
||||||
|
|
||||||
|
attr_reader :project, :pull_request, :keyword, :review_id, :need_respond, :state, :parent_id, :sort_by, :sort_direction, :user
|
||||||
|
attr_accessor :queried_journals
|
||||||
|
|
||||||
|
validates :sort_by, inclusion: {in: Journal.column_names, message: '请输入正确的SortBy'}
|
||||||
|
validates :sort_direction, inclusion: {in: %w(asc desc), message: '请输入正确的SortDirection'}
|
||||||
|
validates :need_respond, inclusion: {in: [true, false], message: '请输入正确的NeedRespond'}, allow_nil: true
|
||||||
|
validates :state, inclusion: {in: %w(opened resolved disabled)}, allow_nil: true
|
||||||
|
|
||||||
|
def initialize(project, pull_request, params, user)
|
||||||
|
@project = project
|
||||||
|
@pull_request = pull_request
|
||||||
|
@keyword = params[:keyword]
|
||||||
|
@review_id = params[:review_id]
|
||||||
|
@need_respond = ActiveModel::Type::Boolean.new.cast(params[:need_respond])
|
||||||
|
@state = params[:state]
|
||||||
|
@parent_id = params[:parent_id]
|
||||||
|
@sort_by = params[:sort_by] || 'created_on'
|
||||||
|
@sort_direction = params[:sort_direction] || 'asc'
|
||||||
|
@user = user
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
raise Error, errors.full_messages.join(",") unless valid?
|
||||||
|
journal_query_data
|
||||||
|
|
||||||
|
queried_journals
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def journal_query_data
|
||||||
|
journals = @pull_request.journals
|
||||||
|
if parent_id.present?
|
||||||
|
journals = journals.where(parent_id: parent_id)
|
||||||
|
else
|
||||||
|
journals = journals.parent_journals
|
||||||
|
end
|
||||||
|
|
||||||
|
journals = journals.where(review_id: review_id) if review_id.present?
|
||||||
|
journals = journals.where(need_respond: need_respond) if need_respond.present?
|
||||||
|
journals = journals.where(state: state) if state.present?
|
||||||
|
|
||||||
|
q = journals.ransack(notes_cont: keyword)
|
||||||
|
scope = q.result.includes(:user, :resolveer, review: [:reviewer, pull_request: :issue])
|
||||||
|
scope = scope.order("journals.#{sort_by} #{sort_direction}")
|
||||||
|
|
||||||
|
@queried_journals = scope
|
||||||
|
end
|
||||||
|
end
|
|
@ -0,0 +1,38 @@
|
||||||
|
class Api::V1::Projects::Pulls::Journals::UpdateService < ApplicationService
|
||||||
|
include ActiveModel::Model
|
||||||
|
|
||||||
|
attr_reader :project, :pull_request, :journal, :note, :commit_id, :state, :user
|
||||||
|
attr_accessor :updated_journal
|
||||||
|
|
||||||
|
validates :state, inclusion: {in: %w(opened resolved disabled)}
|
||||||
|
|
||||||
|
def initialize(project, pull_request, journal, params, user)
|
||||||
|
@project = project
|
||||||
|
@pull_request = pull_request
|
||||||
|
@journal = journal
|
||||||
|
@note = params[:note]
|
||||||
|
@commit_id = params[:commit_id]
|
||||||
|
@state = params[:state]
|
||||||
|
@user = user
|
||||||
|
end
|
||||||
|
|
||||||
|
def call
|
||||||
|
raise Error, errors.full_messages.join(", ") unless valid?
|
||||||
|
|
||||||
|
update_journal
|
||||||
|
|
||||||
|
updated_journal
|
||||||
|
end
|
||||||
|
|
||||||
|
private
|
||||||
|
def update_journal
|
||||||
|
journal.attributes = {notes: note, commit_id: commit_id, state: state}
|
||||||
|
if state == 'resolved'
|
||||||
|
journal.resolve_at = Time.now
|
||||||
|
journal.resolveer_id = user.id
|
||||||
|
end
|
||||||
|
return Error, '保存评论失败!' unless journal.save
|
||||||
|
|
||||||
|
@updated_journal = journal.reload
|
||||||
|
end
|
||||||
|
end
|
|
@ -1,7 +1,7 @@
|
||||||
class Api::V1::Projects::Pulls::ListService < ApplicationService
|
class Api::V1::Projects::Pulls::ListService < ApplicationService
|
||||||
include ActiveModel::Model
|
include ActiveModel::Model
|
||||||
|
|
||||||
attr_reader :project, :keyword, :status, :priority_id, :issue_tag_id, :version_id, :reviewer_id, :sort_by, :sort_direction
|
attr_reader :project, :keyword, :status, :priority_id, :issue_tag_id, :version_id, :reviewer_id, :assign_user_id, :sort_by, :sort_direction
|
||||||
attr_accessor :queried_pull_requests
|
attr_accessor :queried_pull_requests
|
||||||
|
|
||||||
validates :status, inclusion: {in: [0, 1, 2], message: "请输入正确的Status"}, allow_nil: true
|
validates :status, inclusion: {in: [0, 1, 2], message: "请输入正确的Status"}, allow_nil: true
|
||||||
|
@ -16,6 +16,7 @@ class Api::V1::Projects::Pulls::ListService < ApplicationService
|
||||||
@issue_tag_id = params[:issue_tag_id]
|
@issue_tag_id = params[:issue_tag_id]
|
||||||
@version_id = params[:version_id]
|
@version_id = params[:version_id]
|
||||||
@reviewer_id = params[:reviewer_id]
|
@reviewer_id = params[:reviewer_id]
|
||||||
|
@assign_user_id = params[:assign_user_id]
|
||||||
@sort_by = params[:sort_by] || 'created_at'
|
@sort_by = params[:sort_by] || 'created_at'
|
||||||
@sort_direction = params[:sort_direction] || 'desc'
|
@sort_direction = params[:sort_direction] || 'desc'
|
||||||
end
|
end
|
||||||
|
@ -36,6 +37,7 @@ class Api::V1::Projects::Pulls::ListService < ApplicationService
|
||||||
pull_requests = pull_requests.where(issue_tags: {id: issue_tag_id}) if issue_tag_id.present?
|
pull_requests = pull_requests.where(issue_tags: {id: issue_tag_id}) if issue_tag_id.present?
|
||||||
pull_requests = pull_requests.where(issues: {fixed_version_id: version_id}) if version_id.present?
|
pull_requests = pull_requests.where(issues: {fixed_version_id: version_id}) if version_id.present?
|
||||||
pull_requests = pull_requests.where(users: {id: reviewer_id}) if reviewer_id.present?
|
pull_requests = pull_requests.where(users: {id: reviewer_id}) if reviewer_id.present?
|
||||||
|
pull_requests = pull_requests.where(issues: {assigned_to_id: assign_user_id}) if assign_user_id.present?
|
||||||
|
|
||||||
q = pull_requests.ransack(title_or_body_cont: keyword)
|
q = pull_requests.ransack(title_or_body_cont: keyword)
|
||||||
scope = q.result.includes(:fork_project, :journals, :reviews, :reviewers, issue: [:journals, :priority, :version, :issue_tags])
|
scope = q.result.includes(:fork_project, :journals, :reviews, :reviewers, issue: [:journals, :priority, :version, :issue_tags])
|
||||||
|
|
|
@ -20,10 +20,10 @@ class Api::V1::Projects::Pulls::Reviews::CreateService < ApplicationService
|
||||||
raise Error, errors.full_messages.join(", ") unless valid?
|
raise Error, errors.full_messages.join(", ") unless valid?
|
||||||
ActiveRecord::Base.transaction do
|
ActiveRecord::Base.transaction do
|
||||||
create_review
|
create_review
|
||||||
create_journal
|
# create_journal
|
||||||
end
|
end
|
||||||
|
|
||||||
return @journal, @review
|
@review
|
||||||
# rescue
|
# rescue
|
||||||
# raise Error, '服务器错误,请联系系统管理员!'
|
# raise Error, '服务器错误,请联系系统管理员!'
|
||||||
end
|
end
|
||||||
|
@ -33,8 +33,5 @@ class Api::V1::Projects::Pulls::Reviews::CreateService < ApplicationService
|
||||||
@review = pull_request.reviews.create!(status: status, content: content, commit_id: commit_id, reviewer_id: @current_user.id)
|
@review = pull_request.reviews.create!(status: status, content: content, commit_id: commit_id, reviewer_id: @current_user.id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def create_journal
|
|
||||||
@journal = pull_request.journals.create!(notes: content, user_id: @current_user.id, review_id: @review.id)
|
|
||||||
end
|
|
||||||
|
|
||||||
end
|
end
|
|
@ -13,7 +13,7 @@ class Api::V1::Users::Projects::ListService < ApplicationService
|
||||||
def initialize(observe_user, params, current_user=nil)
|
def initialize(observe_user, params, current_user=nil)
|
||||||
@observe_user = observe_user
|
@observe_user = observe_user
|
||||||
@category = params[:category] || 'all'
|
@category = params[:category] || 'all'
|
||||||
@is_public = params[:is_public]
|
@is_public = ActiveModel::Type::Boolean.new.cast(params[:is_public])
|
||||||
@project_type = params[:project_type]
|
@project_type = params[:project_type]
|
||||||
@sort_by = params[:sort_by] || 'updated_on'
|
@sort_by = params[:sort_by] || 'updated_on'
|
||||||
@sort_direction = params[:sort_direction] || 'desc'
|
@sort_direction = params[:sort_direction] || 'desc'
|
||||||
|
|
|
@ -15,6 +15,7 @@ class Issues::ListQueryService < ApplicationService
|
||||||
end_time = params[:due_date]
|
end_time = params[:due_date]
|
||||||
|
|
||||||
issues = all_issues.issue_index_includes
|
issues = all_issues.issue_index_includes
|
||||||
|
issues = issues.includes(pull_request: :reviewers)
|
||||||
if status_type.to_s == "2" #表示关闭中的
|
if status_type.to_s == "2" #表示关闭中的
|
||||||
issues = issues.where(status_id: 5)
|
issues = issues.where(status_id: 5)
|
||||||
elsif status_type.to_s == "1"
|
elsif status_type.to_s == "1"
|
||||||
|
|
|
@ -22,4 +22,5 @@ json.issue do
|
||||||
json.issue_tags issue.get_issue_tags
|
json.issue_tags issue.get_issue_tags
|
||||||
end
|
end
|
||||||
|
|
||||||
|
json.reviewers pull.reviewers.pluck(:login)
|
||||||
json.journals_count pull.journals.count
|
json.journals_count pull.journals.count
|
|
@ -0,0 +1,21 @@
|
||||||
|
json.(journal, :id, :note, :commit_id, :line_code, :path, :diff, :need_respond, :state, :parent_id)
|
||||||
|
json.user do
|
||||||
|
json.partial! 'api/v1/users/simple_user', user: journal.user
|
||||||
|
end
|
||||||
|
json.review do
|
||||||
|
if journal.review.present?
|
||||||
|
json.partial! 'api/v1/projects/pulls/reviews/simple_detail', review: journal.review
|
||||||
|
else
|
||||||
|
json.nil!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
json.resolveer do
|
||||||
|
if journal.resolveer.present?
|
||||||
|
json.partial! 'api/v1/users/simple_user', user: journal.resolveer
|
||||||
|
else
|
||||||
|
json.nil!
|
||||||
|
end
|
||||||
|
end
|
||||||
|
json.resolve_at format_time(journal.resolve_at)
|
||||||
|
json.created_at format_time(journal.created_on)
|
||||||
|
json.updated_at format_time(journal.updated_on)
|
|
@ -0,0 +1 @@
|
||||||
|
json.partial! 'api/v1/projects/pulls/journals/simple_detail', journal: @journal
|
|
@ -0,0 +1,4 @@
|
||||||
|
json.total_count @journals.total_count
|
||||||
|
json.journals @journals.each do |journal|
|
||||||
|
json.partial! 'api/v1/projects/pulls/journals/simple_detail', journal: journal
|
||||||
|
end
|
|
@ -0,0 +1 @@
|
||||||
|
json.partial! 'api/v1/projects/pulls/journals/simple_detail', journal: @journal
|
|
@ -0,0 +1,8 @@
|
||||||
|
json.reviewer do
|
||||||
|
json.partial! "api/v1/users/simple_user", user: review.reviewer
|
||||||
|
end
|
||||||
|
json.pull_request do
|
||||||
|
json.partial! "api/v1/projects/pulls/simple_detail", pull: review.pull_request
|
||||||
|
end
|
||||||
|
json.(review, :id, :commit_id, :content, :status)
|
||||||
|
json.created_at format_time(review.created_at)
|
|
@ -0,0 +1,4 @@
|
||||||
|
json.total_count @reviews.total_count
|
||||||
|
json.reviews @reviews.each do |review|
|
||||||
|
json.partial! 'api/v1/projects/pulls/reviews/simple_detail', review: review
|
||||||
|
end
|
|
@ -9,7 +9,7 @@ json.is_original pr.is_original
|
||||||
json.fork_project_id pr&.fork_project_id
|
json.fork_project_id pr&.fork_project_id
|
||||||
json.fork_project_identifier pr&.fork_project&.identifier
|
json.fork_project_identifier pr&.fork_project&.identifier
|
||||||
json.fork_project_user pr&.fork_project&.owner.try(:login)
|
json.fork_project_user pr&.fork_project&.owner.try(:login)
|
||||||
|
json.reviewers pr&.reviewers.pluck(:login)
|
||||||
|
|
||||||
json.id issue.id
|
json.id issue.id
|
||||||
json.name issue.subject
|
json.name issue.subject
|
||||||
|
|
|
@ -12,3 +12,4 @@ json.issue_tag_ids @issue&.issue_tags_value&.split(",")
|
||||||
json.commits_count @pull_request.commits_count
|
json.commits_count @pull_request.commits_count
|
||||||
json.files_count @pull_request.files_count
|
json.files_count @pull_request.files_count
|
||||||
json.comments_count @pull_request.comments_count
|
json.comments_count @pull_request.comments_count
|
||||||
|
json.reviewers @pull_request.reviewers.pluck(:login)
|
|
@ -24,7 +24,8 @@ json.issues do
|
||||||
json.fork_project_identifier pr&.fork_project&.identifier
|
json.fork_project_identifier pr&.fork_project&.identifier
|
||||||
json.fork_project_user pr&.fork_project&.owner.try(:login)
|
json.fork_project_user pr&.fork_project&.owner.try(:login)
|
||||||
json.fork_project_user_name pr&.fork_project&.owner.try(:show_real_name)
|
json.fork_project_user_name pr&.fork_project&.owner.try(:show_real_name)
|
||||||
|
json.reviewers pr.reviewers.pluck(:login)
|
||||||
|
|
||||||
json.id issue.id
|
json.id issue.id
|
||||||
json.name issue.subject
|
json.name issue.subject
|
||||||
json.pr_time time_from_now(pr.status == 1 ? pr.updated_at : issue.updated_on)
|
json.pr_time time_from_now(pr.status == 1 ? pr.updated_at : issue.updated_on)
|
||||||
|
|
|
@ -30,6 +30,7 @@ json.pull_request do
|
||||||
json.create_user @pull_request&.user&.login
|
json.create_user @pull_request&.user&.login
|
||||||
json.mergeable @gitea_pull["mergeable"]
|
json.mergeable @gitea_pull["mergeable"]
|
||||||
json.state @gitea_pull["state"]
|
json.state @gitea_pull["state"]
|
||||||
|
json.reviewers @pull_request.reviewers.pluck(:login)
|
||||||
end
|
end
|
||||||
|
|
||||||
json.issue do
|
json.issue do
|
||||||
|
|
|
@ -25,6 +25,7 @@ defaults format: :json do
|
||||||
get :diff
|
get :diff
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
resources :journals, except: [:show, :edit]
|
||||||
resources :reviews, only: [:index, :create]
|
resources :reviews, only: [:index, :create]
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,13 @@
|
||||||
|
class AddLineCodeToJournals < ActiveRecord::Migration[5.2]
|
||||||
|
def change
|
||||||
|
add_column :journals, :commit_id, :string
|
||||||
|
add_column :journals, :diff, :text, :limit => 4294967295
|
||||||
|
add_column :journals, :line_code, :string
|
||||||
|
add_column :journals, :path, :string
|
||||||
|
add_column :journals, :state, :integer, default: 0
|
||||||
|
add_column :journals, :resolve_at, :datetime
|
||||||
|
add_column :journals, :resolveer_id, :integer, index: true
|
||||||
|
add_column :journals, :need_respond, :bool, default: false
|
||||||
|
add_column :journals, :updated_on, :datetime, index: true
|
||||||
|
end
|
||||||
|
end
|
1247
public/docs/api.html
1247
public/docs/api.html
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue