2013-02-05 14:16:51 -05:00
require_dependency 'category_serializer'
class CategoriesController < ApplicationController
2016-03-14 22:08:29 +05:30
before_filter :ensure_logged_in , except : [ :index , :show , :redirect , :find_by_slug ]
2013-04-18 17:07:06 -04:00
before_filter :fetch_category , only : [ :show , :update , :destroy ]
2015-09-17 15:51:32 +08:00
before_filter :initialize_staff_action_logger , only : [ :create , :update , :destroy ]
2014-10-16 12:15:31 -04:00
skip_before_filter :check_xhr , only : [ :index , :redirect ]
def redirect
2015-03-09 11:45:36 +11:00
redirect_to path ( " /c/ #{ params [ :path ] } " )
2014-10-16 12:15:31 -04:00
end
2013-02-05 14:16:51 -05:00
def index
2013-09-11 15:33:05 -04:00
@description = SiteSetting . site_description
2013-10-17 17:44:56 +11:00
options = { }
2013-12-11 15:23:41 -05:00
options [ :latest_posts ] = params [ :latest_posts ] || SiteSetting . category_featured_topics
2014-07-02 15:10:39 -04:00
options [ :parent_category_id ] = params [ :parent_category_id ]
2015-09-02 20:25:18 +02:00
options [ :is_homepage ] = current_homepage == " categories " . freeze
2013-10-17 17:44:56 +11:00
2014-07-02 15:10:39 -04:00
@list = CategoryList . new ( guardian , options )
2013-05-28 21:15:30 -04:00
@list . draft_key = Draft :: NEW_TOPIC
@list . draft_sequence = DraftSequence . current ( current_user , Draft :: NEW_TOPIC )
@list . draft = Draft . get ( current_user , @list . draft_key , @list . draft_sequence ) if current_user
2013-04-11 16:24:08 +10:00
discourse_expires_in 1 . minute
2013-05-28 14:54:00 -04:00
2015-09-02 20:25:18 +02:00
unless current_homepage == " categories "
2015-06-08 12:07:35 -04:00
@title = I18n . t ( 'js.filters.categories.title' )
end
2013-05-28 14:54:00 -04:00
store_preloaded ( " categories_list " , MultiJson . dump ( CategoryListSerializer . new ( @list , scope : guardian ) ) )
2013-04-26 13:10:41 -04:00
respond_to do | format |
format . html { render }
format . json { render_serialized ( @list , CategoryListSerializer ) }
end
2013-02-05 14:16:51 -05:00
end
2013-02-07 16:45:24 +01:00
2013-10-21 15:24:37 +11:00
def move
2015-08-27 10:14:59 -07:00
guardian . ensure_can_create_category!
2013-10-21 15:33:42 +11:00
2013-10-21 15:24:37 +11:00
params . require ( " category_id " )
params . require ( " position " )
if category = Category . find ( params [ " category_id " ] )
category . move_to ( params [ " position " ] . to_i )
render json : success_json
else
render status : 500 , json : failed_json
end
end
2015-08-27 10:14:59 -07:00
def reorder
guardian . ensure_can_create_category!
params . require ( :mapping )
change_requests = MultiJson . load ( params [ :mapping ] )
by_category = Hash [ change_requests . map { | cat , pos | [ Category . find ( cat . to_i ) , pos ] } ]
unless guardian . is_admin?
raise Discourse :: InvalidAccess unless by_category . keys . all? { | c | guardian . can_see_category? c }
end
by_category . each do | cat , pos |
cat . position = pos
cat . save if cat . position_changed?
end
render json : success_json
end
2013-02-05 14:16:51 -05:00
def show
2014-03-05 17:21:55 -05:00
if Category . topic_create_allowed ( guardian ) . where ( id : @category . id ) . exists?
@category . permission = CategoryGroup . permission_types [ :full ]
end
2013-02-05 14:16:51 -05:00
render_serialized ( @category , CategorySerializer )
end
def create
guardian . ensure_can_create! ( Category )
2014-05-16 11:33:44 -04:00
position = category_params . delete ( :position )
2013-02-05 14:16:51 -05:00
@category = Category . create ( category_params . merge ( user : current_user ) )
2013-02-07 16:45:24 +01:00
2015-09-17 15:51:32 +08:00
if @category . save
@category . move_to ( position . to_i ) if position
Scheduler :: Defer . later " Log staff action create category " do
@staff_action_logger . log_category_creation ( @category )
end
render_serialized ( @category , CategorySerializer )
else
return render_json_error ( @category ) unless @category . save
end
2013-02-05 14:16:51 -05:00
end
def update
guardian . ensure_can_edit! ( @category )
2014-10-10 18:21:44 +02:00
json_result ( @category , serializer : CategorySerializer ) do | cat |
2014-05-16 11:33:44 -04:00
cat . move_to ( category_params [ :position ] . to_i ) if category_params [ :position ]
2016-03-08 20:52:04 +01:00
category_params . delete ( :position )
2014-10-10 18:21:44 +02:00
2016-03-08 20:52:04 +01:00
# properly null the value so the database constraint doesn't catch us
if category_params . has_key? ( :email_in ) && category_params [ :email_in ] . blank?
2014-03-05 00:42:05 +01:00
category_params [ :email_in ] = nil
end
2014-10-10 18:21:44 +02:00
2016-03-08 20:52:04 +01:00
old_permissions = cat . permissions_params
2014-10-10 18:21:44 +02:00
2016-03-08 20:52:04 +01:00
if result = cat . update ( category_params )
2015-09-17 15:51:32 +08:00
Scheduler :: Defer . later " Log staff action change category settings " do
@staff_action_logger . log_category_settings_change ( @category , category_params , old_permissions )
end
end
result
2014-10-10 18:21:44 +02:00
end
2013-02-05 14:16:51 -05:00
end
2014-12-20 22:07:29 +08:00
def update_slug
@category = Category . find ( params [ :category_id ] . to_i )
guardian . ensure_can_edit! ( @category )
custom_slug = params [ :slug ] . to_s
if custom_slug . present? && @category . update_attributes ( slug : custom_slug )
render json : success_json
else
render_json_error ( @category )
end
end
2014-04-17 11:17:39 +02:00
def set_notifications
category_id = params [ :category_id ] . to_i
notification_level = params [ :notification_level ] . to_i
2014-11-03 16:57:50 +01:00
CategoryUser . set_notification_level_for_category ( current_user , notification_level , category_id )
2014-04-17 11:17:39 +02:00
render json : success_json
end
2013-02-05 14:16:51 -05:00
def destroy
2013-04-18 17:07:06 -04:00
guardian . ensure_can_delete! ( @category )
@category . destroy
2013-10-21 15:24:37 +11:00
2015-09-17 15:51:32 +08:00
Scheduler :: Defer . later " Log staff action delete category " do
@staff_action_logger . log_category_deletion ( @category )
end
2013-10-21 15:24:37 +11:00
render json : success_json
2013-02-05 14:16:51 -05:00
end
2016-03-14 22:08:29 +05:30
def find_by_slug
params . require ( :category_slug )
@category = Category . find_by_slug ( params [ :category_slug ] , params [ :parent_category_slug ] )
guardian . ensure_can_see! ( @category )
@category . permission = CategoryGroup . permission_types [ :full ] if Category . topic_create_allowed ( guardian ) . where ( id : @category . id ) . exists?
render_serialized ( @category , CategorySerializer )
end
2013-02-05 14:16:51 -05:00
private
2013-03-26 18:06:21 -04:00
def required_param_keys
2013-03-14 14:16:57 +01:00
[ :name , :color , :text_color ]
2013-02-05 14:16:51 -05:00
end
def category_params
2013-10-21 17:17:40 +11:00
@category_params || = begin
required_param_keys . each do | key |
params . require ( key )
end
2013-06-04 23:45:25 -07:00
2013-10-21 17:17:40 +11:00
if p = params [ :permissions ]
p . each do | k , v |
p [ k ] = v . to_i
end
2013-07-16 15:44:07 +10:00
end
2016-06-07 13:08:59 -04:00
if SiteSetting . tagging_enabled
params [ :allowed_tags ] || = [ ]
params [ :allowed_tag_groups ] || = [ ]
end
2016-05-31 16:46:40 -04:00
2014-07-10 12:01:46 +10:00
params . permit ( * required_param_keys ,
:position ,
:email_in ,
:email_in_allow_strangers ,
2015-09-02 20:25:18 +02:00
:suppress_from_homepage ,
2014-07-10 12:01:46 +10:00
:parent_category_id ,
:auto_close_hours ,
2014-10-10 18:21:44 +02:00
:auto_close_based_on_last_post ,
2014-07-10 12:01:46 +10:00
:logo_url ,
:background_url ,
2014-12-03 16:23:59 -08:00
:slug ,
2016-01-12 12:06:51 +01:00
:allow_badges ,
2015-07-02 16:18:59 -04:00
:topic_template ,
2015-06-10 06:07:37 +10:00
:custom_fields = > [ params [ :custom_fields ] . try ( :keys ) ] ,
2016-05-30 16:37:06 -04:00
:permissions = > [ * p . try ( :keys ) ] ,
2016-06-07 13:08:59 -04:00
:allowed_tags = > [ ] ,
:allowed_tag_groups = > [ ] )
2013-10-21 17:17:40 +11:00
end
2013-02-05 14:16:51 -05:00
end
2013-04-18 17:07:06 -04:00
def fetch_category
2014-05-06 14:41:59 +01:00
@category = Category . find_by ( slug : params [ :id ] ) || Category . find_by ( id : params [ :id ] . to_i )
2013-04-18 17:07:06 -04:00
end
2015-09-17 15:51:32 +08:00
def initialize_staff_action_logger
@staff_action_logger = StaffActionLogger . new ( current_user )
end
2013-02-05 14:16:51 -05:00
end