@@ -43,45 +43,14 @@ defmodule Codebattle.Tournament.Ranking do
4343 def get_page ( tournament , page , page_size \\ 10 )
4444
4545 def get_page ( % { ranking_table: nil } = tournament , page , page_size ) do
46- if tournament . ranking_type == "by_user" do
47- players =
46+ case tournament . ranking_type do
47+ "by_user" ->
4848 tournament
49- |> Helpers . get_players ( )
50- |> Enum . reject ( & & 1 . is_bot )
51- |> Enum . sort_by ( fn player ->
52- cond do
53- is_integer ( player . place ) and player . place > 0 -> { 0 , player . place }
54- is_integer ( player . wr_joined_at ) -> { 1 , player . wr_joined_at }
55- true -> { 2 , player . id }
56- end
57- end )
58-
59- entries =
60- players
61- |> Enum . with_index ( 1 )
62- |> Enum . map ( fn { player , place } ->
63- % {
64- id: player . id ,
65- place: place ,
66- score: player . score || 0 ,
67- lang: player . lang ,
68- name: player . name ,
69- clan_id: player . clan_id ,
70- clan: player . clan
71- }
72- end )
73-
74- total_entries = length ( entries )
75- start_index = ( page - 1 ) * page_size
49+ |> build_user_entries ( )
50+ |> paginate ( page , page_size )
7651
77- % {
78- total_entries: total_entries ,
79- page_number: page ,
80- page_size: page_size ,
81- entries: Enum . slice ( entries , start_index , page_size )
82- }
83- else
84- % { total_entries: 0 , page_number: page , page_size: page_size , entries: [ ] }
52+ _ ->
53+ empty_page ( page , page_size )
8554 end
8655 end
8756
@@ -123,4 +92,46 @@ defmodule Codebattle.Tournament.Ranking do
12392
12493 defp get_module ( % { ranking_type: "by_clan" } ) , do: ByClan
12594 defp get_module ( % { ranking_type: "by_user" } ) , do: ByUser
95+
96+ defp build_user_entries ( tournament ) do
97+ tournament
98+ |> Helpers . get_players ( )
99+ |> Enum . reject ( & & 1 . is_bot )
100+ |> Enum . sort_by ( & player_sort_key / 1 )
101+ |> Enum . with_index ( 1 )
102+ |> Enum . map ( fn { player , place } ->
103+ % {
104+ id: player . id ,
105+ place: place ,
106+ score: player . score || 0 ,
107+ lang: player . lang ,
108+ name: player . name ,
109+ clan_id: player . clan_id ,
110+ clan: player . clan
111+ }
112+ end )
113+ end
114+
115+ defp player_sort_key ( player ) do
116+ cond do
117+ is_integer ( player . place ) and player . place > 0 -> { 0 , player . place }
118+ is_integer ( player . wr_joined_at ) -> { 1 , player . wr_joined_at }
119+ true -> { 2 , player . id }
120+ end
121+ end
122+
123+ defp paginate ( entries , page , page_size ) do
124+ start_index = ( page - 1 ) * page_size
125+
126+ % {
127+ total_entries: length ( entries ) ,
128+ page_number: page ,
129+ page_size: page_size ,
130+ entries: Enum . slice ( entries , start_index , page_size )
131+ }
132+ end
133+
134+ defp empty_page ( page , page_size ) do
135+ % { total_entries: 0 , page_number: page , page_size: page_size , entries: [ ] }
136+ end
126137end
0 commit comments