139 lines
4.7 KiB
Ruby
139 lines
4.7 KiB
Ruby
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 |