- def handle_cast(
- {:send, %{activity: %{data: %{"type" => type}}, user_id: user_id} = notification},
- state
- )
- when type in @types do
- actor = User.get_cached_by_ap_id(notification.activity.data["actor"])
- body = notification |> format(actor) |> Jason.encode!()
-
- Subscription
- |> where(user_id: ^user_id)
- |> Repo.all()
- |> Enum.each(fn record ->
- subscription = %{
- keys: %{
- p256dh: record.key_p256dh,
- auth: record.key_auth
- },
- endpoint: record.endpoint
- }
-
- case WebPushEncryption.send_web_push(body, subscription, @gcm_api_key) do
- {:ok, %{status_code: code}} when 400 <= code and code < 500 ->
- Logger.debug("Removing subscription record")
- Repo.delete!(record)
- :ok
-
- {:ok, %{status_code: code}} when 200 <= code and code < 300 ->
- :ok
-
- {:ok, %{status_code: code}} ->
- Logger.error("Web Push Nonification failed with code: #{code}")
- :error
+ def send(notification),
+ do: GenServer.cast(__MODULE__, {:send, notification})