45 lines
1.1 KiB
Ruby
45 lines
1.1 KiB
Ruby
class Api::V1::Issues::DeleteService < ApplicationService
|
|
include ActiveModel::Model
|
|
|
|
attr_reader :project, :issue, :current_user
|
|
|
|
validates :project, :issue, :current_user, presence: true
|
|
|
|
def initialize(project, issue, current_user = nil)
|
|
@project = project
|
|
@issue = issue
|
|
@current_user = current_user
|
|
end
|
|
|
|
def call
|
|
raise Error, errors.full_messages.join(", ") unless valid?
|
|
try_lock # 开始写数据,加锁
|
|
|
|
delete_issue
|
|
|
|
project.incre_project_issue_cache_delete_count
|
|
|
|
if Site.has_notice_menu?
|
|
SendTemplateMessageJob.perform_later('IssueDeleted', current_user.id, @issue&.subject, @issue.assigners.pluck(:id), @issue.author_id)
|
|
end
|
|
|
|
unlock
|
|
|
|
return true
|
|
end
|
|
|
|
private
|
|
|
|
def delete_issue
|
|
raise Error, "删除疑修失败!" unless issue.destroy!
|
|
end
|
|
|
|
def try_lock
|
|
raise Error, "请稍后再试!" unless $redis_cache.set("Api::V1::Issues::DeleteService:#{project.id}", 1, nx: true, ex: 60.seconds)
|
|
end
|
|
|
|
def unlock
|
|
$redis_cache.del("Api::V1::Issues::DeleteService:#{project.id}")
|
|
end
|
|
|
|
end |