summaryrefslogtreecommitdiff
path: root/app/services/tartiflette_scoring_service.rb
diff options
context:
space:
mode:
authorMarius Peter <marius.peter@tutanota.com>2024-12-29 15:14:43 +0100
committerMarius Peter <marius.peter@tutanota.com>2024-12-29 15:14:43 +0100
commitbe2a93525069de2dfa3c23b0c23e7a9f7ad4c03d (patch)
treeb5493e9d35d024ce7be072ec2168b4a98ba0e63f /app/services/tartiflette_scoring_service.rb
First commit.
Diffstat (limited to 'app/services/tartiflette_scoring_service.rb')
-rw-r--r--app/services/tartiflette_scoring_service.rb54
1 files changed, 54 insertions, 0 deletions
diff --git a/app/services/tartiflette_scoring_service.rb b/app/services/tartiflette_scoring_service.rb
new file mode 100644
index 0000000..3514eb1
--- /dev/null
+++ b/app/services/tartiflette_scoring_service.rb
@@ -0,0 +1,54 @@
+class TartifletteScoringService
+ def self.scored?(tartiflette, session)
+ session[:scored_tartiflettes]&.include?(tartiflette.id)
+ end
+
+ def self.mark_as_scored(tartiflette, session)
+ session[:scored_tartiflettes] ||= []
+ unless scored?(tartiflette, session)
+ session[:scored_tartiflettes] << tartiflette.id
+ end
+ end
+
+ def self.submit_scores(tartiflette, scores, session)
+ scores.each do |criterium_id, value|
+ Score.create!(
+ tartiflette: tartiflette,
+ scoring_criterium_id: criterium_id,
+ value: value[:value]
+ )
+ end
+ mark_as_scored(tartiflette, session)
+ end
+
+ def self.average_score(tartiflette)
+ tartiflette.scores.average(:value).to_f
+ end
+
+ def self.average_score_by_category(tartiflette)
+ tartiflette
+ .scores
+ .group_by { |score| score.scoring_criterium.category }
+ .transform_values do |scores|
+ (scores.sum(&:value).to_f / scores.size).round(2)
+ end
+ end
+
+ def self.total_score_by_category(tartiflette)
+ tartiflette
+ .scores
+ .group_by { |score| score.scoring_criterium.category }
+ .transform_values do |scores|
+ (scores.sum(&:value).to_f / scores.size).round(2)
+ end
+ end
+
+ def self.leaderboard
+ Tartiflette
+ .joins(:scores)
+ .select("tartiflettes.*, SUM(scores.value) AS total_score")
+ .group("tartiflettes.id")
+ .order("total_score DESC")
+ .map { |tartiflette| [ tartiflette, tartiflette.total_score.to_f ] }
+ end
+end
Copyright 2019--2025 Marius PETER