# frozen_string_literal: true class ApplicationRequest < ActiveRecord::Base enum :req_type, { http_total: 0, http_2xx: 1, http_background: 2, http_3xx: 3, http_4xx: 4, http_5xx: 5, page_view_crawler: 6, page_view_logged_in: 7, page_view_anon: 8, page_view_logged_in_mobile: 9, page_view_anon_mobile: 10, api: 11, user_api: 12, page_view_anon_browser: 13, page_view_anon_browser_mobile: 14, page_view_logged_in_browser: 15, page_view_logged_in_browser_mobile: 16, } include CachedCounting def self.disable @disabled = true end def self.enable @disabled = false end def self.increment!(req_type) return if @disabled perform_increment!(req_type) end def self.write_cache!(req_type, count, date) req_type_id = req_types[req_type] DB.exec(<<~SQL, date: date, req_type_id: req_type_id, count: count) INSERT INTO application_requests (date, req_type, count) VALUES (:date, :req_type_id, :count) ON CONFLICT (date, req_type) DO UPDATE SET count = application_requests.count + excluded.count SQL end def self.stats s = HashWithIndifferentAccess.new({}) self.req_types.each do |key, i| query = self.where(req_type: i) s["#{key}_total"] = query.sum(:count) s["#{key}_30_days"] = query.where("date > ?", 30.days.ago).sum(:count) s["#{key}_28_days"] = query.where("date > ?", 28.days.ago).sum(:count) s["#{key}_7_days"] = query.where("date > ?", 7.days.ago).sum(:count) end s end def self.request_type_count_for_period(type, since) id = self.req_types[type] if !id raise ArgumentError.new( "unknown request type #{type.inspect} in ApplicationRequest.req_types", ) end self.where(req_type: id).where("date >= ?", since).sum(:count) end end # == Schema Information # # Table name: application_requests # # id :integer not null, primary key # date :date not null # req_type :integer not null # count :integer default(0), not null # # Indexes # # index_application_requests_on_date_and_req_type (date,req_type) UNIQUE #