View raw

1 class TartifletteScoringService 2 def self.scored?(tartiflette, session) 3 session[:scored_tartiflettes] ||= [] 4 session[:scored_tartiflettes].include?(tartiflette.id) 5 end 6 7 def self.mark_as_scored(tartiflette, session) 8 session[:scored_tartiflettes] ||= [] 9 session[:scored_tartiflettes] << tartiflette.id unless scored?(tartiflette, session) 10 end 11 12 def self.submit_scores(tartiflette, scores, session) 13 scores.each do |scoring_criterium_id, score_params| 14 Score.create!( 15 session_id: session[:id], 16 tartiflette: tartiflette, 17 scoring_criterium_id: scoring_criterium_id, 18 value: score_params[:value] 19 ) 20 end 21 mark_as_scored(tartiflette, session) 22 rescue ActiveRecord::RecordInvalid => e 23 raise StandardError, "Failed to create score: #{e.message}" 24 end 25 26 def self.update_scores(tartiflette, scores, session) 27 scores.each do |score_id, score_params| 28 score = tartiflette.scores.find(score_id) 29 score.update!(value: score_params[:value]) 30 end 31 rescue ActiveRecord::RecordInvalid => e 32 raise StandardError, "Failed to update score: #{e.message}" 33 end 34 35 private 36 37 def self.average_score(tartiflette) 38 tartiflette.scores.average(:value).to_f 39 end 40 41 def self.average_score_by_category(tartiflette) 42 tartiflette 43 .scores 44 .group_by { |score| score.scoring_criterium.category } 45 .transform_values do |scores| 46 (scores.sum(&:value).to_f / scores.size).round(2) 47 end 48 end 49 50 def self.total_score_by_category(tartiflette) 51 tartiflette 52 .scores 53 .group_by { |score| score.scoring_criterium.category } 54 .transform_values do |scores| 55 scores.sum(&:value).to_f.round(2) 56 end 57 end 58 59 def self.leaderboard 60 Tartiflette 61 .joins(:scores) 62 .select("tartiflettes.*, SUM(scores.value) AS total_score") 63 .group("tartiflettes.id") 64 .order("total_score DESC") 65 .map { |tartiflette| [ tartiflette, tartiflette.total_score.to_f ] } 66 end 67 end 68