about summary refs log tree commit diff
path: root/app/models
diff options
context:
space:
mode:
Diffstat (limited to 'app/models')
-rw-r--r--app/models/account.rb32
-rw-r--r--app/models/follow.rb8
-rw-r--r--app/models/status.rb4
-rw-r--r--app/models/stream_entry.rb33
-rw-r--r--app/models/user.rb3
5 files changed, 80 insertions, 0 deletions
diff --git a/app/models/account.rb b/app/models/account.rb
index c0b153794..90e8d7610 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -1,6 +1,38 @@
 class Account < ActiveRecord::Base
+  # Local users
+  has_one :user, inverse_of: :account
+
+  # Timelines
+  has_many :stream_entries, inverse_of: :account
   has_many :statuses, inverse_of: :account
 
+  # Follow relations
+  has_many :active_relationships,  class_name: 'Follow', foreign_key: 'account_id',        dependent: :destroy
+  has_many :passive_relationships, class_name: 'Follow', foreign_key: 'target_account_id', dependent: :destroy
+
+  has_many :following, through: :active_relationships,  source: :target_account
+  has_many :followers, through: :passive_relationships, source: :account
+
+  def follow!(other_account)
+    self.active_relationships.create!(target_account: other_account)
+  end
+
+  def unfollow!(other_account)
+    self.active_relationships.find_by(target_account: other_account).destroy
+  end
+
+  def following?(other_account)
+    following.include?(other_account)
+  end
+
+  def local?
+    self.domain.nil?
+  end
+
+  def keypair
+    self.private_key.nil? ? OpenSSL::PKey::RSA.new(self.public_key) : OpenSSL::PKey::RSA.new(self.private_key)
+  end
+
   def subscription(webhook_url)
     @subscription ||= OStatus2::Subscription.new(self.remote_url, secret: self.secret, token: self.verify_token, webhook: webhook_url, hub: self.hub_url)
   end
diff --git a/app/models/follow.rb b/app/models/follow.rb
new file mode 100644
index 000000000..eec01b9ba
--- /dev/null
+++ b/app/models/follow.rb
@@ -0,0 +1,8 @@
+class Follow < ActiveRecord::Base
+  belongs_to :account
+  belongs_to :target_account, class_name: 'Account'
+
+  after_create do
+    self.account.stream_entries.create!(activity: self)
+  end
+end
diff --git a/app/models/status.rb b/app/models/status.rb
index a1278ccaa..d98297643 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -1,3 +1,7 @@
 class Status < ActiveRecord::Base
   belongs_to :account, inverse_of: :statuses
+
+  after_create do
+    self.account.stream_entries.create!(activity: self)
+  end
 end
diff --git a/app/models/stream_entry.rb b/app/models/stream_entry.rb
new file mode 100644
index 000000000..cee151a07
--- /dev/null
+++ b/app/models/stream_entry.rb
@@ -0,0 +1,33 @@
+class StreamEntry < ActiveRecord::Base
+  belongs_to :account, inverse_of: :stream_entries
+  belongs_to :activity, polymorphic: true
+
+  def object_type
+    case self.activity_type
+    when 'Status'
+      :note
+    when 'Follow'
+      :person
+    end
+  end
+
+  def verb
+    case self.activity_type
+    when 'Status'
+      :post
+    when 'Follow'
+      :follow
+    end
+  end
+
+  def target
+    case self.activity_type
+    when 'Follow'
+      self.activity.target_account
+    end
+  end
+
+  def content
+    self.activity.text if self.activity_type == 'Status'
+  end
+end
diff --git a/app/models/user.rb b/app/models/user.rb
new file mode 100644
index 000000000..ccfa54e4f
--- /dev/null
+++ b/app/models/user.rb
@@ -0,0 +1,3 @@
+class User < ActiveRecord::Base
+  belongs_to :account, inverse_of: :user
+end