Skip to content

Commit 98bd7bf

Browse files
committed
feat: implement team comparison
Controller refatorado e otimizado Resposta padronizada { data: {...} } Filtros avançados (days, date_range, opponent_team, match_type)
1 parent c502720 commit 98bd7bf

1 file changed

Lines changed: 58 additions & 27 deletions

File tree

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

Lines changed: 58 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,76 @@
11
class Api::V1::Analytics::TeamComparisonController < Api::V1::BaseController
22
def index
33
players = organization_scoped(Player).active.includes(:player_match_stats)
4+
matches = build_matches_query
45

5-
# Get matches in date range
6+
comparison_data = build_comparison_data(players, matches)
7+
8+
render json: { data: comparison_data }
9+
end
10+
11+
private
12+
13+
def build_matches_query
614
matches = organization_scoped(Match)
15+
16+
matches = apply_date_filter(matches)
17+
18+
matches = matches.where(opponent_team_id: params[:opponent_team_id]) if params[:opponent_team_id].present?
19+
20+
matches = matches.where(match_type: params[:match_type]) if params[:match_type].present?
21+
22+
matches
23+
end
24+
25+
def apply_date_filter(matches)
726
if params[:start_date].present? && params[:end_date].present?
8-
matches = matches.in_date_range(params[:start_date], params[:end_date])
27+
matches.in_date_range(params[:start_date], params[:end_date])
28+
elsif params[:days].present?
29+
matches.recent(params[:days].to_i)
930
else
10-
matches = matches.recent(30)
31+
matches.recent(30)
1132
end
33+
end
1234

13-
comparison_data = {
14-
players: players.map do |player|
15-
stats = PlayerMatchStat.where(player: player, match: matches)
16-
next if stats.empty?
17-
18-
{
19-
player: PlayerSerializer.render_as_hash(player),
20-
games_played: stats.count,
21-
kda: calculate_kda(stats),
22-
avg_damage: stats.average(:total_damage_dealt)&.round(0) || 0,
23-
avg_gold: stats.average(:gold_earned)&.round(0) || 0,
24-
avg_cs: stats.average('minions_killed + jungle_minions_killed')&.round(1) || 0,
25-
avg_vision_score: stats.average(:vision_score)&.round(1) || 0,
26-
avg_performance_score: stats.average(:performance_score)&.round(1) || 0,
27-
multikills: {
28-
double: stats.sum(:double_kills),
29-
triple: stats.sum(:triple_kills),
30-
quadra: stats.sum(:quadra_kills),
31-
penta: stats.sum(:penta_kills)
32-
}
33-
}
34-
end.compact.sort_by { |p| -p[:avg_performance_score] },
35+
def build_comparison_data(players, matches)
36+
{
37+
players: build_player_comparisons(players, matches),
3538
team_averages: calculate_team_averages(matches),
3639
role_rankings: calculate_role_rankings(players, matches)
3740
}
41+
end
3842

39-
render_success(comparison_data)
43+
def build_player_comparisons(players, matches)
44+
players.map do |player|
45+
build_player_stats(player, matches)
46+
end.compact.sort_by { |p| -p[:avg_performance_score] }
4047
end
4148

42-
private
49+
def build_player_stats(player, matches)
50+
stats = PlayerMatchStat.where(player: player, match: matches)
51+
return nil if stats.empty?
52+
53+
{
54+
player: PlayerSerializer.render_as_hash(player),
55+
games_played: stats.count,
56+
kda: calculate_kda(stats),
57+
avg_damage: stats.average(:total_damage_dealt)&.round(0) || 0,
58+
avg_gold: stats.average(:gold_earned)&.round(0) || 0,
59+
avg_cs: stats.average('minions_killed + jungle_minions_killed')&.round(1) || 0,
60+
avg_vision_score: stats.average(:vision_score)&.round(1) || 0,
61+
avg_performance_score: stats.average(:performance_score)&.round(1) || 0,
62+
multikills: build_multikills(stats)
63+
}
64+
end
65+
66+
def build_multikills(stats)
67+
{
68+
double: stats.sum(:double_kills),
69+
triple: stats.sum(:triple_kills),
70+
quadra: stats.sum(:quadra_kills),
71+
penta: stats.sum(:penta_kills)
72+
}
73+
end
4374

4475
def calculate_kda(stats)
4576
total_kills = stats.sum(:kills)

0 commit comments

Comments
 (0)