@@ -6,8 +6,8 @@ defmodule Claper.Events do
66 """
77
88 import Ecto.Query , warn: false
9- alias Claper.Repo
109
10+ alias Claper . { Repo , Accounts }
1111 alias Claper.Events . { Event , ActivityLeader }
1212
1313 @ default_page_size 5
@@ -363,7 +363,10 @@ defmodule Claper.Events do
363363 |> validate_unique_event ( )
364364 |> case do
365365 { :ok , event } ->
366- Repo . insert ( event , returning: [ :uuid ] )
366+ with { :ok , event } <- Repo . insert ( event , returning: [ :uuid ] ) do
367+ broadcast_all_users ( { :created , event } )
368+ { :ok , event }
369+ end
367370
368371 { :error , changeset } ->
369372 { :error , % { changeset | action: :insert } }
@@ -402,7 +405,25 @@ defmodule Claper.Events do
402405 |> validate_unique_event ( )
403406 |> case do
404407 { :ok , event } ->
405- Repo . update ( event , returning: [ :uuid ] )
408+ with { :ok , event } <- Repo . update ( event , returning: [ :uuid ] ) do
409+ broadcast_all_users ( { :updated , event } )
410+
411+ deleted_leaders =
412+ attrs
413+ |> Map . get ( "leaders" , % { } )
414+ |> Map . values ( )
415+ |> Enum . filter ( fn
416+ % { "delete" => "true" } -> true
417+ _ -> false
418+ end )
419+
420+ for % { "email" => leader_email } <- deleted_leaders do
421+ leader = Accounts . get_user_by_email ( leader_email )
422+ broadcast_user_events ( leader . id , { :updated , event } )
423+ end
424+
425+ { :ok , event }
426+ end
406427
407428 { :error , changeset } ->
408429 { :error , % { changeset | action: :update } }
@@ -424,7 +445,9 @@ defmodule Claper.Events do
424445 |> Repo . update ( )
425446 |> case do
426447 { :ok , event } ->
427- broadcast ( { :ok , event , event . uuid } , :event_terminated )
448+ broadcast_all_users ( { :updated , event } )
449+ broadcast_event ( event . uuid , { :event_terminated , event . uuid } )
450+ { :ok , event }
428451
429452 { :error , changeset } ->
430453 { :error , % { changeset | action: :update } }
@@ -693,7 +716,20 @@ defmodule Claper.Events do
693716
694717 """
695718 def delete_event ( % Event { } = event ) do
696- Repo . delete ( event )
719+ leaders =
720+ for % { email: email } <- get_activity_leaders_for_event ( event . id ) do
721+ Accounts . get_user_by_email ( email )
722+ end
723+
724+ with { :ok , event } <- Repo . delete ( event ) do
725+ broadcast_user_events ( event . user_id , { :deleted , event } )
726+
727+ for leader <- leaders do
728+ broadcast_user_events ( leader . id , { :deleted , event } )
729+ end
730+
731+ { :ok , event }
732+ end
697733 end
698734
699735 @ doc """
@@ -709,8 +745,6 @@ defmodule Claper.Events do
709745 Event . changeset ( event , attrs )
710746 end
711747
712- alias Claper.Events.ActivityLeader
713-
714748 @ doc """
715749 Creates a activity leader.
716750
@@ -777,13 +811,47 @@ defmodule Claper.Events do
777811 ActivityLeader . changeset ( activity_leader , attrs )
778812 end
779813
780- defp broadcast ( { :ok , e , event_uuid } , event ) do
781- Phoenix.PubSub . broadcast (
782- Claper.PubSub ,
783- "event:#{ event_uuid } " ,
784- { event , event_uuid }
785- )
814+ @ doc """
815+ Subscribes to an event's public `Phoenix.PubSub` topic.
786816
787- { :ok , e }
817+ The broadcasted messages match the pattern:
818+
819+ * {:terminated, event_uuid}
820+
821+ """
822+ def subscribe_event ( event_uuid ) when is_binary ( event_uuid ) do
823+ Phoenix.PubSub . subscribe ( Claper.PubSub , "event:#{ event_uuid } " )
824+ end
825+
826+ defp broadcast_event ( event_uuid , message ) when is_binary ( event_uuid ) do
827+ Phoenix.PubSub . broadcast ( Claper.PubSub , "event:#{ event_uuid } " , message )
828+ end
829+
830+ @ doc """
831+ Subscribes to a user's events private `Phoenix.PubSub` topic.
832+
833+ The broadcasted messages match the pattern:
834+
835+ * {:created, %Event{}}
836+ * {:updated, %Event{}}
837+ * {:deleted, %Event{}}
838+
839+ """
840+ def subscribe_user_events ( user_id ) when is_integer ( user_id ) do
841+ Phoenix.PubSub . subscribe ( Claper.PubSub , "user:#{ user_id } :events" )
842+ end
843+
844+ def broadcast_user_events ( user_id , message ) when is_integer ( user_id ) do
845+ Phoenix.PubSub . broadcast ( Claper.PubSub , "user:#{ user_id } :events" , message )
846+ end
847+
848+ defp broadcast_all_users ( { _type , % Event { } = event } = message , _opts \\ [ ] ) do
849+ event = Repo . preload ( event , [ :leaders ] )
850+ broadcast_user_events ( event . user_id , message )
851+
852+ for % { email: leader_email } <- event . leaders do
853+ leader = Accounts . get_user_by_email ( leader_email )
854+ broadcast_user_events ( leader . id , message )
855+ end
788856 end
789857end
0 commit comments