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.rb3
-rw-r--r--app/models/defederating_status.rb21
-rw-r--r--app/models/destructing_status.rb1
-rw-r--r--app/models/status.rb19
-rw-r--r--app/models/user.rb15
5 files changed, 59 insertions, 0 deletions
diff --git a/app/models/account.rb b/app/models/account.rb
index 59685a13b..9cfacc1c0 100644
--- a/app/models/account.rb
+++ b/app/models/account.rb
@@ -135,6 +135,9 @@ class Account < ApplicationRecord
            :max_public_history,
            :max_public_access,
            :roar_lifespan,
+           :roar_lifespan_old,
+           :roar_defederate,
+           :roar_defederate_old,
            :delayed_roars?,
 
            :hides_public_profile?,
diff --git a/app/models/defederating_status.rb b/app/models/defederating_status.rb
new file mode 100644
index 000000000..e6af6c1b6
--- /dev/null
+++ b/app/models/defederating_status.rb
@@ -0,0 +1,21 @@
+# == Schema Information
+#
+# Table name: defederating_statuses
+#
+#  id               :bigint(8)        not null, primary key
+#  status_id        :bigint(8)
+#  defederate_after :datetime
+#
+
+class DefederatingStatus < ApplicationRecord
+  belongs_to :status, inverse_of: :defederating_status
+
+  validate :validate_future_date
+  validates :status_id, uniqueness: true
+
+  private
+
+  def validate_future_date
+    errors.add(:defederate_after, I18n.t('defederating_statuses.too_soon')) if defederate_after.present? && defederate_after < Time.now.utc + PostStatusService::MIN_DESTRUCT_OFFSET
+  end
+end
diff --git a/app/models/destructing_status.rb b/app/models/destructing_status.rb
index 349e276cb..e22fa402c 100644
--- a/app/models/destructing_status.rb
+++ b/app/models/destructing_status.rb
@@ -11,6 +11,7 @@ class DestructingStatus < ApplicationRecord
   belongs_to :status, inverse_of: :destructing_status
 
   validate :validate_future_date
+  validates :status_id, uniqueness: true
 
   private
 
diff --git a/app/models/status.rb b/app/models/status.rb
index 001437795..f21a2087e 100644
--- a/app/models/status.rb
+++ b/app/models/status.rb
@@ -82,6 +82,7 @@ class Status < ApplicationRecord
   has_one :status_stat, inverse_of: :status
   has_one :poll, inverse_of: :status, dependent: :destroy
   has_one :destructing_status, inverse_of: :status, dependent: :destroy
+  has_one :defederating_status, inverse_of: :status, dependent: :destroy
   has_one :imported_status, inverse_of: :status, dependent: :destroy
   has_one :sharekey, inverse_of: :status, dependent: :destroy
 
@@ -284,6 +285,10 @@ class Status < ApplicationRecord
   end
 
   def delete_after=(value)
+    if defederate_after && defederate_after < (Time.now.utc + 5.minutes + value)
+      value = 5.minutes + value
+    end
+
     if destructing_status.nil?
       DestructingStatus.create!(status_id: id, delete_after: Time.now.utc + value)
     else
@@ -291,6 +296,20 @@ class Status < ApplicationRecord
     end
   end
 
+  def defederate_after
+    defederating_status&.defederate_after
+  end
+
+  def defederate_after=(value)
+    return unless delete_after.nil? || delete_after >= (Time.now.utc + 5.minutes + value)
+
+    if defederating_status.nil?
+      DefederatingStatus.create!(status_id: id, defederate_after: Time.now.utc + value)
+    else
+      defederating_status.defederate_after = Time.now.utc + value
+    end
+  end
+
   def mark_for_mass_destruction!
     @marked_for_mass_destruction = true
   end
diff --git a/app/models/user.rb b/app/models/user.rb
index 6c18898e9..b28e3229f 100644
--- a/app/models/user.rb
+++ b/app/models/user.rb
@@ -148,6 +148,9 @@ class User < ApplicationRecord
     :max_public_history,
     :max_public_access,
     :roar_lifespan,
+    :roar_lifespan_old,
+    :roar_defederate,
+    :roar_defederate_old,
     :delayed_roars,
     :delayed_for,
     :boost_interval,
@@ -340,6 +343,18 @@ class User < ApplicationRecord
     @_roar_lifespan ||= [0, (settings.roar_lifespan || 0).to_i].max
   end
 
+  def roar_lifespan_old
+    @_roar_lifespan_old ||= (settings.roar_lifespan_old || false)
+  end
+
+  def roar_defederate
+    @_roar_defederate ||= [0, (settings.roar_defederate || 0).to_i].max
+  end
+
+  def roar_defederate_old
+    @_roar_defederate_old ||= (settings.roar_defederate_old || false)
+  end
+
   def delayed_roars?
     @delayed_roars ||= (settings.delayed_roars || false)
   end