lib/acts_as_messageable/scopes.rb
# typed: strict
# frozen_string_literal: true
require 'active_support/concern'
module ActsAsMessageable
module Scopes
extend ActiveSupport::Concern
module ClassMethods
# @return [Object]
# @param [String, Symbol] search_scope
extend T::Helpers
extend T::Sig
requires_ancestor { T.class_of(ActiveRecord::Base) }
include Kernel
sig { params(search_scope: T.any(String, Symbol)).void }
def initialize_scopes(search_scope)
scope :are_from, lambda { |*args|
where(sent_messageable_id: args.first, sent_messageable_type: args.first.class.name)
}
scope :are_to, lambda { |*args|
where(received_messageable_id: args.first, received_messageable_type: args.first.class.name)
}
scope search_scope, lambda { |*args|
where('body like :search_txt or topic like :search_txt', search_txt: "%#{args.first}%")
}
scope :connected_with, lambda { |*args|
where("(sent_messageable_type = :sent_type and
sent_messageable_id = :sent_id and
sender_delete = :s_delete and sender_permanent_delete = :s_perm_delete) or
(received_messageable_type = :received_type and
received_messageable_id = :received_id and
recipient_delete = :r_delete and recipient_permanent_delete = :r_perm_delete)",
sent_type: args.first.class.resolve_active_record_ancestor.to_s,
sent_id: args.first.id,
received_type: args.first.class.resolve_active_record_ancestor.to_s,
received_id: args.first.id,
r_delete: args.last,
s_delete: args.last,
r_perm_delete: false,
s_perm_delete: false)
}
scope :readed, -> { where('opened_at is not null OR opened = ?', true) }
scope :unreaded, -> { where('opened_at is null OR opened = ?', false) }
scope :deleted, -> { where(recipient_delete: true, sender_delete: true) }
end
end
end
end