Skip to content

Commit c56fd68

Browse files
committed
chore: style(controllers/analytics): auto-correct rubocop offenses
Applied rubocop auto-corrections to analytics controllers: - Add frozen_string_literal comments - Fix string literals and spacing - Improve code formatting
1 parent db7040e commit c56fd68

13 files changed

Lines changed: 1042 additions & 977 deletions
Lines changed: 68 additions & 54 deletions
Original file line numberDiff line numberDiff line change
@@ -1,54 +1,68 @@
1-
class Api::V1::Analytics::ChampionsController < Api::V1::BaseController
2-
def show
3-
player = organization_scoped(Player).find(params[:player_id])
4-
5-
stats = PlayerMatchStat.where(player: player)
6-
.group(:champion)
7-
.select(
8-
'champion',
9-
'COUNT(*) as games_played',
10-
'SUM(CASE WHEN matches.victory THEN 1 ELSE 0 END) as wins',
11-
'AVG((kills + assists)::float / NULLIF(deaths, 0)) as avg_kda'
12-
)
13-
.joins(:match)
14-
.order('games_played DESC')
15-
16-
champion_stats = stats.map do |stat|
17-
win_rate = stat.games_played.zero? ? 0 : (stat.wins.to_f / stat.games_played)
18-
{
19-
champion: stat.champion,
20-
games_played: stat.games_played,
21-
win_rate: win_rate,
22-
avg_kda: stat.avg_kda&.round(2) || 0,
23-
mastery_grade: calculate_mastery_grade(win_rate, stat.avg_kda)
24-
}
25-
end
26-
27-
champion_data = {
28-
player: PlayerSerializer.render_as_hash(player),
29-
champion_stats: champion_stats,
30-
top_champions: champion_stats.take(5),
31-
champion_diversity: {
32-
total_champions: champion_stats.count,
33-
highly_played: champion_stats.count { |c| c[:games_played] >= 10 },
34-
average_games: champion_stats.empty? ? 0 : (champion_stats.sum { |c| c[:games_played] } / champion_stats.count.to_f).round(1)
35-
}
36-
}
37-
38-
render_success(champion_data)
39-
end
40-
41-
private
42-
43-
def calculate_mastery_grade(win_rate, avg_kda)
44-
score = (win_rate * 100 * 0.6) + ((avg_kda || 0) * 10 * 0.4)
45-
46-
case score
47-
when 80..Float::INFINITY then 'S'
48-
when 70...80 then 'A'
49-
when 60...70 then 'B'
50-
when 50...60 then 'C'
51-
else 'D'
52-
end
53-
end
54-
end
1+
# frozen_string_literal: true
2+
3+
module Api
4+
module V1
5+
module Analytics
6+
class ChampionsController < Api::V1::BaseController
7+
def show
8+
player = organization_scoped(Player).find(params[:player_id])
9+
10+
stats = PlayerMatchStat.where(player: player)
11+
.group(:champion)
12+
.select(
13+
'champion',
14+
'COUNT(*) as games_played',
15+
'SUM(CASE WHEN matches.victory THEN 1 ELSE 0 END) as wins',
16+
'AVG((kills + assists)::float / NULLIF(deaths, 0)) as avg_kda'
17+
)
18+
.joins(:match)
19+
.order('games_played DESC')
20+
21+
champion_stats = stats.map do |stat|
22+
win_rate = stat.games_played.zero? ? 0 : (stat.wins.to_f / stat.games_played)
23+
{
24+
champion: stat.champion,
25+
games_played: stat.games_played,
26+
win_rate: win_rate,
27+
avg_kda: stat.avg_kda&.round(2) || 0,
28+
mastery_grade: calculate_mastery_grade(win_rate, stat.avg_kda)
29+
}
30+
end
31+
32+
champion_data = {
33+
player: PlayerSerializer.render_as_hash(player),
34+
champion_stats: champion_stats,
35+
top_champions: champion_stats.take(5),
36+
champion_diversity: {
37+
total_champions: champion_stats.count,
38+
highly_played: champion_stats.count { |c| c[:games_played] >= 10 },
39+
average_games: if champion_stats.empty?
40+
0
41+
else
42+
(champion_stats.sum do |c|
43+
c[:games_played]
44+
end / champion_stats.count.to_f).round(1)
45+
end
46+
}
47+
}
48+
49+
render_success(champion_data)
50+
end
51+
52+
private
53+
54+
def calculate_mastery_grade(win_rate, avg_kda)
55+
score = (win_rate * 100 * 0.6) + ((avg_kda || 0) * 10 * 0.4)
56+
57+
case score
58+
when 80..Float::INFINITY then 'S'
59+
when 70...80 then 'A'
60+
when 60...70 then 'B'
61+
when 50...60 then 'C'
62+
else 'D'
63+
end
64+
end
65+
end
66+
end
67+
end
68+
end
Lines changed: 57 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -1,49 +1,57 @@
1-
class Api::V1::Analytics::KdaTrendController < Api::V1::BaseController
2-
def show
3-
player = organization_scoped(Player).find(params[:player_id])
4-
5-
# Get recent matches for the player
6-
stats = PlayerMatchStat.joins(:match)
7-
.where(player: player, matches: { organization_id: current_organization.id })
8-
.order('matches.game_start DESC')
9-
.limit(50)
10-
.includes(:match)
11-
12-
trend_data = {
13-
player: PlayerSerializer.render_as_hash(player),
14-
kda_by_match: stats.map do |stat|
15-
kda = stat.deaths.zero? ? (stat.kills + stat.assists).to_f : ((stat.kills + stat.assists).to_f / stat.deaths)
16-
{
17-
match_id: stat.match.id,
18-
date: stat.match.game_start,
19-
kills: stat.kills,
20-
deaths: stat.deaths,
21-
assists: stat.assists,
22-
kda: kda.round(2),
23-
champion: stat.champion,
24-
victory: stat.match.victory
25-
}
26-
end,
27-
averages: {
28-
last_10_games: calculate_kda_average(stats.limit(10)),
29-
last_20_games: calculate_kda_average(stats.limit(20)),
30-
overall: calculate_kda_average(stats)
31-
}
32-
}
33-
34-
render_success(trend_data)
35-
end
36-
37-
private
38-
39-
def calculate_kda_average(stats)
40-
return 0 if stats.empty?
41-
42-
total_kills = stats.sum(:kills)
43-
total_deaths = stats.sum(:deaths)
44-
total_assists = stats.sum(:assists)
45-
46-
deaths = total_deaths.zero? ? 1 : total_deaths
47-
((total_kills + total_assists).to_f / deaths).round(2)
48-
end
49-
end
1+
# frozen_string_literal: true
2+
3+
module Api
4+
module V1
5+
module Analytics
6+
class KdaTrendController < Api::V1::BaseController
7+
def show
8+
player = organization_scoped(Player).find(params[:player_id])
9+
10+
# Get recent matches for the player
11+
stats = PlayerMatchStat.joins(:match)
12+
.where(player: player, matches: { organization_id: current_organization.id })
13+
.order('matches.game_start DESC')
14+
.limit(50)
15+
.includes(:match)
16+
17+
trend_data = {
18+
player: PlayerSerializer.render_as_hash(player),
19+
kda_by_match: stats.map do |stat|
20+
kda = stat.deaths.zero? ? (stat.kills + stat.assists).to_f : ((stat.kills + stat.assists).to_f / stat.deaths)
21+
{
22+
match_id: stat.match.id,
23+
date: stat.match.game_start,
24+
kills: stat.kills,
25+
deaths: stat.deaths,
26+
assists: stat.assists,
27+
kda: kda.round(2),
28+
champion: stat.champion,
29+
victory: stat.match.victory
30+
}
31+
end,
32+
averages: {
33+
last_10_games: calculate_kda_average(stats.limit(10)),
34+
last_20_games: calculate_kda_average(stats.limit(20)),
35+
overall: calculate_kda_average(stats)
36+
}
37+
}
38+
39+
render_success(trend_data)
40+
end
41+
42+
private
43+
44+
def calculate_kda_average(stats)
45+
return 0 if stats.empty?
46+
47+
total_kills = stats.sum(:kills)
48+
total_deaths = stats.sum(:deaths)
49+
total_assists = stats.sum(:assists)
50+
51+
deaths = total_deaths.zero? ? 1 : total_deaths
52+
((total_kills + total_assists).to_f / deaths).round(2)
53+
end
54+
end
55+
end
56+
end
57+
end
Lines changed: 70 additions & 61 deletions
Original file line numberDiff line numberDiff line change
@@ -1,61 +1,70 @@
1-
class Api::V1::Analytics::LaningController < Api::V1::BaseController
2-
def show
3-
player = organization_scoped(Player).find(params[:player_id])
4-
5-
stats = PlayerMatchStat.joins(:match)
6-
.where(player: player, match: { organization: current_organization })
7-
.order('matches.game_start DESC')
8-
.limit(20)
9-
10-
laning_data = {
11-
player: PlayerSerializer.render_as_hash(player),
12-
cs_performance: {
13-
avg_cs_total: stats.average('minions_killed + jungle_minions_killed')&.round(1),
14-
avg_cs_per_min: calculate_avg_cs_per_min(stats),
15-
best_cs_game: stats.maximum('minions_killed + jungle_minions_killed'),
16-
worst_cs_game: stats.minimum('minions_killed + jungle_minions_killed')
17-
},
18-
gold_performance: {
19-
avg_gold: stats.average(:gold_earned)&.round(0),
20-
best_gold_game: stats.maximum(:gold_earned),
21-
worst_gold_game: stats.minimum(:gold_earned)
22-
},
23-
cs_by_match: stats.map do |stat|
24-
match_duration_mins = stat.match.game_duration ? stat.match.game_duration / 60.0 : 25
25-
cs_total = (stat.minions_killed || 0) + (stat.jungle_minions_killed || 0)
26-
cs_per_min = cs_total / match_duration_mins
27-
28-
{
29-
match_id: stat.match.id,
30-
date: stat.match.game_start,
31-
cs_total: cs_total,
32-
cs_per_min: cs_per_min.round(1),
33-
gold: stat.gold_earned,
34-
champion: stat.champion,
35-
victory: stat.match.victory
36-
}
37-
end
38-
}
39-
40-
render_success(laning_data)
41-
end
42-
43-
private
44-
45-
def calculate_avg_cs_per_min(stats)
46-
total_cs = 0
47-
total_minutes = 0
48-
49-
stats.each do |stat|
50-
if stat.match.game_duration
51-
cs = (stat.minions_killed || 0) + (stat.jungle_minions_killed || 0)
52-
minutes = stat.match.game_duration / 60.0
53-
total_cs += cs
54-
total_minutes += minutes
55-
end
56-
end
57-
58-
return 0 if total_minutes.zero?
59-
(total_cs / total_minutes).round(1)
60-
end
61-
end
1+
# frozen_string_literal: true
2+
3+
module Api
4+
module V1
5+
module Analytics
6+
class LaningController < Api::V1::BaseController
7+
def show
8+
player = organization_scoped(Player).find(params[:player_id])
9+
10+
stats = PlayerMatchStat.joins(:match)
11+
.where(player: player, match: { organization: current_organization })
12+
.order('matches.game_start DESC')
13+
.limit(20)
14+
15+
laning_data = {
16+
player: PlayerSerializer.render_as_hash(player),
17+
cs_performance: {
18+
avg_cs_total: stats.average('minions_killed + jungle_minions_killed')&.round(1),
19+
avg_cs_per_min: calculate_avg_cs_per_min(stats),
20+
best_cs_game: stats.maximum('minions_killed + jungle_minions_killed'),
21+
worst_cs_game: stats.minimum('minions_killed + jungle_minions_killed')
22+
},
23+
gold_performance: {
24+
avg_gold: stats.average(:gold_earned)&.round(0),
25+
best_gold_game: stats.maximum(:gold_earned),
26+
worst_gold_game: stats.minimum(:gold_earned)
27+
},
28+
cs_by_match: stats.map do |stat|
29+
match_duration_mins = stat.match.game_duration ? stat.match.game_duration / 60.0 : 25
30+
cs_total = (stat.minions_killed || 0) + (stat.jungle_minions_killed || 0)
31+
cs_per_min = cs_total / match_duration_mins
32+
33+
{
34+
match_id: stat.match.id,
35+
date: stat.match.game_start,
36+
cs_total: cs_total,
37+
cs_per_min: cs_per_min.round(1),
38+
gold: stat.gold_earned,
39+
champion: stat.champion,
40+
victory: stat.match.victory
41+
}
42+
end
43+
}
44+
45+
render_success(laning_data)
46+
end
47+
48+
private
49+
50+
def calculate_avg_cs_per_min(stats)
51+
total_cs = 0
52+
total_minutes = 0
53+
54+
stats.each do |stat|
55+
next unless stat.match.game_duration
56+
57+
cs = (stat.minions_killed || 0) + (stat.jungle_minions_killed || 0)
58+
minutes = stat.match.game_duration / 60.0
59+
total_cs += cs
60+
total_minutes += minutes
61+
end
62+
63+
return 0 if total_minutes.zero?
64+
65+
(total_cs / total_minutes).round(1)
66+
end
67+
end
68+
end
69+
end
70+
end

0 commit comments

Comments
 (0)