mumuki/mumuki-domain

View on GitHub
app/models/user_stats.rb

Summary

Maintainability
A
0 mins
Test Coverage
class UserStats < ApplicationRecord
  belongs_to :organization
  belongs_to :user

  def self.stats_for(user)
    UserStats.find_or_initialize_by(user: user, organization: Organization.current)
  end

  def self.exp_for(user)
    self.stats_for(user).exp
  end

  def activity(date_range = nil)
    date_filter = { submitted_at: date_range }.compact
    {
        exercises: {
            solved_count: organization_exercises
                              .joins(:assignments)
                              .where(assignments: { top_submission_status: [:passed, :skipped], submitter: user, organization: organization }.merge(date_filter))
                              .count,
            count: organization_exercises.count
        },
        messages: messages_in_discussions_count(date_range)
    }
  end

  def add_exp!(points)
    self.exp += points
  end

  private

  def messages_in_discussions_count(date_range = nil)
    date_filter = { created_at: date_range }.compact
    result = user.forum_messages.joins(:discussion)
        .where({deletion_motive: nil, discussions: { organization: organization }}.merge(date_filter))
        .group(:approved)
        .count
    unapproved = result[false] || 0
    approved = result[true] || 0

    { count: unapproved + approved, approved: approved }
  end

  def organization_exercises
    @organization_exercises ||= organization.exercises
  end
end