@@ -7,11 +7,38 @@ defmodule Cadet.Accounts.Teams do
77 use Ecto.Schema
88
99 import Ecto . { Changeset , Query }
10+ require Logger
1011
1112 alias Cadet.Repo
1213 alias Cadet.Accounts . { Team , TeamMember , Notification }
1314 alias Cadet.Assessments . { Answer , Submission }
1415
16+ @ doc """
17+ Returns all teams for a given course.
18+
19+ ## Parameters
20+
21+ * `course_id` - The ID of the course.
22+
23+ ## Returns
24+
25+ Returns a list of teams.
26+
27+ """
28+ def all_teams_for_course ( course_id ) do
29+ Logger . info ( "Retrieving all teams for course #{ course_id } " )
30+
31+ teams =
32+ Team
33+ |> join ( :inner , [ t ] , a in assoc ( t , :assessment ) )
34+ |> where ( [ t , a ] , a . course_id == ^ course_id )
35+ |> Repo . all ( )
36+ |> Repo . preload ( assessment: [ :config ] , team_members: [ student: [ :user ] ] )
37+
38+ Logger . info ( "Retrieved #{ length ( teams ) } teams for course #{ course_id } " )
39+ teams
40+ end
41+
1542 @ doc """
1643 Creates a new team and assigns an assessment and team members to it.
1744
@@ -26,44 +53,62 @@ defmodule Cadet.Accounts.Teams do
2653 """
2754 def create_team ( attrs ) do
2855 assessment_id = attrs [ "assessment_id" ]
56+ Logger . info ( "Creating teams for assessment #{ assessment_id } " )
57+
2958 teams = attrs [ "student_ids" ]
3059 assessment = Cadet.Repo . get ( Cadet.Assessments.Assessment , assessment_id )
3160
3261 cond do
3362 ! all_team_within_max_size? ( teams , assessment . max_team_size ) ->
63+ Logger . error (
64+ "Team creation failed for assessment #{ assessment_id } - teams exceed maximum size"
65+ )
66+
3467 { :error , { :conflict , "One or more teams exceed the maximum team size!" } }
3568
3669 ! all_students_distinct? ( teams ) ->
70+ Logger . error ( "Team creation failed for assessment #{ assessment_id } - duplicate students" )
71+
3772 { :error , { :conflict , "One or more students appear multiple times in a team!" } }
3873
3974 ! all_student_enrolled_in_course? ( teams , assessment . course_id ) ->
75+ Logger . error (
76+ "Team creation failed for assessment #{ assessment_id } - students not enrolled in course"
77+ )
78+
4079 { :error , { :conflict , "One or more students not enrolled in this course!" } }
4180
4281 student_already_assigned? ( teams , assessment_id ) ->
82+ Logger . error (
83+ "Team creation failed for assessment #{ assessment_id } - students already assigned to teams"
84+ )
85+
4386 { :error , { :conflict , "One or more students already in a team for this assessment!" } }
4487
4588 true ->
46- Enum . reduce_while ( attrs [ "student_ids" ] , { :ok , nil } , fn team_attrs , { :ok , _ } ->
47- student_ids = Enum . map ( team_attrs , & Map . get ( & 1 , "userId" ) )
89+ result =
90+ Enum . reduce_while ( attrs [ "student_ids" ] , { :ok , nil } , fn team_attrs , { :ok , _ } ->
91+ { :ok , team } =
92+ % Team { }
93+ |> Team . changeset ( attrs )
94+ |> Repo . insert ( )
4895
49- { :ok , team } =
50- % Team { }
51- |> Team . changeset ( attrs )
52- |> Repo . insert ( )
96+ team_id = team . id
5397
54- team_id = team . id
98+ Enum . each ( team_attrs , fn student ->
99+ student_id = Map . get ( student , "userId" )
100+ attributes = % { student_id: student_id , team_id: team_id }
55101
56- Enum . each ( team_attrs , fn student ->
57- student_id = Map . get ( student , "userId" )
58- attributes = % { student_id: student_id , team_id: team_id }
102+ % TeamMember { }
103+ |> cast ( attributes , [ :student_id , :team_id ] )
104+ |> Repo . insert ( )
105+ end )
59106
60- % TeamMember { }
61- |> cast ( attributes , [ :student_id , :team_id ] )
62- |> Repo . insert ( )
107+ { :cont , { :ok , team } }
63108 end )
64109
65- { :cont , { :ok , team } }
66- end )
110+ Logger . info ( "Successfully created teams for assessment #{ assessment_id } " )
111+ result
67112 end
68113 end
69114
@@ -85,7 +130,6 @@ defmodule Cadet.Accounts.Teams do
85130 ids = Enum . map ( team , & Map . get ( & 1 , "userId" ) )
86131
87132 unique_ids_count = ids |> Enum . uniq ( ) |> Enum . count ( )
88- all_ids_distinct = unique_ids_count == Enum . count ( ids )
89133
90134 student_already_in_team? ( - 1 , ids , assessment_id )
91135 end )
@@ -209,7 +253,6 @@ defmodule Cadet.Accounts.Teams do
209253
210254 """
211255 def update_team ( team = % Team { } , new_assessment_id , student_ids ) do
212- old_assessment_id = team . assessment_id
213256 team_id = team . id
214257 new_student_ids = Enum . map ( hd ( student_ids ) , fn student -> Map . get ( student , "userId" ) end )
215258
@@ -276,7 +319,10 @@ defmodule Cadet.Accounts.Teams do
276319
277320 """
278321 def delete_team ( team = % Team { } ) do
322+ Logger . info ( "Deleting team #{ team . id } for assessment #{ team . assessment_id } " )
323+
279324 if has_submitted_answer? ( team . id ) do
325+ Logger . error ( "Cannot delete team #{ team . id } - team has submitted answers" )
280326 { :error , { :conflict , "This team has submitted their answers! Unable to delete the team!" } }
281327 else
282328 submission =
@@ -299,8 +345,19 @@ defmodule Cadet.Accounts.Teams do
299345 |> Repo . delete_all ( )
300346 end
301347
302- team
303- |> Repo . delete ( )
348+ result =
349+ team
350+ |> Repo . delete ( )
351+
352+ case result do
353+ { :ok , _ } ->
354+ Logger . info ( "Successfully deleted team #{ team . id } " )
355+ result
356+
357+ { :error , changeset } ->
358+ Logger . error ( "Failed to delete team #{ team . id } : #{ full_error_messages ( changeset ) } " )
359+ result
360+ end
304361 end
305362 end
306363
0 commit comments