Skip to content

Commit d152b18

Browse files
committed
fix: solve match statistic details issues
1 parent 519d1aa commit d152b18

1 file changed

Lines changed: 61 additions & 61 deletions

File tree

app/controllers/api/v1/analytics/champions_controller.rb

Lines changed: 61 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -26,67 +26,6 @@ def show
2626
render_success(build_champion_data(player, champion_stats))
2727
end
2828

29-
private
30-
31-
def fetch_champion_stats(player)
32-
PlayerMatchStat.where(player: player)
33-
.group(:champion)
34-
.select(
35-
'champion',
36-
'COUNT(*) as games_played',
37-
'SUM(CASE WHEN matches.victory THEN 1 ELSE 0 END) as wins',
38-
'AVG((kills + assists)::float / NULLIF(deaths, 0)) as avg_kda',
39-
'AVG(cs_per_min) as avg_cs_per_min',
40-
'AVG(damage_dealt_total) as avg_damage_dealt',
41-
'AVG(damage_taken) as avg_damage_taken',
42-
'AVG(gold_per_min) as avg_gold_per_min',
43-
'AVG(vision_score) as avg_vision_score'
44-
)
45-
.joins(:match)
46-
.order('games_played DESC')
47-
end
48-
49-
def build_champion_stats(stats)
50-
riot_service = RiotCdnService.new
51-
stats.map { |stat| build_champion_stat_hash(stat, riot_service) }
52-
end
53-
54-
def build_champion_stat_hash(stat, riot_service)
55-
win_rate = stat.games_played.zero? ? 0 : (stat.wins.to_f / stat.games_played)
56-
{
57-
champion: stat.champion,
58-
games_played: stat.games_played,
59-
win_rate: win_rate,
60-
avg_kda: stat.avg_kda&.round(2) || 0,
61-
avg_cs_per_min: stat.avg_cs_per_min&.round(1) || 0.0,
62-
avg_damage_dealt: stat.avg_damage_dealt&.round(0) || 0,
63-
avg_damage_taken: stat.avg_damage_taken&.round(0) || 0,
64-
avg_gold_per_min: stat.avg_gold_per_min&.round(0) || 0,
65-
avg_vision_score: stat.avg_vision_score&.round(1) || 0.0,
66-
mastery_grade: calculate_mastery_grade(win_rate, stat.avg_kda),
67-
icon_url: riot_service.champion_icon_url(stat.champion)
68-
}
69-
end
70-
71-
def build_champion_data(player, champion_stats)
72-
{
73-
player: PlayerSerializer.render_as_hash(player),
74-
champion_stats: champion_stats,
75-
top_champions: champion_stats.take(5),
76-
champion_diversity: {
77-
total_champions: champion_stats.count,
78-
highly_played: champion_stats.count { |c| c[:games_played] >= 10 },
79-
average_games: if champion_stats.empty?
80-
0
81-
else
82-
(champion_stats.sum do |c|
83-
c[:games_played]
84-
end / champion_stats.count.to_f).round(1)
85-
end
86-
}
87-
}
88-
end
89-
9029
def details
9130
player = organization_scoped(Player).find(params[:player_id])
9231
champion = params[:champion]
@@ -212,6 +151,67 @@ def details
212151

213152
private
214153

154+
def fetch_champion_stats(player)
155+
PlayerMatchStat.where(player: player)
156+
.group(:champion)
157+
.select(
158+
'champion',
159+
'COUNT(*) as games_played',
160+
'SUM(CASE WHEN matches.victory THEN 1 ELSE 0 END) as wins',
161+
'AVG((kills + assists)::float / NULLIF(deaths, 0)) as avg_kda',
162+
'AVG(cs_per_min) as avg_cs_per_min',
163+
'AVG(damage_dealt_total) as avg_damage_dealt',
164+
'AVG(damage_taken) as avg_damage_taken',
165+
'AVG(gold_per_min) as avg_gold_per_min',
166+
'AVG(vision_score) as avg_vision_score'
167+
)
168+
.joins(:match)
169+
.order('games_played DESC')
170+
end
171+
172+
def build_champion_stats(stats)
173+
riot_service = RiotCdnService.new
174+
stats.map { |stat| build_champion_stat_hash(stat, riot_service) }
175+
end
176+
177+
def build_champion_stat_hash(stat, riot_service)
178+
win_rate = stat.games_played.zero? ? 0 : (stat.wins.to_f / stat.games_played)
179+
{
180+
champion: stat.champion,
181+
games_played: stat.games_played,
182+
win_rate: win_rate,
183+
avg_kda: stat.avg_kda&.round(2) || 0,
184+
avg_cs_per_min: stat.avg_cs_per_min&.round(1) || 0.0,
185+
avg_damage_dealt: stat.avg_damage_dealt&.round(0) || 0,
186+
avg_damage_taken: stat.avg_damage_taken&.round(0) || 0,
187+
avg_gold_per_min: stat.avg_gold_per_min&.round(0) || 0,
188+
avg_vision_score: stat.avg_vision_score&.round(1) || 0.0,
189+
mastery_grade: calculate_mastery_grade(win_rate, stat.avg_kda),
190+
icon_url: riot_service.champion_icon_url(stat.champion)
191+
}
192+
end
193+
194+
def build_champion_data(player, champion_stats)
195+
{
196+
player: PlayerSerializer.render_as_hash(player),
197+
champion_stats: champion_stats,
198+
top_champions: champion_stats.take(5),
199+
champion_diversity: {
200+
total_champions: champion_stats.count,
201+
highly_played: champion_stats.count { |c| c[:games_played] >= 10 },
202+
average_games: if champion_stats.empty?
203+
0
204+
else
205+
(champion_stats.sum do |c|
206+
c[:games_played]
207+
end / champion_stats.count.to_f).round(1)
208+
end
209+
}
210+
}
211+
end
212+
213+
private
214+
215215
def calculate_mastery_grade(win_rate, avg_kda)
216216
score = (win_rate * 100 * 0.6) + ((avg_kda || 0) * 10 * 0.4)
217217

0 commit comments

Comments
 (0)