diff --git a/app/controllers/api/v1/projects/pulls/comments_controller.rb b/app/controllers/api/v1/projects/pulls/comments_controller.rb deleted file mode 100644 index 8622c3190..000000000 --- a/app/controllers/api/v1/projects/pulls/comments_controller.rb +++ /dev/null @@ -1,2 +0,0 @@ -class Api::V1::Projects::Pulls::CommentsController < Api::V1::Projects::Pulls::BaseController -end \ No newline at end of file diff --git a/app/controllers/api/v1/projects/pulls/journals_controller.rb b/app/controllers/api/v1/projects/pulls/journals_controller.rb new file mode 100644 index 000000000..76fa30c9d --- /dev/null +++ b/app/controllers/api/v1/projects/pulls/journals_controller.rb @@ -0,0 +1,39 @@ +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 = Journal.find_by_id(params[:id]) + end + +end \ No newline at end of file diff --git a/app/controllers/api/v1/projects/pulls/reviews_controller.rb b/app/controllers/api/v1/projects/pulls/reviews_controller.rb index 523137a86..039a6c4df 100644 --- a/app/controllers/api/v1/projects/pulls/reviews_controller.rb +++ b/app/controllers/api/v1/projects/pulls/reviews_controller.rb @@ -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 diff --git a/app/controllers/reviews_controller.rb b/app/controllers/reviews_controller.rb index e12016904..b5fedfae0 100644 --- a/app/controllers/reviews_controller.rb +++ b/app/controllers/reviews_controller.rb @@ -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 diff --git a/app/models/journal.rb b/app/models/journal.rb index 19fdce1c9..48721bfd2 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -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,12 @@ # class Journal < ApplicationRecord + serialize :diff, JSON 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 +46,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? diff --git a/app/services/api/v1/projects/pulls/journals/create_service.rb b/app/services/api/v1/projects/pulls/journals/create_service.rb new file mode 100644 index 000000000..45b5ec030 --- /dev/null +++ b/app/services/api/v1/projects/pulls/journals/create_service.rb @@ -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 \ No newline at end of file diff --git a/app/services/api/v1/projects/pulls/journals/list_service.rb b/app/services/api/v1/projects/pulls/journals/list_service.rb new file mode 100644 index 000000000..dd69ead08 --- /dev/null +++ b/app/services/api/v1/projects/pulls/journals/list_service.rb @@ -0,0 +1,45 @@ +class Api::V1::Projects::Pulls::Journals::ListService < ApplicationService + include ActiveModel::Model + + attr_reader :project, :pull_request, :keyword, :review_id, :need_respond, :state, :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] + @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.parent_journals + + 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(:review) + scope = scope.order("journals.#{sort_by} #{sort_direction}") + + @queried_journals = scope + end +end \ No newline at end of file diff --git a/app/services/api/v1/projects/pulls/journals/update_service.rb b/app/services/api/v1/projects/pulls/journals/update_service.rb new file mode 100644 index 000000000..fec4c7ff8 --- /dev/null +++ b/app/services/api/v1/projects/pulls/journals/update_service.rb @@ -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 \ No newline at end of file diff --git a/app/services/api/v1/projects/pulls/reviews/create_service.rb b/app/services/api/v1/projects/pulls/reviews/create_service.rb index bef944870..1c45d9cf2 100644 --- a/app/services/api/v1/projects/pulls/reviews/create_service.rb +++ b/app/services/api/v1/projects/pulls/reviews/create_service.rb @@ -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 \ No newline at end of file diff --git a/app/services/api/v1/users/projects/list_service.rb b/app/services/api/v1/users/projects/list_service.rb index 9a095c60b..91e25a933 100644 --- a/app/services/api/v1/users/projects/list_service.rb +++ b/app/services/api/v1/users/projects/list_service.rb @@ -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' diff --git a/app/views/api/v1/projects/pulls/journals/_simple_detail.json.jbuilder b/app/views/api/v1/projects/pulls/journals/_simple_detail.json.jbuilder new file mode 100644 index 000000000..547db46ed --- /dev/null +++ b/app/views/api/v1/projects/pulls/journals/_simple_detail.json.jbuilder @@ -0,0 +1,21 @@ +json.(journal, :id, :notes, :commit_id, :line_code, :path, :diff, :need_respond, :state) +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) \ No newline at end of file diff --git a/app/views/api/v1/projects/pulls/journals/create.json.jbuilder b/app/views/api/v1/projects/pulls/journals/create.json.jbuilder new file mode 100644 index 000000000..32bedbf8a --- /dev/null +++ b/app/views/api/v1/projects/pulls/journals/create.json.jbuilder @@ -0,0 +1 @@ +json.partial! 'api/v1/projects/pulls/journals/simple_detail', journal: @journal \ No newline at end of file diff --git a/app/views/api/v1/projects/pulls/journals/index.json.jbuilder b/app/views/api/v1/projects/pulls/journals/index.json.jbuilder new file mode 100644 index 000000000..e71eb5f71 --- /dev/null +++ b/app/views/api/v1/projects/pulls/journals/index.json.jbuilder @@ -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 \ No newline at end of file diff --git a/app/views/api/v1/projects/pulls/journals/update.json.jbuilder b/app/views/api/v1/projects/pulls/journals/update.json.jbuilder new file mode 100644 index 000000000..32bedbf8a --- /dev/null +++ b/app/views/api/v1/projects/pulls/journals/update.json.jbuilder @@ -0,0 +1 @@ +json.partial! 'api/v1/projects/pulls/journals/simple_detail', journal: @journal \ No newline at end of file diff --git a/app/views/api/v1/projects/pulls/reviews/_simple_detail.json.jbuilder b/app/views/api/v1/projects/pulls/reviews/_simple_detail.json.jbuilder new file mode 100644 index 000000000..1ded19d6a --- /dev/null +++ b/app/views/api/v1/projects/pulls/reviews/_simple_detail.json.jbuilder @@ -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) \ No newline at end of file diff --git a/config/routes/api.rb b/config/routes/api.rb index 0dfe6112f..d5f82ff7b 100644 --- a/config/routes/api.rb +++ b/config/routes/api.rb @@ -25,6 +25,7 @@ defaults format: :json do get :diff end end + resources :journals, except: [:show, :edit] resources :reviews, only: [:index, :create] end diff --git a/db/migrate/20220726090342_add_line_code_to_journals.rb b/db/migrate/20220726090342_add_line_code_to_journals.rb new file mode 100644 index 000000000..9eb2e45e5 --- /dev/null +++ b/db/migrate/20220726090342_add_line_code_to_journals.rb @@ -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 diff --git a/public/docs/api.html b/public/docs/api.html index ce1fea111..0a6847430 100644 --- a/public/docs/api.html +++ b/public/docs/api.html @@ -609,6 +609,9 @@
为仓库创建一个合并请求
+ +++示例:
+
curl -X POST \
+http://localhost:3000/api/yystopf/ceshi/pulls.json
+
await octokit.request('POST /api/yystopf/ceshi/pulls.json')
+
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示例:
+
{
+ "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示例:
+
{
+ "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
+}
+
获取合并请求版本列表
@@ -13279,9 +13467,9 @@ http://localhost:3000/api/Jason/test-txt/compare/master...Jason/test-txt:develop
curl -X GET http://localhost:3000/api/v1/yystopf/ceshi_commit/pulls/3/versions.json
await octokit.request('GET /api/v1/yystopf/ceshi_commit/pulls/3/versions.json')
-
GET /api/v1/:owner/:repo/pulls/:index/versions.json
参数 | @@ -13408,9 +13596,9 @@ http://localhost:3000/api/Jason/test-txt/compare/master...Jason/test-txt:develop -d "filepath=ceshi_dir_1/new_file_1" \ http://localhost:3000/api/v1/yystopf/ceshi_commit/pulls/3/versions/33/diff.json
---|
参数 | @@ -13944,9 +14132,9 @@ http://localhost:3000/api/v1/yystopf/ceshi_commit/pulls/3/versions/33/diff.json
---|
参数 |
---|