Skip to content

Commit e2fa02b

Browse files
committed
Rework index according to new API spec
1 parent b888f76 commit e2fa02b

File tree

3 files changed

+66
-9
lines changed

3 files changed

+66
-9
lines changed

lib/cadet/assessments/assessments.ex

Lines changed: 30 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ defmodule Cadet.Assessments do
99

1010
alias Timex.Duration
1111

12+
alias Cadet.Assessments.Answer
1213
alias Cadet.Assessments.Assessment
1314
alias Cadet.Assessments.Question
1415
alias Cadet.Assessments.Submission
@@ -116,10 +117,35 @@ defmodule Cadet.Assessments do
116117
Repo.delete(question)
117118
end
118119

119-
def all_submissions(grader_id: grader_id) do
120-
Submission
121-
|> where(grader_id: ^grader_id)
122-
|> Repo.all()
120+
@spec get_submission_xp(String.t() | integer()) :: number()
121+
def get_submission_xp(id) when is_binary(id) or is_integer(id) do
122+
Answer
123+
|> where(submission_id: ^id)
124+
|> Repo.aggregate(:sum, :marks)
125+
end
126+
127+
def all_submissions_by_grader(grader, preload \\ true)
128+
129+
@spec all_submissions_by_grader(String.t() | integer(), boolean()) :: Submission.t()
130+
def all_submissions_by_grader(grader_id, preload)
131+
when is_binary(grader_id) or is_integer(grader_id) do
132+
submissions =
133+
Submission
134+
|> where(grader_id: ^grader_id)
135+
|> Repo.all()
136+
137+
if preload do
138+
submissions
139+
|> Repo.preload([:assessment, :student])
140+
|> Enum.map(&Map.put(&1, :xp, get_submission_xp(&1.id)))
141+
else
142+
submissions
143+
end
144+
end
145+
146+
@spec all_submissions_by_grader(Cadet.Accounts.User.t(), boolean()) :: Submission.t()
147+
def all_submissions_by_grader(%Cadet.Accounts.User{id: id, role: :staff}, preload) do
148+
all_submissions_by_grader(id, preload)
123149
end
124150

125151
# TODO: Decide what to do with these methods

lib/cadet_web/controllers/grading_controller.ex

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ defmodule CadetWeb.GradingController do
1010

1111
case user.role do
1212
:staff ->
13-
submissions = Assessments.all_submissions(grader_id: user.id)
13+
submissions = Assessments.all_submissions_by_grader(user)
1414
render(conn, "index.json", submissions: submissions)
1515

1616
_ ->
@@ -87,8 +87,30 @@ defmodule CadetWeb.GradingController do
8787
swagger_schema do
8888
properties do
8989
submissionId(:integer, "submission id", required: true)
90-
assessmentId(:integer, "assessment id", required: true)
91-
studentId(:integer, "student id", required: true)
90+
xp(:integer, "xp given")
91+
graded(:boolean, "whether this submission has been graded", required: true)
92+
assessment(Schema.ref(:AssessmentInfo))
93+
student(Schema.ref(:StudentInfo))
94+
end
95+
end,
96+
AssessmentInfo:
97+
swagger_schema do
98+
properties do
99+
id(:integer, "assessment id", required: true)
100+
type(:string, "Either mission/sidequest/path/contest", required: true)
101+
102+
max_xp(
103+
:integer,
104+
"The max amount of XP to be earned from this assessment",
105+
required: true
106+
)
107+
end
108+
end,
109+
StudentInfo:
110+
swagger_schema do
111+
properties do
112+
id(:integer, "student id", required: true)
113+
name(:string, "student name", required: true)
92114
end
93115
end,
94116
GradingInfo:

lib/cadet_web/views/grading_view.ex

Lines changed: 11 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,9 +7,18 @@ defmodule CadetWeb.GradingView do
77

88
def render("submission.json", %{submission: submission}) do
99
%{
10+
xp: submission.xp,
1011
submissionId: submission.id,
11-
missionId: submission.assessment_id,
12-
studentId: submission.student_id
12+
student: %{
13+
name: submission.student.name,
14+
id: submission.student.id
15+
},
16+
graded: submission.status == :graded,
17+
assessment: %{
18+
type: submission.assessment.category,
19+
max_xp: submission.assessment.max_xp,
20+
id: submission.assessment.id
21+
}
1322
}
1423
end
1524
end

0 commit comments

Comments
 (0)