# frozen_string_literal: true class UnsubscribeKey < ActiveRecord::Base belongs_to :user belongs_to :post belongs_to :topic before_create :generate_random_key ALL_TYPE = "all" DIGEST_TYPE = "digest" TOPIC_TYPE = "topic" class << self def create_key_for(user, type, post: nil) unsubscribe_key = new(user_id: user.id, unsubscribe_key_type: type) if type == TOPIC_TYPE unsubscribe_key.topic_id = post.topic_id unsubscribe_key.post_id = post.id end unsubscribe_key.save! unsubscribe_key.key end def user_for_key(key) where(key: key).first&.user end def get_unsubscribe_strategy_for(key) strategies = { DIGEST_TYPE => EmailControllerHelper::DigestEmailUnsubscriber, TOPIC_TYPE => EmailControllerHelper::TopicEmailUnsubscriber, ALL_TYPE => EmailControllerHelper::BaseEmailUnsubscriber, } DiscoursePluginRegistry.email_unsubscribers.each do |unsubcriber| strategies.merge!(unsubcriber) end strategies[key.unsubscribe_key_type]&.new(key) end end def associated_topic @associated_topic ||= topic || post&.topic end private def generate_random_key self.key = SecureRandom.hex(32) end end # == Schema Information # # Table name: unsubscribe_keys # # key :string(64) not null, primary key # user_id :integer not null # created_at :datetime not null # updated_at :datetime not null # unsubscribe_key_type :string # topic_id :integer # post_id :integer # # Indexes # # index_unsubscribe_keys_on_created_at (created_at) #