# frozen_string_literal: true # For a GitHub like calendar # https://docs.github.com/assets/cb-35216/mw-1440/images/help/profile/contributions-graph.webp module DiscourseRewind module Action class ActivityCalendar < BaseReport FakeData = { data: (Date.new(2024, 1, 1)..Date.new(2024, 12, 31)).map do |date| { date:, post_count: rand(0..20), visited: false } end, identifier: "activity-calendar", } def call return FakeData if Rails.env.development? calendar = Post .unscoped .joins(<<~SQL) RIGHT JOIN generate_series('#{date.first}', '#{date.last}', '1 day'::interval) ON posts.created_at::date = generate_series::date AND posts.user_id = #{user.id} AND posts.deleted_at IS NULL SQL .joins( "LEFT JOIN user_visits ON generate_series::date = visited_at AND user_visits.user_id = #{user.id}", ) .select( "generate_series::date as date, count(posts.id) as post_count, COUNT(visited_at) > 0 as visited", ) .group("generate_series, user_visits.id") .order("generate_series") .map { |row| { date: row.date, post_count: row.post_count, visited: row.visited } } { data: calendar, identifier: "activity-calendar" } end end end end