forked from discourse/discourse
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtopic_creator.rb
100 lines (79 loc) · 2.68 KB
/
topic_creator.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
class TopicCreator
attr_accessor :errors
def self.create(user, guardian, opts)
self.new(user, guardian, opts).create
end
def initialize(user, guardian, opts)
@user = user
@guardian = guardian
@opts = opts
end
def create
topic_params = setup
@topic = Topic.new(topic_params)
setup_auto_close_days if @opts[:auto_close_days]
process_private_message if @opts[:archetype] == Archetype.private_message
save_topic
watch_topic
@topic
end
private
def watch_topic
unless @opts[:auto_track] == false
@topic.notifier.watch_topic!(@topic.user_id)
end
end
def setup
topic_params = {title: @opts[:title], user_id: @user.id, last_post_user_id: @user.id}
topic_params[:archetype] = @opts[:archetype] if @opts[:archetype].present?
topic_params[:subtype] = @opts[:subtype] if @opts[:subtype].present?
category = Category.where(name: @opts[:category]).first
@guardian.ensure_can_create!(Topic,category)
topic_params[:category_id] = category.id if category.present?
topic_params[:meta_data] = @opts[:meta_data] if @opts[:meta_data].present?
topic_params[:created_at] = Time.zone.parse(@opts[:created_at].to_s) if @opts[:created_at].present?
topic_params
end
def setup_auto_close_days
@guardian.ensure_can_moderate!(@topic)
@topic.auto_close_days = @opts[:auto_close_days]
end
def process_private_message
@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
unless @topic.save(validate: !@opts[:skip_validations])
@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