about summary refs log tree commit diff
path: root/app/models
diff options
context:
space:
mode:
authorEugen Rochko <eugen@zeonfederated.com>2016-02-23 19:17:37 +0100
committerEugen Rochko <eugen@zeonfederated.com>2016-02-23 19:17:37 +0100
commitfa33750105389110a3395ca19167f789d21a149e (patch)
tree4b121a067ad46be5189301a2e3e3b2bcef8d6426 /app/models
parent3b0bc18db928c455186273d9b9aa5b96d91e035e (diff)
Adding reblogs, favourites, improving atom generation
Diffstat (limited to 'app/models')
-rw-r--r--app/models/account.rb3
-rw-r--r--app/models/favourite.rb38
-rw-r--r--app/models/follow.rb15
-rw-r--r--app/models/status.rb38
-rw-r--r--app/models/stream_entry.rb16
5 files changed, 100 insertions, 10 deletions
diff --git a/app/models/account.rb b/app/models/account.rb
index 42d92eddf..fc399d69c 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -5,6 +5,7 @@ class Account < ActiveRecord::Base
   # Timelines
   has_many :stream_entries, inverse_of: :account
   has_many :statuses, inverse_of: :account
+  has_many :favourites, inverse_of: :account
 
   # Follow relations
   has_many :active_relationships,  class_name: 'Follow', foreign_key: 'account_id',        dependent: :destroy
@@ -41,7 +42,7 @@ class Account < ActiveRecord::Base
     self.username
   end
 
-  def summary
+  def content
     self.note
   end
 
diff --git a/app/models/favourite.rb b/app/models/favourite.rb
new file mode 100644
index 000000000..20260f46b
--- /dev/null
+++ b/app/models/favourite.rb
@@ -0,0 +1,38 @@
+class Favourite < ActiveRecord::Base
+  belongs_to :account, inverse_of: :favourites
+  belongs_to :status,  inverse_of: :favourites
+
+  has_one :stream_entry, as: :activity
+
+  def verb
+    :favorite
+  end
+
+  def title
+    "#{self.account.acct} favourited a status by #{self.status.account.acct}"
+  end
+
+  def content
+    title
+  end
+
+  def object_type
+    target.object_type
+  end
+
+  def target
+    self.status
+  end
+
+  def mentions
+    []
+  end
+
+  def thread
+    target
+  end
+
+  after_create do
+    self.account.stream_entries.create!(activity: self)
+  end
+end
diff --git a/app/models/follow.rb b/app/models/follow.rb
index 203215947..aa723d705 100644
--- a/app/models/follow.rb
+++ b/app/models/follow.rb
@@ -2,20 +2,23 @@ class Follow < ActiveRecord::Base
   belongs_to :account
   belongs_to :target_account, class_name: 'Account'
 
+  has_one :stream_entry, as: :activity
+
   validates :account, :target_account, presence: true
+  validates :account_id, uniqueness: { scope: :target_account_id }
 
   def verb
     :follow
   end
 
-  def object_type
-    :person
-  end
-
   def target
     self.target_account
   end
 
+  def object_type
+    target.object_type
+  end
+
   def content
     "#{self.account.acct} started following #{self.target_account.acct}"
   end
@@ -24,6 +27,10 @@ class Follow < ActiveRecord::Base
     content
   end
 
+  def mentions
+    []
+  end
+
   after_create do
     self.account.stream_entries.create!(activity: self)
   end
diff --git a/app/models/status.rb b/app/models/status.rb
index c0b0ca9d9..72bf1b790 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -1,24 +1,56 @@
 class Status < ActiveRecord::Base
   belongs_to :account, inverse_of: :statuses
 
+  belongs_to :thread, foreign_key: 'in_reply_to_id', class_name: 'Status'
+  belongs_to :reblog, foreign_key: 'reblog_of_id', class_name: 'Status'
+
+  has_one :stream_entry, as: :activity
+  has_many :favourites, inverse_of: :status
+
   validates :account, presence: true
+  validates :uri, uniqueness: true, unless: 'local?'
+
+  def local?
+    self.uri.nil?
+  end
+
+  def reblog?
+    !self.reblog_of_id.nil?
+  end
+
+  def reply?
+    !self.in_reply_to_id.nil?
+  end
 
   def verb
-    :post
+    reblog? ? :share : :post
   end
 
   def object_type
-    :note
+    reply? ? :comment : :note
   end
 
   def content
-    self.text
+    reblog? ? self.reblog.text : self.text
+  end
+
+  def target
+    self.reblog
   end
 
   def title
     content.truncate(80, omission: "...")
   end
 
+  def mentions
+    m = []
+
+    m << thread.account if reply?
+    m << reblog.account if reblog?
+
+    m
+  end
+
   after_create do
     self.account.stream_entries.create!(activity: self)
   end
diff --git a/app/models/stream_entry.rb b/app/models/stream_entry.rb
index 7a182bb5d..a3ae099a1 100644
--- a/app/models/stream_entry.rb
+++ b/app/models/stream_entry.rb
@@ -5,7 +5,7 @@ class StreamEntry < ActiveRecord::Base
   validates :account, :activity, presence: true
 
   def object_type
-    self.activity.object_type
+    targeted? ? :activity : self.activity.object_type
   end
 
   def verb
@@ -13,7 +13,7 @@ class StreamEntry < ActiveRecord::Base
   end
 
   def targeted?
-    [:follow].include? self.verb
+    [:follow, :share, :favorite].include? verb
   end
 
   def target
@@ -27,4 +27,16 @@ class StreamEntry < ActiveRecord::Base
   def content
     self.activity.content
   end
+
+  def threaded?
+    [:favorite, :comment].include? verb
+  end
+
+  def thread
+    self.activity.thread
+  end
+
+  def mentions
+    self.activity.mentions
+  end
 end