2013-02-05 14:16:51 -05:00
require_dependency 'category_serializer'
class CategoriesController < ApplicationController
2016-08-29 22:47:44 +02:00
before_filter :ensure_logged_in , except : [ :index , :categories_and_latest , :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 ]
2016-08-29 22:47:44 +02:00
skip_before_filter :check_xhr , only : [ :index , :categories_and_latest , :redirect ]
2014-10-16 12:15:31 -04:00
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
2016-08-17 23:23:16 +02:00
discourse_expires_in 1 . minute
2013-09-11 15:33:05 -04:00
@description = SiteSetting . site_description
2016-08-19 01:47:00 +02:00
category_options = {
is_homepage : current_homepage == " categories " . freeze ,
2016-08-22 23:01:43 +02:00
parent_category_id : params [ :parent_category_id ] ,
include_topics : include_topics
2016-08-19 01:47:00 +02:00
}
2013-10-17 17:44:56 +11:00
2016-08-17 23:23:16 +02:00
@category_list = CategoryList . new ( guardian , category_options )
@category_list . draft_key = Draft :: NEW_TOPIC
@category_list . draft_sequence = DraftSequence . current ( current_user , Draft :: NEW_TOPIC )
2016-08-29 22:47:44 +02:00
@category_list . draft = Draft . get ( current_user , Draft :: NEW_TOPIC , @category_list . draft_sequence ) if current_user
2013-05-28 21:15:30 -04:00
2016-08-17 23:23:16 +02:00
@title = I18n . t ( 'js.filters.categories.title' ) unless category_options [ :is_homepage ]
2015-06-08 12:07:35 -04:00
2013-04-26 13:10:41 -04:00
respond_to do | format |
2016-08-17 23:23:16 +02:00
format . html do
store_preloaded ( @category_list . preload_key , MultiJson . dump ( CategoryListSerializer . new ( @category_list , scope : guardian ) ) )
2016-08-22 23:01:43 +02:00
2016-08-22 23:43:42 +02:00
if SiteSetting . desktop_category_page_style == " categories_and_latest_topics " . freeze
2016-08-22 23:01:43 +02:00
topic_options = { per_page : SiteSetting . categories_topics , no_definitions : true }
topic_list = TopicQuery . new ( current_user , topic_options ) . list_latest
store_preloaded ( topic_list . preload_key , MultiJson . dump ( TopicListSerializer . new ( topic_list , scope : guardian ) ) )
end
2016-08-17 23:23:16 +02:00
render
end
format . json { render_serialized ( @category_list , CategoryListSerializer ) }
2013-04-26 13:10:41 -04:00
end
2013-02-05 14:16:51 -05:00
end
2013-02-07 16:45:24 +01:00
2016-08-29 22:47:44 +02:00
def categories_and_latest
discourse_expires_in 1 . minute
category_options = {
is_homepage : current_homepage == " categories " . freeze ,
parent_category_id : params [ :parent_category_id ] ,
include_topics : false
}
topic_options = {
per_page : SiteSetting . categories_topics ,
no_definitions : true
}
result = CategoryAndTopicLists . new
result . category_list = CategoryList . new ( guardian , category_options )
result . topic_list = TopicQuery . new ( current_user , topic_options ) . list_latest
draft_key = Draft :: NEW_TOPIC
draft_sequence = DraftSequence . current ( current_user , draft_key )
draft = Draft . get ( current_user , draft_key , draft_sequence ) if current_user
%w{ category topic } . each do | type |
result . send ( :" #{ type } _list " ) . draft = draft
result . send ( :" #{ type } _list " ) . draft_key = draft_key
result . send ( :" #{ type } _list " ) . draft_sequence = draft_sequence
end
render_serialized ( result , CategoryAndTopicListsSerializer , root : false )
end
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
2016-09-22 11:30:19 +08:00
return render_json_error ( @category ) unless @category . save
2015-09-17 15:51:32 +08:00
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-09-15 10:15:17 +08:00
if result = cat . update_attributes ( 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
2016-08-29 22:47:44 +02:00
def include_topics
view_context . mobile_view? ||
params [ :include_topics ] ||
SiteSetting . desktop_category_page_style == " categories_with_featured_topics " . freeze
end
2013-02-05 14:16:51 -05:00
end