# 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