2016-03-21 13:12:52 +00:00
module IssuableActions
extend ActiveSupport :: Concern
included do
2016-09-26 21:06:46 +00:00
before_action :labels , only : [ :show , :new , :edit ]
2016-03-21 13:12:52 +00:00
before_action :authorize_destroy_issuable! , only : :destroy
2016-09-06 12:49:49 +00:00
before_action :authorize_admin_issuable! , only : :bulk_update
2016-03-21 13:12:52 +00:00
end
2017-11-01 17:35:14 +00:00
def show
respond_to do | format |
2017-11-07 13:34:12 +00:00
format . html
2017-11-01 17:35:14 +00:00
format . json do
render json : serializer . represent ( issuable , serializer : params [ :serializer ] )
end
end
end
def update
2017-11-22 07:50:36 +00:00
@issuable = update_service . execute ( issuable ) # rubocop:disable Gitlab/ModuleWithInstanceVariables
2017-11-01 17:35:14 +00:00
respond_to do | format |
format . html do
2017-12-08 18:19:51 +00:00
recaptcha_check_if_spammable { render :edit }
2017-11-01 17:35:14 +00:00
end
format . json do
2017-12-08 18:19:51 +00:00
recaptcha_check_if_spammable ( false ) { render_entity_json }
2017-11-01 17:35:14 +00:00
end
end
rescue ActiveRecord :: StaleObjectError
render_conflict_response
end
def realtime_changes
Gitlab :: PollingInterval . set_header ( response , interval : 3_000 )
response = {
title : view_context . markdown_field ( issuable , :title ) ,
title_text : issuable . title ,
description : view_context . markdown_field ( issuable , :description ) ,
description_text : issuable . description ,
task_status : issuable . task_status
}
if issuable . edited?
response [ :updated_at ] = issuable . updated_at
response [ :updated_by_name ] = issuable . last_edited_by . name
response [ :updated_by_path ] = user_path ( issuable . last_edited_by )
end
render json : response
end
2016-03-21 13:12:52 +00:00
def destroy
2017-11-29 10:27:36 +00:00
Issuable :: DestroyService . new ( issuable . project , current_user ) . execute ( issuable )
2017-11-02 14:51:42 +00:00
TodoService . new . destroy_issuable ( issuable , current_user )
2016-03-21 13:12:52 +00:00
2016-11-19 02:19:04 +00:00
name = issuable . human_class_name
2016-03-21 13:12:52 +00:00
flash [ :notice ] = " The #{ name } was successfully deleted. "
2017-11-02 14:51:42 +00:00
index_path = polymorphic_path ( [ parent , issuable . class ] )
2017-05-12 10:23:30 +00:00
respond_to do | format |
format . html { redirect_to index_path }
format . json do
render json : {
2017-05-25 10:58:40 +00:00
web_url : index_path
2017-05-12 10:23:30 +00:00
}
end
end
2016-03-21 13:12:52 +00:00
end
2016-09-06 12:49:49 +00:00
def bulk_update
result = Issuable :: BulkUpdateService . new ( project , current_user , bulk_update_params ) . execute ( resource_name )
quantity = result [ :count ]
render json : { notice : " #{ quantity } #{ resource_name . pluralize ( quantity ) } updated " }
end
2016-03-21 13:12:52 +00:00
private
2017-12-08 18:19:51 +00:00
def recaptcha_check_if_spammable ( should_redirect = true , & block )
return yield unless @issuable . is_a? Spammable
recaptcha_check_with_fallback ( should_redirect , & block )
end
2017-01-16 18:43:03 +00:00
def render_conflict_response
respond_to do | format |
format . html do
2017-11-22 07:50:36 +00:00
@conflict = true # rubocop:disable Gitlab/ModuleWithInstanceVariables
2017-01-16 18:43:03 +00:00
render :edit
end
format . json do
render json : {
errors : [
" Someone edited this #{ issuable . human_class_name } at the same time you did. Please refresh your browser and make sure your changes will not unintentionally remove theirs. "
]
} , status : 409
end
end
end
2016-09-20 14:03:41 +00:00
def labels
2017-11-22 09:15:46 +00:00
@labels || = LabelsFinder . new ( current_user , project_id : @project . id ) . execute # rubocop:disable Gitlab/ModuleWithInstanceVariables
2016-09-20 14:03:41 +00:00
end
2016-03-21 13:12:52 +00:00
def authorize_destroy_issuable!
2016-09-08 12:33:53 +00:00
unless can? ( current_user , :" destroy_ #{ issuable . to_ability_name } " , issuable )
2016-03-21 13:12:52 +00:00
return access_denied!
end
end
2016-09-06 12:49:49 +00:00
def authorize_admin_issuable!
2017-11-22 07:50:36 +00:00
unless can? ( current_user , :" admin_ #{ resource_name } " , @project ) # rubocop:disable Gitlab/ModuleWithInstanceVariables
2016-09-06 12:49:49 +00:00
return access_denied!
end
end
2017-11-01 17:35:14 +00:00
def authorize_update_issuable!
render_404 unless can? ( current_user , :" update_ #{ resource_name } " , issuable )
end
2016-09-06 12:49:49 +00:00
def bulk_update_params
2017-05-08 14:58:42 +00:00
permitted_keys = [
2016-09-06 12:49:49 +00:00
:issuable_ids ,
:assignee_id ,
:milestone_id ,
:state_event ,
:subscription_event ,
label_ids : [ ] ,
add_label_ids : [ ] ,
remove_label_ids : [ ]
2017-05-08 14:58:42 +00:00
]
if resource_name == 'issue'
permitted_keys << { assignee_ids : [ ] }
else
permitted_keys . unshift ( :assignee_id )
end
params . require ( :update ) . permit ( permitted_keys )
2016-09-06 12:49:49 +00:00
end
def resource_name
@resource_name || = controller_name . singularize
end
2017-11-01 17:35:14 +00:00
2017-11-22 07:50:36 +00:00
# rubocop:disable Gitlab/ModuleWithInstanceVariables
2017-11-01 17:35:14 +00:00
def render_entity_json
if @issuable . valid?
render json : serializer . represent ( @issuable )
else
render json : { errors : @issuable . errors . full_messages } , status : :unprocessable_entity
end
end
2017-11-22 07:50:36 +00:00
# rubocop:enable Gitlab/ModuleWithInstanceVariables
2017-11-01 17:35:14 +00:00
def serializer
raise NotImplementedError
end
def update_service
raise NotImplementedError
end
2017-11-02 14:51:42 +00:00
def parent
2017-11-22 07:50:36 +00:00
@project || @group # rubocop:disable Gitlab/ModuleWithInstanceVariables
2017-11-02 14:51:42 +00:00
end
2016-03-21 13:12:52 +00:00
end