- # Use a single timestamp for all validations, even though each
- # validation runs at a different time.
- def set_validation_timestamp
- @validation_timestamp = db_current_time
- end
-
- # If trash_at is being changed to a time in the past, change it to
- # now. This allows clients to say "expires {client-current-time}"
- # without failing due to clock skew, while avoiding odd log entries
- # like "expiry date changed to {1 year ago}".
- def ensure_trash_at_not_in_past
- if trash_at_changed? && trash_at
- self.trash_at = [@validation_timestamp, trash_at].max
- end
- end
-
- # Caller can move into/out of trash by setting/clearing is_trashed
- # -- however, if the caller also changes trash_at, then any changes
- # to is_trashed are ignored.
- def sync_trash_state
- if is_trashed_changed? && !trash_at_changed?
- if is_trashed
- self.trash_at = @validation_timestamp
- else
- self.trash_at = nil
- self.delete_at = nil
- end
- end
- self.is_trashed = trash_at && trash_at <= @validation_timestamp || false
- true
- end
-
- # If trash_at is updated without touching delete_at, automatically
- # update delete_at to a sensible value.
- def default_trash_interval
- if trash_at_changed? && !delete_at_changed?
- if trash_at.nil?
- self.delete_at = nil
- else
- self.delete_at = trash_at + Rails.configuration.default_trash_lifetime.seconds
- end
- end
- end
-
- def validate_trash_and_delete_timing
- if trash_at.nil? != delete_at.nil?
- errors.add :delete_at, "must be set if trash_at is set, and must be nil otherwise"
- end
-
- earliest_delete = ([@validation_timestamp, trash_at_was].compact.min +
- Rails.configuration.blob_signature_ttl.seconds)
- if delete_at && delete_at < earliest_delete
- errors.add :delete_at, "#{delete_at} is too soon: earliest allowed is #{earliest_delete}"
- end
-
- if delete_at && delete_at < trash_at
- errors.add :delete_at, "must not be earlier than trash_at"
- end
-
- true
- end