60 lines
1.4 KiB
Ruby
60 lines
1.4 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
module Snippets
|
|
class DestroyService
|
|
include Gitlab::Allowable
|
|
|
|
attr_reader :current_user, :snippet
|
|
|
|
DestroyError = Class.new(StandardError)
|
|
|
|
def initialize(user, snippet)
|
|
@current_user = user
|
|
@snippet = snippet
|
|
end
|
|
|
|
def execute
|
|
if snippet.nil?
|
|
return service_response_error('No snippet found.', 404)
|
|
end
|
|
|
|
unless user_can_delete_snippet?
|
|
return service_response_error(
|
|
"You don't have access to delete this snippet.",
|
|
403
|
|
)
|
|
end
|
|
|
|
attempt_destroy!
|
|
|
|
ServiceResponse.success(message: 'Snippet was deleted.')
|
|
rescue DestroyError
|
|
service_response_error('Failed to remove snippet repository.', 400)
|
|
rescue
|
|
attempt_rollback_repository
|
|
service_response_error('Failed to remove snippet.', 400)
|
|
end
|
|
|
|
private
|
|
|
|
def attempt_destroy!
|
|
result = Repositories::DestroyService.new(snippet.repository).execute
|
|
|
|
raise DestroyError if result[:status] == :error
|
|
|
|
snippet.destroy!
|
|
end
|
|
|
|
def attempt_rollback_repository
|
|
Repositories::DestroyRollbackService.new(snippet.repository).execute
|
|
end
|
|
|
|
def user_can_delete_snippet?
|
|
can?(current_user, :admin_snippet, snippet)
|
|
end
|
|
|
|
def service_response_error(message, http_status)
|
|
ServiceResponse.error(message: message, http_status: http_status)
|
|
end
|
|
end
|
|
end
|