@@ -3,10 +3,7 @@ defmodule CadetWeb.AssessmentsController do
33
44 use PhoenixSwagger
55
6- import Ecto.Query , only: [ where: 2 ]
7-
86 alias Cadet . { Assessments , Repo }
9- alias Cadet.Assessments.Question
107 alias CadetWeb.AssessmentsHelpers
118
129 # These roles can save and finalise answers for closed assessments and
@@ -71,96 +68,66 @@ defmodule CadetWeb.AssessmentsController do
7168 end
7269 end
7370
74- def combined_total_xp_for_all_users ( conn , % { "course_id" => course_id } ) do
75- users_with_xp = Assessments . all_user_total_xp ( course_id )
76- json ( conn , % { users: users_with_xp . users } )
77- end
78-
79- def paginated_total_xp_for_leaderboard_display ( conn , % { "course_id" => course_id } ) do
80- offset = String . to_integer ( conn . params [ "offset" ] || "0" )
81- page_size = String . to_integer ( conn . params [ "page_size" ] || "25" )
82- paginated_display = Assessments . all_user_total_xp ( course_id , offset , page_size )
83- json ( conn , paginated_display )
84- end
85-
86- def get_score_leaderboard ( conn , % {
71+ def contest_score_leaderboard ( conn , % {
8772 "assessmentid" => assessment_id ,
8873 "course_id" => course_id
8974 } ) do
90- visible_entries = String . to_integer ( conn . params [ "visible_entries" ] || "10" )
91- voting_id = Assessments . fetch_contest_voting_assesment_id ( assessment_id )
92-
93- voting_questions =
94- Question
95- |> where ( type: :voting )
96- |> where ( assessment_id: ^ assessment_id )
97- |> Repo . one ( )
98- |> case do
99- nil ->
100- Question
101- |> where ( type: :voting )
102- |> where ( assessment_id: ^ voting_id )
103- |> Repo . one ( )
104-
105- question ->
106- question
107- end
108-
109- contest_id = Assessments . fetch_associated_contest_question_id ( course_id , voting_questions )
110-
111- result =
112- contest_id
113- |> Assessments . fetch_top_relative_score_answers ( visible_entries )
114- |> Enum . map ( fn entry ->
115- updated_entry = % {
116- entry
117- | answer: entry . answer [ "code" ]
118- }
119-
120- AssessmentsHelpers . build_contest_leaderboard_entry ( updated_entry )
121- end )
122-
123- json ( conn , % { leaderboard: result , voting_id: voting_id } )
75+ count = String . to_integer ( conn . params [ "count" ] || "10" )
76+
77+ case { :voting_question , Assessments . get_contest_voting_question ( assessment_id ) } do
78+ { :voting_question , voting_question } when not is_nil ( voting_question ) ->
79+ question_id = Assessments . fetch_associated_contest_question_id ( course_id , voting_question )
80+
81+ result =
82+ question_id
83+ |> Assessments . fetch_top_relative_score_answers ( count )
84+ |> Enum . map ( fn entry ->
85+ updated_entry = % {
86+ entry
87+ | answer: entry . answer [ "code" ]
88+ }
89+
90+ AssessmentsHelpers . build_contest_leaderboard_entry ( updated_entry )
91+ end )
92+
93+ json ( conn , % { leaderboard: result } )
94+
95+ { :voting_question , nil } ->
96+ conn
97+ |> put_status ( :not_found )
98+ |> text ( "Not a contest voting assessment" )
99+ end
124100 end
125101
126- def get_popular_leaderboard ( conn , % {
102+ def contest_popular_leaderboard ( conn , % {
127103 "assessmentid" => assessment_id ,
128104 "course_id" => course_id
129105 } ) do
130- visible_entries = String . to_integer ( conn . params [ "visible_entries" ] || "10" )
131- voting_id = Assessments . fetch_contest_voting_assesment_id ( assessment_id )
132-
133- voting_questions =
134- Question
135- |> where ( type: :voting )
136- |> where ( assessment_id: ^ assessment_id )
137- |> Repo . one ( )
138- |> case do
139- nil ->
140- Question
141- |> where ( type: :voting )
142- |> where ( assessment_id: ^ voting_id )
143- |> Repo . one ( )
144-
145- question ->
146- question
147- end
148-
149- contest_id = Assessments . fetch_associated_contest_question_id ( course_id , voting_questions )
150-
151- result =
152- contest_id
153- |> Assessments . fetch_top_popular_score_answers ( visible_entries )
154- |> Enum . map ( fn entry ->
155- updated_entry = % {
156- entry
157- | answer: entry . answer [ "code" ]
158- }
159-
160- AssessmentsHelpers . build_popular_leaderboard_entry ( updated_entry )
161- end )
162-
163- json ( conn , % { leaderboard: result , voting_id: voting_id } )
106+ count = String . to_integer ( conn . params [ "count" ] || "10" )
107+
108+ case { :voting_question , Assessments . get_contest_voting_question ( assessment_id ) } do
109+ { :voting_question , voting_question } when not is_nil ( voting_question ) ->
110+ question_id = Assessments . fetch_associated_contest_question_id ( course_id , voting_question )
111+
112+ result =
113+ question_id
114+ |> Assessments . fetch_top_popular_score_answers ( count )
115+ |> Enum . map ( fn entry ->
116+ updated_entry = % {
117+ entry
118+ | answer: entry . answer [ "code" ]
119+ }
120+
121+ AssessmentsHelpers . build_popular_leaderboard_entry ( updated_entry )
122+ end )
123+
124+ json ( conn , % { leaderboard: result } )
125+
126+ { :voting_question , nil } ->
127+ conn
128+ |> put_status ( :not_found )
129+ |> text ( "Not a contest voting assessment" )
130+ end
164131 end
165132
166133 def get_all_contests ( conn , % { "course_id" => course_id } ) do
0 commit comments