| @@ -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] | |||
| 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 | |||
| private | |||
| @@ -23,6 +23,7 @@ class ObRepositorySyncsController < ApplicationController | |||
| ob_repository_sync.name = project_name | |||
| ob_repository_sync.github_address = "#{params[:github_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.gitee_token = "#{params[:gitee_token]}" | |||
| 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) | |||
| if @gitea_pull_request[:status] == :success | |||
| @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('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)}" | |||
| @@ -112,6 +114,9 @@ class PullRequestsController < ApplicationController | |||
| end | |||
| end | |||
| reviewers = User.where(id: params[:reviewer_ids]) | |||
| @pull_request.reviewers = reviewers | |||
| if @issue.update_attributes(@issue_params) | |||
| if @pull_request.update_attributes(@local_params.compact) | |||
| gitea_pull = Gitea::PullRequest::UpdateService.call(@owner.login, @repository.identifier, | |||
| @@ -5,7 +5,7 @@ class ReviewsController < ApplicationController | |||
| def create | |||
| 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 | |||
| 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.created_at|string|审查创建的时间| | |||
| |last_review.reviewer |object|审查创建人| | |||
| |reviewers |array|指定审查用户标识数组| | |||
| |conflict_files |array|有冲突的文件| | |||
| > 返回的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" | |||
| } | |||
| }, | |||
| "reviewers": [ | |||
| "yystopf" | |||
| ], | |||
| "conflict_files": [] | |||
| } | |||
| ``` | |||
| @@ -497,10 +501,17 @@ await octokit.request('GET /api/v1/yystopf/ceshi_commit/pulls.json') | |||
| ### 请求参数: | |||
| 参数 | 必选 | 默认 | 类型 | 字段说明 | |||
| --------- | ------- | ------- | -------- | ---------- | |||
| |owner |是| |string |用户登录名 | | |||
| |repo |是| |string |项目标识identifier | | |||
| |owner |是| |string |用户登录名 | | |||
| |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"> | |||
| Success Data. | |||
| </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") | |||
| # reply_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 | |||
| # | |||
| @@ -24,9 +33,13 @@ | |||
| # | |||
| class Journal < ApplicationRecord | |||
| serialize :diff, JSON | |||
| alias_attribute :note, :notes | |||
| belongs_to :user | |||
| belongs_to :issue, foreign_key: :journalized_id, :touch => true, optional: 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 :attachments, as: :container, dependent: :destroy | |||
| @@ -34,6 +47,7 @@ class Journal < ApplicationRecord | |||
| scope :parent_journals, ->{where(parent_id: nil)} | |||
| scope :children_journals, lambda{|journal_id| where(parent_id: journal_id)} | |||
| enum state: {opened: 0, resolved: 1, disabled: 2} | |||
| def is_journal_detail? | |||
| 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 | |||
| 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 | |||
| 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] | |||
| @version_id = params[:version_id] | |||
| @reviewer_id = params[:reviewer_id] | |||
| @assign_user_id = params[:assign_user_id] | |||
| @sort_by = params[:sort_by] || 'created_at' | |||
| @sort_direction = params[:sort_direction] || 'desc' | |||
| 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(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(issues: {assigned_to_id: assign_user_id}) if assign_user_id.present? | |||
| q = pull_requests.ransack(title_or_body_cont: keyword) | |||
| 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? | |||
| ActiveRecord::Base.transaction do | |||
| create_review | |||
| create_journal | |||
| # create_journal | |||
| end | |||
| return @journal, @review | |||
| @review | |||
| # rescue | |||
| # raise Error, '服务器错误,请联系系统管理员!' | |||
| 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) | |||
| end | |||
| def create_journal | |||
| @journal = pull_request.journals.create!(notes: content, user_id: @current_user.id, review_id: @review.id) | |||
| end | |||
| end | |||
| @@ -13,7 +13,7 @@ class Api::V1::Users::Projects::ListService < ApplicationService | |||
| def initialize(observe_user, params, current_user=nil) | |||
| @observe_user = observe_user | |||
| @category = params[:category] || 'all' | |||
| @is_public = params[:is_public] | |||
| @is_public = ActiveModel::Type::Boolean.new.cast(params[:is_public]) | |||
| @project_type = params[:project_type] | |||
| @sort_by = params[:sort_by] || 'updated_on' | |||
| @sort_direction = params[:sort_direction] || 'desc' | |||
| @@ -15,6 +15,7 @@ class Issues::ListQueryService < ApplicationService | |||
| end_time = params[:due_date] | |||
| issues = all_issues.issue_index_includes | |||
| issues = issues.includes(pull_request: :reviewers) | |||
| if status_type.to_s == "2" #表示关闭中的 | |||
| issues = issues.where(status_id: 5) | |||
| elsif status_type.to_s == "1" | |||
| @@ -22,4 +22,5 @@ json.issue do | |||
| json.issue_tags issue.get_issue_tags | |||
| end | |||
| json.reviewers pull.reviewers.pluck(:login) | |||
| 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_identifier pr&.fork_project&.identifier | |||
| json.fork_project_user pr&.fork_project&.owner.try(:login) | |||
| json.reviewers pr&.reviewers.pluck(:login) | |||
| json.id issue.id | |||
| 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.files_count @pull_request.files_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_user pr&.fork_project&.owner.try(:login) | |||
| json.fork_project_user_name pr&.fork_project&.owner.try(:show_real_name) | |||
| json.reviewers pr.reviewers.pluck(:login) | |||
| json.id issue.id | |||
| json.name issue.subject | |||
| 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.mergeable @gitea_pull["mergeable"] | |||
| json.state @gitea_pull["state"] | |||
| json.reviewers @pull_request.reviewers.pluck(:login) | |||
| end | |||
| json.issue do | |||
| @@ -25,6 +25,7 @@ defaults format: :json do | |||
| get :diff | |||
| end | |||
| end | |||
| resources :journals, except: [:show, :edit] | |||
| resources :reviews, only: [:index, :create] | |||
| 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 | |||