2021-06-01 18:08:03 +02:00
|
|
|
defmodule Mobilizon.Service.Notifier.Filter do
|
2021-06-03 15:00:49 +02:00
|
|
|
@moduledoc """
|
|
|
|
Module to filter activities to notify according to user's activity settings
|
|
|
|
"""
|
2021-06-01 18:08:03 +02:00
|
|
|
alias Mobilizon.Activities.Activity
|
|
|
|
alias Mobilizon.Users.{ActivitySetting, User}
|
|
|
|
|
|
|
|
@type method :: String.t()
|
|
|
|
|
|
|
|
@spec can_send_activity?(Activity.t(), method(), User.t(), function()) :: boolean()
|
2021-10-25 13:21:19 +02:00
|
|
|
def can_send_activity?(
|
|
|
|
%Activity{} = activity,
|
|
|
|
method,
|
|
|
|
%User{activity_settings: activity_settings},
|
|
|
|
get_default
|
|
|
|
) do
|
2021-06-01 18:08:03 +02:00
|
|
|
case map_activity_to_activity_setting(activity) do
|
2021-06-03 17:17:13 +02:00
|
|
|
false ->
|
|
|
|
false
|
|
|
|
|
|
|
|
key when is_binary(key) ->
|
2021-10-25 13:21:19 +02:00
|
|
|
activity_settings
|
|
|
|
|> Enum.find(&(&1.key == key && &1.method == method))
|
|
|
|
|> enabled?(key, get_default)
|
2021-06-01 18:08:03 +02:00
|
|
|
end
|
|
|
|
end
|
|
|
|
|
|
|
|
@spec enabled?(ActivitySetting.t() | nil, String.t(), function()) :: boolean()
|
|
|
|
defp enabled?(nil, activity_setting, get_default), do: get_default.(activity_setting)
|
2021-10-25 13:21:19 +02:00
|
|
|
defp enabled?(%{enabled: enabled}, _activity_setting, _get_default), do: enabled
|
2021-06-01 18:08:03 +02:00
|
|
|
|
2021-06-27 11:21:34 +02:00
|
|
|
# Mention
|
2021-06-01 18:08:03 +02:00
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :event_comment_mention}),
|
|
|
|
do: "event_comment_mention"
|
|
|
|
|
2021-06-27 11:21:34 +02:00
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :discussion_mention}),
|
|
|
|
do: "discussion_mention"
|
|
|
|
|
2021-06-01 18:08:03 +02:00
|
|
|
# Participation
|
|
|
|
@spec map_activity_to_activity_setting(Activity.t()) :: String.t() | false
|
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :participation_event_updated}),
|
|
|
|
do: "participation_event_updated"
|
|
|
|
|
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :participation_event_comment}),
|
|
|
|
do: "participation_event_comment"
|
|
|
|
|
|
|
|
# Organizers
|
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :event_new_pending_participation}),
|
|
|
|
do: "event_new_pending_participation"
|
|
|
|
|
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :event_new_participation}),
|
|
|
|
do: "event_new_participation"
|
|
|
|
|
2021-06-27 11:21:34 +02:00
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :event_new_comment}),
|
|
|
|
do: "event_new_comment"
|
|
|
|
|
2021-06-01 18:08:03 +02:00
|
|
|
# Event
|
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :event_created}), do: "event_created"
|
|
|
|
defp map_activity_to_activity_setting(%Activity{type: :event}), do: "event_updated"
|
|
|
|
|
|
|
|
# Post
|
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :post_created}), do: "post_published"
|
|
|
|
defp map_activity_to_activity_setting(%Activity{type: :post}), do: "post_updated"
|
|
|
|
|
|
|
|
# Discussion
|
|
|
|
defp map_activity_to_activity_setting(%Activity{type: :discussion}), do: "discussion_updated"
|
|
|
|
|
|
|
|
# Resource
|
|
|
|
defp map_activity_to_activity_setting(%Activity{type: :resource}), do: "resource_updated"
|
|
|
|
|
|
|
|
# Member
|
|
|
|
defp map_activity_to_activity_setting(%Activity{subject: :member_request}),
|
|
|
|
do: "member_request"
|
|
|
|
|
2021-06-27 11:21:34 +02:00
|
|
|
defp map_activity_to_activity_setting(%Activity{type: :member}), do: "member_updated"
|
2021-06-01 18:08:03 +02:00
|
|
|
|
|
|
|
defp map_activity_to_activity_setting(_), do: false
|
|
|
|
end
|