Class: TopicGroup

Inherits:
ActiveRecord::Base
  • Object
show all
Defined in:
app/models/topic_group.rb

Class Method Summary collapse

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.new_message_update(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