From c63a86a797059320b22f3939735a099c12dbf99e Mon Sep 17 00:00:00 2001 From: yystopf Date: Sat, 18 Feb 2023 23:23:33 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=B0=E5=A2=9E=EF=BC=9A=E8=AF=84=E8=AE=BA?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A5=E5=8F=A3=E8=A1=A5=E8=B6=B3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../api/v1/issues/journals_controller.rb | 19 ++++++--- app/models/journal.rb | 2 +- .../api/v1/issues/concerns/checkable.rb | 3 ++ .../issues/journals/children_list_service.rb | 42 +++++++++++++++++++ .../api/v1/issues/journals/create_service.rb | 21 +++++++--- .../api/v1/issues/journals/update_service.rb | 37 ++++++++++++++++ .../journals/children_journals.json.jbuilder | 4 ++ .../v1/issues/journals/update.json.jbuilder | 1 + 8 files changed, 118 insertions(+), 11 deletions(-) create mode 100644 app/services/api/v1/issues/journals/children_list_service.rb create mode 100644 app/services/api/v1/issues/journals/update_service.rb create mode 100644 app/views/api/v1/issues/journals/children_journals.json.jbuilder create mode 100644 app/views/api/v1/issues/journals/update.json.jbuilder diff --git a/app/controllers/api/v1/issues/journals_controller.rb b/app/controllers/api/v1/issues/journals_controller.rb index c3185a755..55e820611 100644 --- a/app/controllers/api/v1/issues/journals_controller.rb +++ b/app/controllers/api/v1/issues/journals_controller.rb @@ -1,8 +1,8 @@ class Api::V1::Issues::JournalsController < Api::V1::IssuesController - before_action :require_public_and_member_above, only: [:index, :create, :destroy] - before_action :load_issue, only: [:index, :create, :destroy] - before_action :load_journal, only: [:destroy] + before_action :require_public_and_member_above, only: [:index, :create, :children_journals, :update, :destroy] + before_action :load_issue, only: [:index, :create, :children_journals, :update, :destroy] + before_action :load_journal, only: [:children_journals, :update, :destroy] def index @object_results = Api::V1::Issues::Journals::ListService.call(@issue, query_params, current_user) @@ -13,6 +13,15 @@ class Api::V1::Issues::JournalsController < Api::V1::IssuesController @object_result = Api::V1::Issues::Journals::CreateService.call(@issue, journal_params, current_user) end + def children_journals + @object_results = Api::V1::Issues::Journals::ChildrenListService.call(@issue, @journal, query_params, current_user) + @journals = kaminari_paginate(@object_results) + end + + def update + @object_result = Api::V1::Issues::Journals::UpdateService.call(@issue, @journal, journal_params, current_user) + end + def destroy if @journal.destroy! render_ok @@ -28,11 +37,11 @@ class Api::V1::Issues::JournalsController < Api::V1::IssuesController end def journal_params - params.permit(:notes, :parent_id, :attachment_ids => []) + params.permit(:notes, :parent_id, :reply_id, :attachment_ids => []) end def load_journal - @journal = @issue.journals.find_by_id(params[:id]) + @journal = Journal.find_by_id(params[:id]) return render_not_found("评论不存在!") unless @journal.present? end diff --git a/app/models/journal.rb b/app/models/journal.rb index 382ebd017..6472d559d 100644 --- a/app/models/journal.rb +++ b/app/models/journal.rb @@ -40,7 +40,7 @@ class Journal < ApplicationRecord belongs_to :journalized, polymorphic: true belongs_to :review, optional: true belongs_to :resolveer, class_name: 'User', foreign_key: :resolveer_id, optional: true - belongs_to :parent_journal, class_name: 'Journal', foreign_key: :parent_id, optional: true + belongs_to :parent_journal, class_name: 'Journal', foreign_key: :parent_id, optional: true, counter_cache: :comments_count belongs_to :reply_journal, class_name: 'Journal', foreign_key: :reply_id, optional: true has_many :journal_details, :dependent => :delete_all has_many :attachments, as: :container, dependent: :destroy diff --git a/app/services/api/v1/issues/concerns/checkable.rb b/app/services/api/v1/issues/concerns/checkable.rb index 8ac03f053..d013c3033 100644 --- a/app/services/api/v1/issues/concerns/checkable.rb +++ b/app/services/api/v1/issues/concerns/checkable.rb @@ -42,4 +42,7 @@ module Api::V1::Issues::Concerns::Checkable end end + def check_parent_journal(parent_id) + raise ApplicationService::Error, "ParentJournal不存在!" unless Journal.find_by_id(parent_id).present? + end end diff --git a/app/services/api/v1/issues/journals/children_list_service.rb b/app/services/api/v1/issues/journals/children_list_service.rb new file mode 100644 index 000000000..d46f9fbbe --- /dev/null +++ b/app/services/api/v1/issues/journals/children_list_service.rb @@ -0,0 +1,42 @@ +class Api::V1::Issues::Journals::ChildrenListService < ApplicationService + + include ActiveModel::Model + + attr_reader :issue, :journal, :keyword, :sort_by, :sort_direction + attr_accessor :queried_journals + + validates :sort_by, inclusion: {in: Journal.column_names, message: '请输入正确的SortBy'}, allow_blank: true + validates :sort_direction, inclusion: {in: %w(asc desc), message: '请输入正确的SortDirection'}, allow_blank: true + + + def initialize(issue, journal, params, current_user=nil) + @issue = issue + @journal = journal + @keyword = params[:keyword] + @sort_by = params[:sort_by].present? ? params[:sort_by] : 'created_on' + @sort_direction = (params[:sort_direction].present? ? params[:sort_direction] : 'asc').downcase + end + + def call + raise Error, errors.full_messages.join(", ") unless valid? + begin + journal_query_data + + return @queried_journals + rescue + raise Error, "服务器错误,请联系系统管理员!" + + end + end + + private + def journal_query_data + @queried_journals = journal.children_journals + + @queried_journals = @queried_journals.ransack(notes_cont: keyword).result if keyword.present? + @queried_journals = @queried_journals.includes(:user, :attachments, :reply_journal) + @queried_journals = @queried_journals.reorder("journals.#{sort_by} #{sort_direction}").distinct + + @queried_journals + end +end \ No newline at end of file diff --git a/app/services/api/v1/issues/journals/create_service.rb b/app/services/api/v1/issues/journals/create_service.rb index 6fe096426..6bd2479d9 100644 --- a/app/services/api/v1/issues/journals/create_service.rb +++ b/app/services/api/v1/issues/journals/create_service.rb @@ -1,32 +1,41 @@ class Api::V1::Issues::Journals::CreateService < ApplicationService include ActiveModel::Model + include Api::V1::Issues::Concerns::Checkable + include Api::V1::Issues::Concerns::Loadable - attr_reader :issue, :current_user, :notes, :parent_id, :attachment_ids + attr_reader :issue, :current_user, :notes, :parent_id, :reply_id, :attachment_ids + attr_accessor :created_journal - validates :issue, :current_user, presence: true + validates :notes, :issue, :current_user, presence: true def initialize(issue, params, current_user=nil) @issue = issue @notes = params[:notes] @parent_id = params[:parent_id] + @reply_id = params[:reply_id] @attachment_ids = params[:attachment_ids] @current_user = current_user end def call raise Error, errors.full_messages.join(", ") unless valid? + raise Error, "请输入回复的评论ID" if parent_id.present? && !reply_id.present? ActiveRecord::Base.transaction do + check_parent_journal(parent_id) if parent_id.present? + check_parent_journal(reply_id) if reply_id.present? check_attachments(attachment_ids) unless attachment_ids.blank? load_attachments(attachment_ids) unless attachment_ids.blank? try_lock("Api::V1::Issues::Journals::CreateService:#{@issue.id}") - @created_journal = Journal.new(journal_attributes) + @created_journal = @issue.journals.new(journal_attributes) build_comment_participants - @created_journal.attachments = @attachments + @created_journal.attachments = @attachments unless attachment_ids.blank? @created_journal.save! unlock("Api::V1::Issues::Journals::CreateService:#{@issue.id}") + + @created_journal end end @@ -34,10 +43,12 @@ class Api::V1::Issues::Journals::CreateService < ApplicationService def journal_attributes journal_attributes = { - notes: notes + notes: notes, + user_id: current_user.id } journal_attributes.merge!({parent_id: parent_id}) if parent_id.present? + journal_attributes.merge!({reply_id: reply_id}) if reply_id.present? journal_attributes end diff --git a/app/services/api/v1/issues/journals/update_service.rb b/app/services/api/v1/issues/journals/update_service.rb new file mode 100644 index 000000000..321c79cdb --- /dev/null +++ b/app/services/api/v1/issues/journals/update_service.rb @@ -0,0 +1,37 @@ +class Api::V1::Issues::Journals::UpdateService < ApplicationService + include ActiveModel::Model + include Api::V1::Issues::Concerns::Checkable + include Api::V1::Issues::Concerns::Loadable + + attr_reader :issue, :journal, :current_user, :notes, :attachment_ids + attr_accessor :updated_journal + + validates :notes, :issue, :journal, :current_user, presence: true + + def initialize(issue, journal, params, current_user=nil) + @issue = issue + @journal = journal + @notes = params[:notes] + @attachment_ids = params[:attachment_ids] + @current_user = current_user + end + + def call + raise Error, errors.full_messages.join(", ") unless valid? + ActiveRecord::Base.transaction do + check_attachments(attachment_ids) unless attachment_ids.blank? + load_attachments(attachment_ids) unless attachment_ids.blank? + + try_lock("Api::V1::Issues::Journals::UpdateService:#{@issue.id}:#{@journal.id}") + @updated_journal = @journal + @updated_journal.notes = notes + @updated_journal.attachments = @attachments unless attachment_ids.blank? + + @updated_journal.save! + unlock("Api::V1::Issues::Journals::UpdateService:#{@issue.id}:#{@journal.id}") + + @updated_journal + end + end + +end \ No newline at end of file diff --git a/app/views/api/v1/issues/journals/children_journals.json.jbuilder b/app/views/api/v1/issues/journals/children_journals.json.jbuilder new file mode 100644 index 000000000..c0cd04501 --- /dev/null +++ b/app/views/api/v1/issues/journals/children_journals.json.jbuilder @@ -0,0 +1,4 @@ +json.total_count @journals.total_count +json.journals @journals do |journal| + json.partial! "children_detail", journal: journal +end \ No newline at end of file diff --git a/app/views/api/v1/issues/journals/update.json.jbuilder b/app/views/api/v1/issues/journals/update.json.jbuilder new file mode 100644 index 000000000..91f3f3174 --- /dev/null +++ b/app/views/api/v1/issues/journals/update.json.jbuilder @@ -0,0 +1 @@ +json.partial! "detail", journal: @object_result \ No newline at end of file