@@ -3,7 +3,11 @@ defmodule CadetWeb.AssessmentsController do
33
44 use PhoenixSwagger
55
6- alias Cadet.Assessments
6+ import Ecto.Query , only: [ where: 2 ]
7+
8+ alias Cadet . { Assessments , Repo }
9+ alias Cadet.Assessments.Question
10+ alias CadetWeb.AssessmentsHelpers
711
812 # These roles can save and finalise answers for closed assessments and
913 # submitted answers
@@ -67,6 +71,103 @@ defmodule CadetWeb.AssessmentsController do
6771 end
6872 end
6973
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 , % {
87+ "assessmentid" => assessment_id ,
88+ "course_id" => course_id
89+ } ) 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 } )
124+ end
125+
126+ def get_popular_leaderboard ( conn , % {
127+ "assessmentid" => assessment_id ,
128+ "course_id" => course_id
129+ } ) 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 } )
164+ end
165+
166+ def get_all_contests ( conn , % { "course_id" => course_id } ) do
167+ contests = Assessments . fetch_all_contests ( course_id )
168+ json ( conn , contests )
169+ end
170+
70171 swagger_path :submit do
71172 post ( "/courses/{course_id}/assessments/{assessmentId}/submit" )
72173 summary ( "Finalise submission for an assessment" )
0 commit comments