gitlink-forgeplus/app/services/api/v1/issues/create_service.rb

139 lines
4.7 KiB
Ruby
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

class Api::V1::Issues::CreateService < ApplicationService
include ActiveModel::Model
attr_reader :project, :created_issue, :current_user
attr_reader :status_id, :priority_id, :milestone_id, :branch_name, :start_date, :due_date, :subject, :description
attr_reader :issue_tag_ids, :assigner_ids, :attachment_ids
validates :subject, presence: true
validates :status_id, :priority_id, presence: true
validates :current_user, presence: true
def initialize(project, params, current_user = nil)
@project = project
@current_user = current_user
@status_id = params[:status_id]
@priority_id = params[:priority_id]
@milestone_id = params[:milestone_id]
@branch_name = params[:branch_name]
@start_date = params[:start_date]
@due_date = params[:due_date]
@subject = params[:subject]
@description = params[:description]
@issue_tag_ids = params[:issue_tag_ids]
@assigner_ids = params[:assigner_ids]
@attachment_ids = params[:attachment_ids]
end
def call
raise Error, errors.full_messages.join(", ") unless valid?
begin
ActiveRecord::Base.transaction do
check_issue_status
check_issue_priority
check_milestone if milestone_id.present?
check_issue_tags unless issue_tag_ids.blank?
check_assigners unless assigner_ids.blank?
check_attachments unless attachment_ids.blank?
load_assigners unless assigner_ids.blank?
load_attachments unless attachment_ids.blank?
load_issue_tags unless issue_tag_ids.blank?
@created_issue = Issue.new(issue_attributes)
@created_issue.assigners = @assigners unless assigner_ids.blank?
@created_issue.attachments = @attachments unless attachment_ids.blank?
@created_issue.issue_tags = @issue_tags unless issue_tag_ids.blank?
build_author_participants
build_assinger_participants unless assigner_ids.blank?
@created_issue.save!
project.del_project_issue_cache_delete_count # 把缓存里存储项目删除issue的个数清除掉
end
return @created_issue
rescue
raise Error, "服务器错误,请联系系统管理员!"
end
end
private
def check_issue_status
raise Error, "IssueStatus不存在" unless IssueStatus.find_by_id(status_id).present?
end
def check_issue_priority
raise Error, "IssuePriority不存在" unless IssuePriority.find_by_id(priority_id).present?
end
def check_milestone
raise Error, "Milestone不存在" unless Version.find_by_id(milestone_id).present?
end
def check_issue_tags
raise Error, "请输入正确的标记ID数组" unless issue_tag_ids.is_a?(Array)
raise Error, "最多可选择3个标记" if issue_tag_ids.size > 3
issue_tag_ids.each do |tid|
raise Error, "请输入正确的标记ID" unless IssueTag.exists?(id: tid)
end
end
def check_assigners
raise Error, "请输入正确的负责人ID数组" unless assigner_ids.is_a?(Array)
raise Error, "最多可选择5个负责人" if assigner_ids.size > 5
assigner_ids.each do |aid|
raise Error, "请输入正确的负责人ID" unless User.exists?(id: aid)
end
end
def check_attachments
raise Error, "请输入正确的附件ID数组" unless assigner_ids.is_a?(Array)
attachment_ids.each do |aid|
raise Error, "请输入正确的附件ID" unless Attachment.exists?(id: aid)
end
end
def load_assigners
@assigners = User.where(id: assigner_ids)
end
def load_issue_tags
@issue_tags = IssueTag.where(id: issue_tag_ids)
end
def load_attachments
@attachments = Attachment.where(id: attachment_ids)
end
def issue_attributes
issue_attributes = {
subject: subject,
project_id: project.id,
author_id: current_user.id,
tracker_id: Tracker.first.id,
status_id: status_id,
priority_id: priority_id,
project_issues_index: (project.get_last_project_issues_index + 1),
issue_type: "1",
issue_classify: "Issue"
}
issue_attributes.merge!({description: description}) if description.present?
issue_attributes.merge!({fixed_version_id: milestone_id}) if milestone_id.present?
issue_attributes.merge!({start_date: start_date}) if start_date.present?
issue_attributes.merge!({due_date: due_date}) if due_date.present?
issue_attributes.merge!({branch_name: branch_name}) if branch_name.present?
issue_attributes
end
def build_author_participants
@created_issue.issue_participants.new({participant_type: "authored", participant_id: current_user.id})
end
def build_assinger_participants
assigner_ids.each do |aid|
@created_issue.issue_participants.new({participant_type: "assigned", participant_id: aid})
end
end
end