Class: PostBookmarkable

Inherits:
BaseBookmarkable show all
Includes:
TopicPostBookmarkableHelper
Defined in:
app/services/post_bookmarkable.rb

Instance Attribute Summary

Attributes inherited from BaseBookmarkable

#model, #preload_associations, #serializer

Class Method Summary collapse

Methods inherited from BaseBookmarkable

has_preloads?, perform_custom_preload!, send_reminder_notification

Class Method Details

.after_create(guardian, bookmark, opts) ⇒ Object



77
78
79
# File 'app/services/post_bookmarkable.rb', line 77

def self.after_create(guardian, bookmark, opts)
  sync_topic_user_bookmarked(guardian.user, bookmark.bookmarkable.topic, opts)
end

.after_destroy(guardian, bookmark, opts) ⇒ Object



81
82
83
# File 'app/services/post_bookmarkable.rb', line 81

def self.after_destroy(guardian, bookmark, opts)
  sync_topic_user_bookmarked(guardian.user, bookmark.bookmarkable.topic, opts)
end

.bookmark_metadata(bookmark, user) ⇒ Object



64
65
66
67
68
# File 'app/services/post_bookmarkable.rb', line 64

def self.(bookmark, user)
  {
    topic_bookmarked: Bookmark.for_user_in_topic(user.id, bookmark.bookmarkable.topic_id).exists?,
  }
end

.can_see?(guardian, bookmark) ⇒ Boolean

Returns:

  • (Boolean)


60
61
62
# File 'app/services/post_bookmarkable.rb', line 60

def self.can_see?(guardian, bookmark)
  guardian.can_see_post?(bookmark.bookmarkable)
end

.cleanup_deletedObject



85
86
87
88
89
90
91
92
93
94
95
96
97
98
# File 'app/services/post_bookmarkable.rb', line 85

def self.cleanup_deleted
  related_topics = DB.query(<<~SQL, grace_time: 3.days.ago)
    DELETE FROM bookmarks b
    USING topics t, posts p
    WHERE t.id = p.topic_id AND b.bookmarkable_id = p.id AND b.bookmarkable_type = 'Post'
    AND (t.deleted_at < :grace_time OR p.deleted_at < :grace_time)
    RETURNING t.id AS topic_id
  SQL

  related_topics_ids = related_topics.map(&:topic_id).uniq
  related_topics_ids.each do |topic_id|
    Jobs.enqueue(:sync_topic_user_bookmarked, topic_id: topic_id)
  end
end

.list_query(user, guardian) ⇒ Object



18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
# File 'app/services/post_bookmarkable.rb', line 18

def self.list_query(user, guardian)
  topics = Topic.listable_topics.secured(guardian)
  pms = Topic.private_messages_for_user(user)
  post_bookmarks =
    user
      .bookmarks_of_type("Post")
      .joins(
        "INNER JOIN posts ON posts.id = bookmarks.bookmarkable_id AND bookmarks.bookmarkable_type = 'Post'",
      )
      .joins("LEFT JOIN topics ON topics.id = posts.topic_id")
      .joins("LEFT JOIN topic_users ON topic_users.topic_id = topics.id")
      .where("topic_users.user_id = ?", user.id)
  guardian.filter_allowed_categories(
    post_bookmarks.merge(topics.or(pms)).merge(Post.secured(guardian)),
  )
end

.modelObject



6
7
8
# File 'app/services/post_bookmarkable.rb', line 6

def self.model
  Post
end

.preload_associationsObject



14
15
16
# File 'app/services/post_bookmarkable.rb', line 14

def self.preload_associations
  [{ topic: [:tags] }, :user]
end

.reminder_conditions(bookmark) ⇒ Object



56
57
58
# File 'app/services/post_bookmarkable.rb', line 56

def self.reminder_conditions(bookmark)
  bookmark.bookmarkable.present? && bookmark.bookmarkable.topic.present?
end

.reminder_handler(bookmark) ⇒ Object



44
45
46
47
48
49
50
51
52
53
54
# File 'app/services/post_bookmarkable.rb', line 44

def self.reminder_handler(bookmark)
  send_reminder_notification(
    bookmark,
    topic_id: bookmark.bookmarkable.topic_id,
    post_number: bookmark.bookmarkable.post_number,
    data: {
      title: bookmark.bookmarkable.topic.title,
      bookmarkable_url: bookmark.bookmarkable.url,
    },
  )
end

.search_query(bookmarks, query, ts_query, &bookmarkable_search) ⇒ Object



35
36
37
38
39
40
41
42
# File 'app/services/post_bookmarkable.rb', line 35

def self.search_query(bookmarks, query, ts_query, &bookmarkable_search)
  bookmarkable_search.call(
    bookmarks.joins(
      "LEFT JOIN post_search_data ON post_search_data.post_id = bookmarks.bookmarkable_id AND bookmarks.bookmarkable_type = 'Post'",
    ),
    "#{ts_query} @@ post_search_data.search_data",
  )
end

.serializerObject



10
11
12
# File 'app/services/post_bookmarkable.rb', line 10

def self.serializer
  UserPostBookmarkSerializer
end

.validate_before_create(guardian, bookmarkable) ⇒ Object



70
71
72
73
74
75
# File 'app/services/post_bookmarkable.rb', line 70

def self.validate_before_create(guardian, bookmarkable)
  if bookmarkable.blank? || bookmarkable.topic.blank? ||
       !guardian.can_see_topic?(bookmarkable.topic) || !guardian.can_see_post?(bookmarkable)
    raise Discourse::InvalidAccess
  end
end