get '/stats/?' do require_admin @stats = { total_sites: Site.count, total_unbanned_sites: Site.where(is_banned: false).count, total_banned_sites: Site.where(is_banned: true).count, total_nsfw_sites: Site.where(is_nsfw: true).count, total_unbanned_nsfw_sites: Site.where(is_banned: false, is_nsfw: true).count, total_banned_nsfw_sites: Site.where(is_banned: true, is_nsfw: true).count } # Start with the date of the first created site start = Site.select(:created_at). exclude(created_at: nil). order(:created_at). first[:created_at].to_date runner = start monthly_stats = [] now = Date.today until runner.to_time > now.next_month.to_time monthly_stats.push( date: runner, sites_created: Site.where(created_at: runner..runner.next_month).count, total_from_start: Site.where(created_at: start..runner.next_month).count, supporters: Site.where(created_at: start..runner.next_month).exclude(stripe_customer_id: nil).count, ) runner = runner.next_month end @stats[:monthly_stats] = monthly_stats customers = Stripe::Customer.all @stats[:total_recurring_revenue] = 0.0 subscriptions = [] cancelled_subscriptions = 0 customers.each do |customer| sub = {created_at: Time.at(customer.created)} if customer[:subscriptions] if customer[:subscriptions][:data].empty? sub[:status] = 'cancelled' else sub[:status] = 'active' sub[:amount] = (customer[:subscriptions][:data].first[:plan][:amount] / 100.0).round(2) @stats[:total_recurring_revenue] += sub[:amount] end end subscriptions.push sub end @stats[:subscriptions] = subscriptions erb :'stats' end