@@ -124,11 +124,11 @@ defmodule DevRound.Hosting do
124124 EventAttendee . check_changeset ( attendee , % { checked: checked } )
125125 end
126126
127- def validate_team_generation_constraints ( attendees , team_names ) do
127+ def validate_team_generation_constraints ( attendees , team_names , team_rooms ) do
128128 attendees = filter_checked ( attendees )
129129
130130 if Enum . count ( attendees ) >= 2 do
131- messages = build_validation_messages ( attendees , team_names )
131+ messages = build_validation_messages ( attendees , team_names , team_rooms )
132132
133133 case messages do
134134 [ ] -> { :ok , [ ] }
@@ -139,7 +139,7 @@ defmodule DevRound.Hosting do
139139 end
140140 end
141141
142- defp build_validation_messages ( attendees , team_names ) do
142+ defp build_validation_messages ( attendees , team_names , team_rooms ) do
143143 attendee_messages =
144144 for attendee <- attendees do
145145 potential_team_mates =
@@ -162,7 +162,18 @@ defmodule DevRound.Hosting do
162162 [ ]
163163 end
164164
165- attendee_messages ++ team_names_message
165+ remote_attendees = Enum . filter ( attendees , & & 1 . is_remote )
166+
167+ video_conference_rooms_message =
168+ if Integer . floor_div ( length ( remote_attendees ) , 2 ) > length ( team_rooms ) do
169+ [
170+ "Not enough session video conference room URLs to build teams for checked remote participants."
171+ ]
172+ else
173+ [ ]
174+ end
175+
176+ attendee_messages ++ team_names_message ++ video_conference_rooms_message
166177 end
167178
168179 defp filter_checked ( attendees ) do
@@ -197,29 +208,32 @@ defmodule DevRound.Hosting do
197208 |> Enum . into ( % { } , fn team -> { team . session_id , team } end )
198209 end
199210
200- def build_teams_for_session ( % EventSession { } = session , attendees , team_names ) do
211+ def build_teams_for_session ( % EventSession { } = session , attendees , team_names , team_rooms ) do
201212 attendees = filter_checked ( attendees )
202- { :ok , [ ] } = validate_team_generation_constraints ( attendees , team_names )
213+ { :ok , [ ] } = validate_team_generation_constraints ( attendees , team_names , team_rooms )
203214
204215 Multi . new ( )
205216 |> Multi . delete_all ( :teams , Ecto . assoc ( session , :teams ) )
206- |> insert_teams ( session , attendees , team_names )
217+ |> insert_teams ( session , attendees , team_names , team_rooms )
207218 |> Repo . transaction ( )
208219 end
209220
210- defp insert_teams ( multi , session , attendees , team_names ) do
211- generate_team_changesets ( session , attendees , team_names )
221+ defp insert_teams ( multi , session , attendees , team_names , team_rooms ) do
222+ generate_team_changesets ( session , attendees , team_names , team_rooms )
212223 |> Enum . reduce ( multi , & Multi . insert ( & 2 , Changeset . get_change ( & 1 , :slug ) , & 1 ) )
213224 end
214225
215- defp generate_team_changesets ( session , attendees , team_names ) do
226+ defp generate_team_changesets ( session , attendees , team_names , team_rooms ) do
216227 { local_teams , local_langs } = generate_teams_langs ( attendees , false )
217228 { remote_teams , remote_langs } = generate_teams_langs ( attendees , true )
218229
230+ room_urls = team_rooms |> Enum . map ( & & 1 . url )
231+
219232 create_team_changesets (
220233 { local_teams ++ remote_teams , local_langs ++ remote_langs } ,
221234 session ,
222- team_names
235+ team_names ,
236+ room_urls
223237 )
224238 end
225239
@@ -293,34 +307,48 @@ defmodule DevRound.Hosting do
293307 MapSet . new ( )
294308 end
295309
296- defp create_team_changesets ( { teams_attendees , teams_langs } , session , team_names ) do
310+ defp create_team_changesets ( { teams_attendees , teams_langs } , session , team_names , room_urls ) do
297311 names = team_names |> Enum . shuffle ( ) |> Enum . take ( length ( teams_attendees ) )
298312
299- Enum . zip ( [ teams_attendees , teams_langs , names ] )
300- |> Enum . map ( fn { team_attendees , team_langs , name } ->
301- lang = Enum . random ( team_langs )
302- is_remote = hd ( team_attendees ) . is_remote
313+ { changesets , _remaining_urls } =
314+ Enum . zip ( [ teams_attendees , teams_langs , names ] )
315+ |> Enum . map_reduce ( room_urls , fn { team_attendees , team_langs , name } , available_urls ->
316+ lang = Enum . random ( team_langs )
317+ is_remote = hd ( team_attendees ) . is_remote
318+
319+ { room_url , next_urls } =
320+ if is_remote && available_urls != [ ] do
321+ { hd ( available_urls ) , tl ( available_urls ) }
322+ else
323+ { nil , available_urls }
324+ end
325+
326+ members =
327+ Enum . map ( team_attendees , fn attendee ->
328+ % TeamMember { }
329+ |> Changeset . change (
330+ is_remote: attendee . is_remote ,
331+ experience_level: attendee . experience_level ,
332+ user: attendee . user
333+ )
334+ |> Changeset . put_assoc ( :langs , attendee . langs )
335+ end )
303336
304- members =
305- Enum . map ( team_attendees , fn attendee ->
306- % TeamMember { }
337+ changeset =
338+ % Team { }
307339 |> Changeset . change (
308- is_remote: attendee . is_remote ,
309- experience_level: attendee . experience_level ,
310- user: attendee . user
340+ name: name . name ,
341+ slug: name . slug ,
342+ is_remote: is_remote ,
343+ session: session ,
344+ lang: lang ,
345+ video_conference_room_url: room_url
311346 )
312- |> Changeset . put_assoc ( :langs , attendee . langs )
313- end )
314-
315- % Team { }
316- |> Changeset . change (
317- name: name . name ,
318- slug: name . slug ,
319- is_remote: is_remote ,
320- session: session ,
321- lang: lang
322- )
323- |> Changeset . put_assoc ( :members , members )
324- end )
347+ |> Changeset . put_assoc ( :members , members )
348+
349+ { changeset , next_urls }
350+ end )
351+
352+ changesets
325353 end
326354end
0 commit comments