57 lines
1.2 KiB
Ruby
57 lines
1.2 KiB
Ruby
# frozen_string_literal: true
|
|
|
|
class IpAddress < ApplicationRecord
|
|
belongs_to :model, polymorphic: true
|
|
belongs_to :user
|
|
attribute :ip_addr, :ip_address
|
|
|
|
def self.model_types
|
|
%w[Post User Comment Dmail ArtistVersion ArtistCommentaryVersion NoteVersion WikiPageVersion]
|
|
end
|
|
|
|
def self.visible(user)
|
|
user.is_admin? ? all : where.not(model_type: "Dmail")
|
|
end
|
|
|
|
def self.search(params)
|
|
q = search_attributes(params, :ip_addr, :user, :model)
|
|
q.order(created_at: :desc)
|
|
end
|
|
|
|
def self.group_by_ip_addr(ipv4_masklen = nil, ipv6_masklen = nil)
|
|
ipv4_masklen ||= 32
|
|
ipv6_masklen ||= 128
|
|
|
|
q = select(sanitize_sql([<<~SQL.squish, ipv4_masklen, ipv6_masklen]))
|
|
CASE
|
|
WHEN family(ip_addr) = 4
|
|
THEN network(set_masklen(ip_addr, ?))
|
|
ELSE network(set_masklen(ip_addr, ?))
|
|
END AS ip_addr,
|
|
COUNT(*) AS count_all
|
|
SQL
|
|
|
|
q.group("1").reorder("count_all DESC, ip_addr")
|
|
end
|
|
|
|
def self.group_by_user
|
|
group(:user_id).select("user_id, COUNT(*) AS count_all").reorder("count_all DESC, user_id")
|
|
end
|
|
|
|
def lookup
|
|
@lookup ||= ip_addr.ip_lookup
|
|
end
|
|
|
|
def to_s
|
|
ip_addr.to_s
|
|
end
|
|
|
|
def readonly?
|
|
true
|
|
end
|
|
|
|
def self.available_includes
|
|
[:user, :model]
|
|
end
|
|
end
|