@@ -33,7 +33,7 @@ defmodule Realtime.Tenants.BatchBroadcast do
3333 messages: list ( % { id: String . t ( ) , topic: String . t ( ) , payload: map ( ) , event: String . t ( ) , private: boolean ( ) } )
3434 } ,
3535 super_user :: boolean ( )
36- ) :: :ok | { :error , atom ( ) }
36+ ) :: :ok | { :error , atom ( ) | Ecto.Changeset . t ( ) }
3737 def broadcast ( auth_params , tenant , messages , super_user \\ false )
3838
3939 def broadcast ( % Plug.Conn { } = conn , % Tenant { } = tenant , messages , super_user ) do
@@ -49,7 +49,7 @@ defmodule Realtime.Tenants.BatchBroadcast do
4949 end
5050
5151 def broadcast ( auth_params , % Tenant { } = tenant , messages , super_user ) do
52- with % Ecto.Changeset { valid?: true } = changeset <- changeset ( % __MODULE__ { } , messages ) ,
52+ with % Ecto.Changeset { valid?: true } = changeset <- changeset ( % __MODULE__ { } , messages , tenant ) ,
5353 % Ecto.Changeset { changes: % { messages: messages } } = changeset ,
5454 events_per_second_rate = Tenants . events_per_second_rate ( tenant ) ,
5555 :ok <- check_rate_limit ( events_per_second_rate , tenant , length ( messages ) ) do
@@ -71,15 +71,11 @@ defmodule Realtime.Tenants.BatchBroadcast do
7171 |> Enum . group_by ( fn event -> Map . get ( event , :topic ) end )
7272 |> Enum . each ( fn { topic , events } ->
7373 if super_user do
74- Enum . each ( events , fn message ->
75- send_message_and_count ( tenant , events_per_second_rate , message , false )
76- end )
74+ Enum . each ( events , fn message -> send_message_and_count ( tenant , events_per_second_rate , message , false ) end )
7775 else
7876 case permissions_for_message ( tenant , auth_params , topic ) do
7977 % Policies { broadcast: % BroadcastPolicies { write: true } } ->
80- Enum . each ( events , fn message ->
81- send_message_and_count ( tenant , events_per_second_rate , message , false )
82- end )
78+ Enum . each ( events , fn message -> send_message_and_count ( tenant , events_per_second_rate , message , false ) end )
8379
8480 _ ->
8581 nil
@@ -88,22 +84,26 @@ defmodule Realtime.Tenants.BatchBroadcast do
8884 end )
8985
9086 :ok
87+ else
88+ % Ecto.Changeset { valid?: false } = changeset -> { :error , changeset }
89+ error -> error
9190 end
9291 end
9392
9493 def broadcast ( _ , nil , _ , _ ) , do: { :error , :tenant_not_found }
9594
96- defp changeset ( payload , attrs ) do
95+ defp changeset ( payload , attrs , tenant ) do
9796 payload
9897 |> cast ( attrs , [ ] )
99- |> cast_embed ( :messages , required: true , with: & message_changeset / 2 )
98+ |> cast_embed ( :messages , required: true , with: fn message , attrs -> message_changeset ( message , tenant , attrs ) end )
10099 end
101100
102- defp message_changeset ( message , attrs ) do
101+ defp message_changeset ( message , tenant , attrs ) do
103102 message
104103 |> cast ( attrs , [ :id , :topic , :payload , :event , :private ] )
105104 |> maybe_put_private_change ( )
106105 |> validate_required ( [ :topic , :payload , :event ] )
106+ |> validate_payload_size ( tenant )
107107 end
108108
109109 defp maybe_put_private_change ( changeset ) do
@@ -113,18 +113,25 @@ defmodule Realtime.Tenants.BatchBroadcast do
113113 end
114114 end
115115
116+ defp validate_payload_size ( changeset , tenant ) do
117+ payload = get_change ( changeset , :payload )
118+
119+ case Tenants . validate_payload_size ( tenant , payload ) do
120+ :ok -> changeset
121+ _ -> add_error ( changeset , :payload , "Payload size exceeds tenant limit" )
122+ end
123+ end
124+
116125 @ event_type "broadcast"
117126 defp send_message_and_count ( tenant , events_per_second_rate , message , public? ) do
118127 tenant_topic = Tenants . tenant_topic ( tenant , message . topic , public? )
119128
120129 payload = % { "payload" => message . payload , "event" => message . event , "type" => "broadcast" }
121130
122131 payload =
123- if message [ :id ] do
124- Map . put ( payload , "meta" , % { "id" => message . id } )
125- else
126- payload
127- end
132+ if message [ :id ] ,
133+ do: Map . put ( payload , "meta" , % { "id" => message . id } ) ,
134+ else: payload
128135
129136 broadcast = % Phoenix.Socket.Broadcast { topic: message . topic , event: @ event_type , payload: payload }
130137
0 commit comments