@@ -6,11 +6,9 @@ defmodule Claper.Events do
66 """
77
88 import Ecto.Query , warn: false
9- alias Claper.Repo
109
11- alias Claper.Accounts.User
10+ alias Claper . { Accounts , Presentations , Repo }
1211 alias Claper.Events . { Event , ActivityLeader }
13- alias Claper.Presentations
1412
1513 @ default_page_size 5
1614
@@ -142,7 +140,7 @@ defmodule Claper.Events do
142140 """
143141 def list_managed_events_by ( email , preload \\ [ ] ) do
144142 from ( a in ActivityLeader ,
145- join: u in Claper. Accounts.User,
143+ join: u in Accounts.User ,
146144 on: u . email == a . email ,
147145 join: e in Event ,
148146 on: e . id == a . event_id ,
@@ -169,7 +167,7 @@ defmodule Claper.Events do
169167
170168 query =
171169 from ( a in ActivityLeader ,
172- join: u in Claper. Accounts.User,
170+ join: u in Accounts.User ,
173171 on: u . email == a . email ,
174172 join: e in Event ,
175173 on: e . id == a . event_id ,
@@ -183,7 +181,7 @@ defmodule Claper.Events do
183181
184182 def count_managed_events_by ( email ) do
185183 from ( a in ActivityLeader ,
186- join: u in Claper. Accounts.User,
184+ join: u in Accounts.User ,
187185 on: u . email == a . email ,
188186 join: e in Event ,
189187 on: e . id == a . event_id ,
@@ -264,7 +262,7 @@ defmodule Claper.Events do
264262 a in ActivityLeader ,
265263 join: e in Event ,
266264 on: e . id == a . event_id ,
267- join: u in User ,
265+ join: u in Accounts. User,
268266 on: e . user_id == u . id ,
269267 where: e . uuid == ^ uuid and ( u . id == ^ user . id or a . email == ^ user . email ) ,
270268 select: e
@@ -331,7 +329,7 @@ defmodule Claper.Events do
331329 """
332330 def led_by? ( email , event ) do
333331 from ( a in ActivityLeader ,
334- join: u in Claper. Accounts.User,
332+ join: u in Accounts.User ,
335333 on: u . email == a . email ,
336334 join: e in Event ,
337335 on: e . id == a . event_id ,
@@ -358,7 +356,10 @@ defmodule Claper.Events do
358356 |> validate_unique_event ( )
359357 |> case do
360358 { :ok , event } ->
361- Repo . insert ( event , returning: [ :uuid ] )
359+ with { :ok , event } <- Repo . insert ( event , returning: [ :uuid ] ) do
360+ broadcast_all_users ( { :created , event } )
361+ { :ok , event }
362+ end
362363
363364 { :error , changeset } ->
364365 { :error , % { changeset | action: :insert } }
@@ -406,7 +407,25 @@ defmodule Claper.Events do
406407 |> validate_unique_event ( )
407408 |> case do
408409 { :ok , event } ->
409- Repo . update ( event , returning: [ :uuid ] )
410+ with { :ok , event } <- Repo . update ( event , returning: [ :uuid ] ) do
411+ broadcast_all_users ( { :updated , event } )
412+
413+ deleted_leaders =
414+ attrs
415+ |> Map . get ( "leaders" , % { } )
416+ |> Map . values ( )
417+ |> Enum . filter ( fn
418+ % { "delete" => "true" } -> true
419+ _ -> false
420+ end )
421+
422+ for % { "email" => leader_email } <- deleted_leaders do
423+ leader = Accounts . get_user_by_email ( leader_email )
424+ broadcast_user_events ( leader . id , { :updated , event } )
425+ end
426+
427+ { :ok , event }
428+ end
410429
411430 { :error , changeset } ->
412431 { :error , % { changeset | action: :update } }
@@ -428,7 +447,9 @@ defmodule Claper.Events do
428447 |> Repo . update ( )
429448 |> case do
430449 { :ok , event } ->
431- broadcast ( { :ok , event , event . uuid } , :event_terminated )
450+ broadcast_all_users ( { :updated , event } )
451+ broadcast_event ( event . uuid , { :event_terminated , event . uuid } )
452+ { :ok , event }
432453
433454 { :error , changeset } ->
434455 { :error , % { changeset | action: :update } }
@@ -594,7 +615,7 @@ defmodule Claper.Events do
594615 |> Map . drop ( [ :id , :inserted_at , :updated_at , :presentation_state ] )
595616 |> Map . put ( :event_id , changes . event . id )
596617
597- Claper. Presentations. create_presentation_file ( attrs )
618+ Presentations . create_presentation_file ( attrs )
598619
599620 _ ->
600621 { :ok , nil }
@@ -611,7 +632,7 @@ defmodule Claper.Events do
611632 |> Map . put ( :position , 0 )
612633 |> Map . put ( :banned , [ ] )
613634
614- Claper. Presentations. create_presentation_state ( attrs )
635+ Presentations . create_presentation_state ( attrs )
615636
616637 _ ->
617638 { :ok , nil }
@@ -742,7 +763,20 @@ defmodule Claper.Events do
742763
743764 """
744765 def delete_event ( % Event { } = event ) do
745- Repo . delete ( event )
766+ leaders =
767+ for % { email: email } <- get_activity_leaders_for_event ( event . id ) do
768+ Accounts . get_user_by_email ( email )
769+ end
770+
771+ with { :ok , event } <- Repo . delete ( event ) do
772+ broadcast_user_events ( event . user_id , { :deleted , event } )
773+
774+ for leader <- leaders do
775+ broadcast_user_events ( leader . id , { :deleted , event } )
776+ end
777+
778+ { :ok , event }
779+ end
746780 end
747781
748782 @ doc """
@@ -758,8 +792,6 @@ defmodule Claper.Events do
758792 Event . changeset ( event , attrs )
759793 end
760794
761- alias Claper.Events.ActivityLeader
762-
763795 @ doc """
764796 Creates a activity leader.
765797
@@ -805,7 +837,7 @@ defmodule Claper.Events do
805837 """
806838 def get_activity_leaders_for_event ( event_id ) do
807839 from ( a in ActivityLeader ,
808- left_join: u in Claper. Accounts.User,
840+ left_join: u in Accounts.User ,
809841 on: u . email == a . email ,
810842 where: a . event_id == ^ event_id ,
811843 select: % { a | user_id: u . id }
@@ -826,13 +858,47 @@ defmodule Claper.Events do
826858 ActivityLeader . changeset ( activity_leader , attrs )
827859 end
828860
829- defp broadcast ( { :ok , e , event_uuid } , event ) do
830- Phoenix.PubSub . broadcast (
831- Claper.PubSub ,
832- "event:#{ event_uuid } " ,
833- { event , event_uuid }
834- )
861+ @ doc """
862+ Subscribes to an event's public `Phoenix.PubSub` topic.
863+
864+ The broadcasted messages match the pattern:
865+
866+ * {:terminated, event_uuid}
867+
868+ """
869+ def subscribe_event ( event_uuid ) when is_binary ( event_uuid ) do
870+ Phoenix.PubSub . subscribe ( Claper.PubSub , "event:#{ event_uuid } " )
871+ end
835872
836- { :ok , e }
873+ defp broadcast_event ( event_uuid , message ) when is_binary ( event_uuid ) do
874+ Phoenix.PubSub . broadcast ( Claper.PubSub , "event:#{ event_uuid } " , message )
875+ end
876+
877+ @ doc """
878+ Subscribes to a user's events private `Phoenix.PubSub` topic.
879+
880+ The broadcasted messages match the pattern:
881+
882+ * {:created, %Event{}}
883+ * {:updated, %Event{}}
884+ * {:deleted, %Event{}}
885+
886+ """
887+ def subscribe_user_events ( user_id ) when is_integer ( user_id ) do
888+ Phoenix.PubSub . subscribe ( Claper.PubSub , "user:#{ user_id } :events" )
889+ end
890+
891+ def broadcast_user_events ( user_id , message ) when is_integer ( user_id ) do
892+ Phoenix.PubSub . broadcast ( Claper.PubSub , "user:#{ user_id } :events" , message )
893+ end
894+
895+ defp broadcast_all_users ( { _type , % Event { } = event } = message , _opts \\ [ ] ) do
896+ event = Repo . preload ( event , [ :leaders ] )
897+ broadcast_user_events ( event . user_id , message )
898+
899+ for % { email: leader_email } <- event . leaders do
900+ leader = Accounts . get_user_by_email ( leader_email )
901+ broadcast_user_events ( leader . id , message )
902+ end
837903 end
838904end
0 commit comments