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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
|
# frozen_string_literal: true
# Copyright (c) 2010-2011, Diaspora Inc. This file is
# licensed under the Affero General Public License version 3 or later. See
# the COPYRIGHT file.
class Post < ApplicationRecord
self.include_root_in_json = false
include ApplicationHelper
include Diaspora::Federated::Base
include Diaspora::Federated::Fetchable
include Diaspora::Likeable
include Diaspora::Commentable
include Diaspora::Shareable
include Diaspora::MentionsContainer
has_many :participations, dependent: :delete_all, as: :target, inverse_of: :target
has_many :participants, through: :participations, source: :author
attr_accessor :user_like
has_many :reports, as: :item
has_many :reshares, class_name: "Reshare", foreign_key: :root_guid, primary_key: :guid
has_many :resharers, class_name: "Person", through: :reshares, source: :author
belongs_to :o_embed_cache, optional: true
belongs_to :open_graph_cache, optional: true
validates_uniqueness_of :id
after_create do
self.touch(:interacted_at)
end
before_destroy do
reshares.update_all(root_guid: nil) # rubocop:disable Rails/SkipsModelValidations
end
#scopes
scope :includes_for_a_stream, -> {
includes(:o_embed_cache,
:open_graph_cache,
{:author => :profile},
:mentions => {:person => :profile}
) #note should include root and photos, but i think those are both on status_message
}
scope :all_public, -> { where(public: true) }
scope :all_local_public, -> {
where(" exists (
select 1 from people where posts.author_id = people.id
and people.pod_id is null)
and posts.public = true")
}
scope :commented_by, ->(person) {
select('DISTINCT posts.*')
.joins(:comments)
.where(:comments => {:author_id => person.id})
}
scope :liked_by, ->(person) {
joins(:likes).where(:likes => {:author_id => person.id})
}
scope :subscribed_by, ->(user) {
joins(:participations).where(participations: {author_id: user.person_id})
}
scope :reshares, -> { where(type: "Reshare") }
scope :reshared_by, ->(person) {
# we join on the same table, Rails renames "posts" to "reshares_posts" for the right table
joins(:reshares).where(reshares_posts: {author_id: person.id})
}
def post_type
self.class.name
end
def root; end
def photos; []; end
#prevents error when trying to access @post.address in a post different than Reshare and StatusMessage types;
#check PostPresenter
def address
end
def poll
end
def self.excluding_blocks(user)
people = user.blocks.map{|b| b.person_id}
scope = all
if people.any?
scope = scope.where("posts.author_id NOT IN (?)", people)
end
scope
end
def self.excluding_hidden_shareables(user)
scope = all
if user.has_hidden_shareables_of_type?
scope = scope.where('posts.id NOT IN (?)', user.hidden_shareables["#{self.base_class}"])
end
scope
end
def self.excluding_hidden_content(user)
excluding_blocks(user).excluding_hidden_shareables(user)
end
def self.for_a_stream(max_time, order, user=nil, ignore_blocks=false)
scope = self.for_visible_shareable_sql(max_time, order).
includes_for_a_stream
if user.present?
if ignore_blocks
scope = scope.excluding_hidden_shareables(user)
else
scope = scope.excluding_hidden_content(user)
end
end
scope
end
def reshare_for(user)
return unless user
reshares.find_by(author_id: user.person.id)
end
def like_for(user)
return unless user
likes.find_by(author_id: user.person.id)
end
#############
# @return [Integer]
def update_reshares_counter
self.class.where(id: id).update_all(reshares_count: reshares.count)
end
def self.diaspora_initialize(params)
new(params.to_hash.stringify_keys.slice(*column_names, "author"))
end
def comment_email_subject
I18n.t('notifier.a_post_you_shared')
end
def nsfw
self.author.profile.nsfw?
end
def subscribers
super.tap do |subscribers|
subscribers.concat(resharers).concat(participants) if public?
end
end
end
|