Websites/app/logical/api_category.rb

70 lines
1.5 KiB
Ruby

# frozen_string_literal: true
class APICategory
attr_reader :name, :db, :sfw
SOURCES = [
%w[e621.net E621],
%w[furaffinity.net FurAffinity],
%w[inkbunny.net InkBunny],
%w[deviantart.com DeviantArt],
%w[twitter.com Twitter],
%w[x.com X],
%w[femboy.fan FemboyFans],
].freeze
def initialize(name, db, sfw)
@name = name
@db = db
@sfw = sfw
end
def count
APIImage.cached_count(db)
end
def real_count
APIImage.where(category: db).count
end
def unsourced_count
APIImage.internal.where(category: db, sources: []).count
end
def sources
r = APIImage.joins("CROSS JOIN unnest(sources) AS source").where(category: db).distinct.internal
other = r
list = []
APICategory::SOURCES.each do |value, name|
count = r.where("source ILIKE ?", "%#{value}%").count
list << { name: name, count: count }
other = other.where("source NOT ILIKE ?", "%#{value}%")
end
list << { name: "Unsourced", count: unsourced_count }
# noinspection RubyMismatchedArgumentType
list << { name: "Other", count: other.count }
list << { name: "External", count: APIImage.where(category: db).external.count }
list
end
def created_at
APIImage.where(category: db).minimum(:created_at)
end
def updated_at
APIImage.where(category: db).maximum(:updated_at)
end
def as_json(*)
{
name: name,
db: db,
sfw: sfw,
count: count,
}
end
alias to_h as_json
end