Class: TopicGroup
- Inherits:
-
ActiveRecord::Base
- Object
- ActiveRecord::Base
- TopicGroup
- Defined in:
- app/models/topic_group.rb
Class Method Summary collapse
- .create_topic_group(user, topic_id, post_number, updated_group_ids) ⇒ Object
- .new_message_update(user, topic_id, post_number) ⇒ Object
- .update_last_read(user, topic_id, post_number) ⇒ Object
- .update_read_count(user, topic_id, post_number) ⇒ Object
Class Method Details
.create_topic_group(user, topic_id, post_number, updated_group_ids) ⇒ Object
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 |
# File 'app/models/topic_group.rb', line 44 def self.create_topic_group(user, topic_id, post_number, updated_group_ids) query = <<~SQL INSERT INTO topic_groups (topic_id, group_id, last_read_post_number, created_at, updated_at) SELECT tag.topic_id, tag.group_id, :post_number, :now, :now FROM topic_allowed_groups tag INNER JOIN group_users gu ON gu.group_id = tag.group_id WHERE gu.user_id = :user_id AND tag.topic_id = :topic_id SQL query += "AND NOT(tag.group_id IN (:already_updated_groups))" if updated_group_ids.present? query += <<~SQL ON CONFLICT(topic_id, group_id) DO UPDATE SET last_read_post_number = :post_number, created_at = :now, updated_at = :now SQL DB.exec( query, user_id: user.id, topic_id: topic_id, post_number: post_number, now: DateTime.now, already_updated_groups: updated_group_ids, ) end |
.new_message_update(user, topic_id, post_number) ⇒ Object
13 14 15 16 17 |
# File 'app/models/topic_group.rb', line 13 def self.(user, topic_id, post_number) updated_groups = update_read_count(user, topic_id, post_number) create_topic_group(user, topic_id, post_number, updated_groups.map(&:group_id)) TopicTrackingState.publish_read_indicator_on_write(topic_id, post_number, user.id) end |
.update_last_read(user, topic_id, post_number) ⇒ Object
7 8 9 10 11 |
# File 'app/models/topic_group.rb', line 7 def self.update_last_read(user, topic_id, post_number) updated_groups = update_read_count(user, topic_id, post_number) create_topic_group(user, topic_id, post_number, updated_groups.map(&:group_id)) TopicTrackingState.publish_read_indicator_on_read(topic_id, post_number, user.id) end |
.update_read_count(user, topic_id, post_number) ⇒ Object
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 |
# File 'app/models/topic_group.rb', line 19 def self.update_read_count(user, topic_id, post_number) update_query = <<~SQL UPDATE topic_groups tg SET last_read_post_number = GREATEST(:post_number, tg.last_read_post_number), updated_at = :now FROM topic_allowed_groups tag INNER JOIN group_users gu ON gu.group_id = tag.group_id WHERE gu.user_id = :user_id AND tag.topic_id = :topic_id AND tg.topic_id = :topic_id RETURNING tg.group_id SQL updated_groups = DB.query( update_query, user_id: user.id, topic_id: topic_id, post_number: post_number, now: DateTime.now, ) end |