2013-06-04 20:13:01 +02:00
class TopicCreator
attr_accessor :errors
2013-07-22 11:40:39 +10:00
def self . create ( user , guardian , opts )
self . new ( user , guardian , opts ) . create
end
2013-06-04 20:13:01 +02:00
def initialize ( user , guardian , opts )
@user = user
@guardian = guardian
@opts = opts
end
def create
2014-02-06 20:52:50 +01:00
@topic = Topic . new ( setup_topic_params )
2013-06-04 20:13:01 +02:00
2014-02-06 20:52:50 +01:00
setup_auto_close_time
process_private_message
2013-06-04 20:13:01 +02:00
save_topic
2013-07-22 11:40:39 +10:00
watch_topic
2014-01-02 12:00:08 +11:00
auto_mute_topic
2013-07-22 11:40:39 +10:00
2013-06-04 20:13:01 +02:00
@topic
end
private
2014-01-02 12:00:08 +11:00
def auto_mute_topic
CategoryUser . auto_mute_new_topic ( @topic )
end
2013-07-22 11:40:39 +10:00
def watch_topic
unless @opts [ :auto_track ] == false
@topic . notifier . watch_topic! ( @topic . user_id )
end
2014-01-22 17:46:52 +11:00
@topic . topic_allowed_users . pluck ( :user_id ) . reject { | id | id == @topic . user_id } . each do | id |
@topic . notifier . watch_topic! ( id , nil )
end
2014-01-02 12:00:08 +11:00
CategoryUser . auto_watch_new_topic ( @topic )
2013-07-22 11:40:39 +10:00
end
2014-02-06 20:52:50 +01:00
def setup_topic_params
2014-01-24 12:57:48 +01:00
topic_params = {
title : @opts [ :title ] ,
user_id : @user . id ,
last_post_user_id : @user . id
}
2014-02-06 20:52:50 +01:00
[ :subtype , :archetype , :meta_data ] . each do | key |
topic_params [ key ] = @opts [ key ] if @opts [ key ] . present?
2014-01-24 12:57:48 +01:00
end
2014-02-06 20:52:50 +01:00
category = find_category
2014-01-24 12:57:48 +01:00
2014-03-07 10:44:04 +01:00
@guardian . ensure_can_create! ( Topic , category )
2014-01-24 12:57:48 +01:00
2013-06-04 20:13:01 +02:00
topic_params [ :category_id ] = category . id if category . present?
2014-02-06 20:52:50 +01:00
2013-06-04 20:13:01 +02:00
topic_params [ :created_at ] = Time . zone . parse ( @opts [ :created_at ] . to_s ) if @opts [ :created_at ] . present?
2014-01-24 12:57:48 +01:00
2013-06-04 20:13:01 +02:00
topic_params
end
2014-02-06 20:52:50 +01:00
def find_category
# PM can't have a category
@opts . delete ( :category ) if @opts [ :archetype ] . present? && @opts [ :archetype ] == Archetype . private_message
# Temporary fix to allow older clients to create topics.
# When all clients are updated the category variable should
# be set directly to the contents of the if statement.
if ( @opts [ :category ] . is_a? Integer ) || ( @opts [ :category ] =~ / ^ \ d+$ / )
2014-05-06 14:41:59 +01:00
Category . find_by ( id : @opts [ :category ] )
2014-02-06 20:52:50 +01:00
else
2014-05-06 14:41:59 +01:00
Category . find_by ( name : @opts [ :category ] )
2014-02-06 20:52:50 +01:00
end
end
2013-11-26 19:06:20 -05:00
def setup_auto_close_time
2014-02-06 20:52:50 +01:00
return unless @opts [ :auto_close_time ] . present?
2013-11-28 11:06:04 -05:00
return unless @guardian . can_moderate? ( @topic )
2013-11-26 19:06:20 -05:00
@topic . set_auto_close ( @opts [ :auto_close_time ] , @user )
2013-06-04 20:13:01 +02:00
end
def process_private_message
2014-02-06 20:52:50 +01:00
return unless @opts [ :archetype ] == Archetype . private_message
2013-06-04 20:13:01 +02:00
@topic . subtype = TopicSubtype . user_to_user unless @topic . subtype
unless @opts [ :target_usernames ] . present? || @opts [ :target_group_names ] . present?
@topic . errors . add ( :archetype , :cant_send_pm )
@errors = @topic . errors
raise ActiveRecord :: Rollback . new
end
add_users ( @topic , @opts [ :target_usernames ] )
add_groups ( @topic , @opts [ :target_group_names ] )
@topic . topic_allowed_users . build ( user_id : @user . id )
end
def save_topic
2013-07-02 12:22:56 +10:00
unless @topic . save ( validate : ! @opts [ :skip_validations ] )
2013-06-04 20:13:01 +02:00
@errors = @topic . errors
raise ActiveRecord :: Rollback . new
end
end
def add_users ( topic , usernames )
return unless usernames
User . where ( username : usernames . split ( ',' ) ) . each do | user |
check_can_send_permission! ( topic , user )
topic . topic_allowed_users . build ( user_id : user . id )
end
end
def add_groups ( topic , groups )
return unless groups
Group . where ( name : groups . split ( ',' ) ) . each do | group |
check_can_send_permission! ( topic , group )
topic . topic_allowed_groups . build ( group_id : group . id )
end
end
def check_can_send_permission! ( topic , item )
unless @guardian . can_send_private_message? ( item )
topic . errors . add ( :archetype , :cant_send_pm )
@errors = topic . errors
raise ActiveRecord :: Rollback . new
end
end
end