@@ -3043,10 +3043,60 @@ defmodule Cadet.Assessments do
30433043 }
30443044 end
30453045
3046+ @ spec get_answer ( integer ( ) | String . t ( ) ) ::
3047+ { :ok , Answer . t ( ) } | { :error , { :bad_request , String . t ( ) } }
3048+ def get_answer ( id ) when is_ecto_id ( id ) do
3049+ answer =
3050+ Answer
3051+ |> where ( id: ^ id )
3052+ # [a] are bindings (in SQL it is similar to FROM answers "AS a"),
3053+ # this line's alias is INNER JOIN ... "AS q"
3054+ |> join ( :inner , [ a ] , q in assoc ( a , :question ) )
3055+ |> join ( :inner , [ _ , q ] , ast in assoc ( q , :assessment ) )
3056+ |> join ( :inner , [ ... , ast ] , ac in assoc ( ast , :config ) )
3057+ |> join ( :left , [ a , ... ] , g in assoc ( a , :grader ) )
3058+ |> join ( :left , [ _ , ... , g ] , gu in assoc ( g , :user ) )
3059+ |> join ( :inner , [ a , ... ] , s in assoc ( a , :submission ) )
3060+ |> join ( :left , [ _ , ... , s ] , st in assoc ( s , :student ) )
3061+ |> join ( :left , [ ... , st ] , u in assoc ( st , :user ) )
3062+ |> join ( :left , [ ... , s , _ , _ ] , t in assoc ( s , :team ) )
3063+ |> join ( :left , [ ... , t ] , tm in assoc ( t , :team_members ) )
3064+ |> join ( :left , [ ... , tm ] , tms in assoc ( tm , :student ) )
3065+ |> join ( :left , [ ... , tms ] , tmu in assoc ( tms , :user ) )
3066+ |> join ( :left , [ a , ... ] , ai in assoc ( a , :ai_comments ) )
3067+ |> preload ( [ _ , q , ast , ac , g , gu , s , st , u , t , tm , tms , tmu , ai ] ,
3068+ ai_comments: ai ,
3069+ question: { q , assessment: { ast , config: ac } } ,
3070+ grader: { g , user: gu } ,
3071+ submission:
3072+ { s , student: { st , user: u } , team: { t , team_members: { tm , student: { tms , user: tmu } } } }
3073+ )
3074+ |> Repo . one ( )
3075+
3076+ if is_nil ( answer ) do
3077+ { :error , { :bad_request , "Answer not found." } }
3078+ else
3079+
3080+
3081+ if answer . question . type == :voting do
3082+ empty_contest_entries = Map . put ( answer . question . question , :contest_entries , [ ] )
3083+ empty_popular_leaderboard = Map . put ( empty_contest_entries , :popular_leaderboard , [ ] )
3084+ empty_contest_leaderboard = Map . put ( empty_popular_leaderboard , :contest_leaderboard , [ ] )
3085+ question = Map . put ( answer . question , :question , empty_contest_leaderboard )
3086+ Map . put ( answer , :question , question )
3087+ end
3088+
3089+ { :ok , answer }
3090+ end
3091+
3092+
3093+
3094+ end
3095+
30463096 @ spec get_answers_in_submission ( integer ( ) | String . t ( ) ) ::
30473097 { :ok , { [ Answer . t ( ) ] , Assessment . t ( ) } }
30483098 | { :error , { :bad_request , String . t ( ) } }
3049- def get_answers_in_submission ( id , question_id \\ nil ) when is_ecto_id ( id ) do
3099+ def get_answers_in_submission ( id ) when is_ecto_id ( id ) do
30503100 base_query =
30513101 Answer
30523102 |> where ( submission_id: ^ id )
@@ -3058,29 +3108,23 @@ defmodule Cadet.Assessments do
30583108 |> join ( :left , [ a , ... ] , g in assoc ( a , :grader ) )
30593109 |> join ( :left , [ _ , ... , g ] , gu in assoc ( g , :user ) )
30603110 |> join ( :inner , [ a , ... ] , s in assoc ( a , :submission ) )
3061- |> join ( :left , [ ... , s ] , ai in assoc ( s , :ai_comments ) )
3062- |> join ( :left , [ _ , ... , s , _ ] , st in assoc ( s , :student ) )
3111+ |> join ( :left , [ _ , ... , s ] , st in assoc ( s , :student ) )
30633112 |> join ( :left , [ ... , st ] , u in assoc ( st , :user ) )
3064- |> join ( :left , [ ... , s , _ , _ , _ ] , t in assoc ( s , :team ) )
3113+ |> join ( :left , [ ... , s , _ , _ ] , t in assoc ( s , :team ) )
30653114 |> join ( :left , [ ... , t ] , tm in assoc ( t , :team_members ) )
30663115 |> join ( :left , [ ... , tm ] , tms in assoc ( tm , :student ) )
30673116 |> join ( :left , [ ... , tms ] , tmu in assoc ( tms , :user ) )
3068- |> preload ( [ _ , q , ast , ac , g , gu , s , ai , st , u , t , tm , tms , tmu ] ,
3069- ai_comments: ai ,
3117+ |> join ( :left , [ a , ... ] , ai in assoc ( a , :ai_comments ) )
3118+ |> preload ( [ _ , q , ast , ac , g , gu , s , st , u , t , tm , tms , tmu , ai ] ,
30703119 question: { q , assessment: { ast , config: ac } } ,
30713120 grader: { g , user: gu } ,
30723121 submission:
3073- { s , student: { st , user: u } , team: { t , team_members: { tm , student: { tms , user: tmu } } } }
3122+ { s , student: { st , user: u } , team: { t , team_members: { tm , student: { tms , user: tmu } } } } ,
3123+ ai_comments: ai
30743124 )
30753125
3076- answer_query =
3077- case question_id do
3078- nil -> base_query
3079- _ -> base_query |> where ( question_id: ^ question_id )
3080- end
3081-
30823126 answers =
3083- answer_query
3127+ base_query
30843128 |> Repo . all ( )
30853129 |> Enum . sort_by ( & & 1 . question . display_order )
30863130 |> Enum . map ( fn ans ->
@@ -3091,6 +3135,7 @@ defmodule Cadet.Assessments do
30913135 question = Map . put ( ans . question , :question , empty_contest_leaderboard )
30923136 Map . put ( ans , :question , question )
30933137 else
3138+
30943139 ans
30953140 end
30963141 end )
0 commit comments