Separate Web modules related to Federation

This commit is contained in:
rustra 2020-01-23 00:55:07 +01:00
parent d1251280c5
commit 8ca5c0b320
42 changed files with 279 additions and 337 deletions

View file

@ -662,9 +662,7 @@ defmodule Mobilizon.Federation.ActivityPub do
{:ok, comments, total_comments} = Events.list_public_comments_for_actor(actor, page, limit) {:ok, comments, total_comments} = Events.list_public_comments_for_actor(actor, page, limit)
event_activities = Enum.map(events, &event_to_activity/1) event_activities = Enum.map(events, &event_to_activity/1)
comment_activities = Enum.map(comments, &comment_to_activity/1) comment_activities = Enum.map(comments, &comment_to_activity/1)
activities = event_activities ++ comment_activities activities = event_activities ++ comment_activities
%{elements: activities, total: total_events + total_comments} %{elements: activities, total: total_events + total_comments}
@ -740,13 +738,8 @@ defmodule Mobilizon.Federation.ActivityPub do
defp check_for_tombstones(%{url: url}), do: Tombstone.find_tombstone(url) defp check_for_tombstones(%{url: url}), do: Tombstone.find_tombstone(url)
defp check_for_tombstones(_), do: nil defp check_for_tombstones(_), do: nil
@spec update_event(Event.t(), map(), map()) :: @spec update_event(Event.t(), map(), map()) :: {:ok, Event.t(), Activity.t()} | any()
{:ok, Event.t(), Activity.t()} | any() defp update_event(%Event{} = old_event, args, additional) do
defp update_event(
%Event{} = old_event,
args,
additional
) do
with args <- prepare_args_for_event(args), with args <- prepare_args_for_event(args),
{:ok, %Event{} = new_event} <- Events.update_event(old_event, args), {:ok, %Event{} = new_event} <- Events.update_event(old_event, args),
{:ok, true} <- Cachex.del(:activity_pub, "event_#{new_event.uuid}"), {:ok, true} <- Cachex.del(:activity_pub, "event_#{new_event.uuid}"),
@ -763,8 +756,7 @@ defmodule Mobilizon.Federation.ActivityPub do
end end
end end
@spec update_actor(Actor.t(), map(), map()) :: @spec update_actor(Actor.t(), map, map) :: {:ok, Actor.t(), Activity.t()} | any
{:ok, Actor.t(), Activity.t()} | any()
defp update_actor(%Actor{} = old_actor, args, additional) do defp update_actor(%Actor{} = old_actor, args, additional) do
with {:ok, %Actor{} = new_actor} <- Actors.update_actor(old_actor, args), with {:ok, %Actor{} = new_actor} <- Actors.update_actor(old_actor, args),
actor_as_data <- Convertible.model_to_as(new_actor), actor_as_data <- Convertible.model_to_as(new_actor),
@ -777,12 +769,8 @@ defmodule Mobilizon.Federation.ActivityPub do
end end
end end
@spec accept_follow(Follower.t(), map()) :: @spec accept_follow(Follower.t(), map) :: {:ok, Follower.t(), Activity.t()} | any
{:ok, Follower.t(), Activity.t()} | any() defp accept_follow(%Follower{} = follower, additional) do
defp accept_follow(
%Follower{} = follower,
additional
) do
with {:ok, %Follower{} = follower} <- Actors.update_follower(follower, %{approved: true}), with {:ok, %Follower{} = follower} <- Actors.update_follower(follower, %{approved: true}),
follower_as_data <- Convertible.model_to_as(follower), follower_as_data <- Convertible.model_to_as(follower),
update_data <- update_data <-
@ -804,12 +792,8 @@ defmodule Mobilizon.Federation.ActivityPub do
end end
end end
@spec accept_join(Participant.t(), map()) :: @spec accept_join(Participant.t(), map) :: {:ok, Participant.t(), Activity.t()} | any
{:ok, Participant.t(), Activity.t()} | any() defp accept_join(%Participant{} = participant, additional) do
defp accept_join(
%Participant{} = participant,
additional
) do
with {:ok, %Participant{} = participant} <- with {:ok, %Participant{} = participant} <-
Events.update_participant(participant, %{role: :participant}), Events.update_participant(participant, %{role: :participant}),
Absinthe.Subscription.publish(MobilizonWeb.Endpoint, participant.actor, Absinthe.Subscription.publish(MobilizonWeb.Endpoint, participant.actor,
@ -834,8 +818,7 @@ defmodule Mobilizon.Federation.ActivityPub do
end end
end end
@spec reject_join(Participant.t(), map()) :: @spec reject_join(Participant.t(), map()) :: {:ok, Participant.t(), Activity.t()} | any()
{:ok, Participant.t(), Activity.t()} | any()
defp reject_join(%Participant{} = participant, additional) do defp reject_join(%Participant{} = participant, additional) do
with {:ok, %Participant{} = participant} <- with {:ok, %Participant{} = participant} <-
Events.update_participant(participant, %{approved: false, role: :rejected}), Events.update_participant(participant, %{approved: false, role: :rejected}),
@ -866,8 +849,7 @@ defmodule Mobilizon.Federation.ActivityPub do
end end
end end
@spec reject_follow(Follower.t(), map()) :: @spec reject_follow(Follower.t(), map()) :: {:ok, Follower.t(), Activity.t()} | any()
{:ok, Follower.t(), Activity.t()} | any()
defp reject_follow(%Follower{} = follower, additional) do defp reject_follow(%Follower{} = follower, additional) do
with {:ok, %Follower{} = follower} <- Actors.delete_follower(follower), with {:ok, %Follower{} = follower} <- Actors.delete_follower(follower),
follower_as_data <- Convertible.model_to_as(follower), follower_as_data <- Convertible.model_to_as(follower),

View file

@ -3,10 +3,11 @@
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only
# Upstream: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/web/activity_pub/activity_pub_controller.ex # Upstream: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/web/activity_pub/activity_pub_controller.ex
defmodule MobilizonWeb.ActivityPubController do defmodule Mobilizon.Federation.ActivityPubController do
use MobilizonWeb, :controller use Mobilizon.Federation, :controller
alias Mobilizon.{Actors, Actors.Actor, Config} alias Mobilizon.{Actors, Config}
alias Mobilizon.Actors.Actor
alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.ActivityPub
alias Mobilizon.Federation.ActivityPub.Federator alias Mobilizon.Federation.ActivityPub.Federator
@ -18,7 +19,7 @@ defmodule MobilizonWeb.ActivityPubController do
action_fallback(:errors) action_fallback(:errors)
plug(MobilizonWeb.Plugs.Federating when action in [:inbox, :relay]) plug(Mobilizon.Federation.Plugs.Federating when action in [:inbox, :relay])
plug(:relay_active? when action in [:relay]) plug(:relay_active? when action in [:relay])
def relay_active?(conn, _) do def relay_active?(conn, _) do

View file

@ -3,10 +3,11 @@
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only
defmodule MobilizonWeb.Plugs.Federating do defmodule Mobilizon.Federation.Plugs.Federating do
@moduledoc """ @moduledoc """
Restrict ActivityPub routes when not federating Restrict ActivityPub routes when not federating
""" """
import Plug.Conn import Plug.Conn
def init(options) do def init(options) do

View file

@ -3,14 +3,13 @@
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only
# Upstream: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/plugs/http_signature.ex # Upstream: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/plugs/http_signature.ex
defmodule MobilizonWeb.HTTPSignaturePlug do defmodule Mobilizon.Federation.Plugs.HTTPSignatures do
@moduledoc """ @moduledoc """
# HTTPSignaturePlug
Plug to check HTTP Signatures on every incoming request Plug to check HTTP Signatures on every incoming request
""" """
import Plug.Conn import Plug.Conn
require Logger require Logger
def init(options) do def init(options) do

View file

@ -7,11 +7,12 @@ defmodule Mix.Tasks.Mobilizon.SetupSearch do
use Mix.Task use Mix.Task
alias Mobilizon.Service.Workers.BuildSearchWorker
alias Mobilizon.Storage.Repo
alias Mobilizon.Events.Event
import Ecto.Query import Ecto.Query
alias Mobilizon.Events.Event
alias Mobilizon.Service.Workers
alias Mobilizon.Storage.Repo
require Logger require Logger
@shortdoc "Insert search data" @shortdoc "Insert search data"
@ -30,7 +31,7 @@ defmodule Mix.Tasks.Mobilizon.SetupSearch do
end end
defp insert_search_event([%Event{url: url} = event | events], nb_events) do defp insert_search_event([%Event{url: url} = event | events], nb_events) do
case BuildSearchWorker.insert_search_event(event) do case Workers.BuildSearch.insert_search_event(event) do
{:ok, _} -> {:ok, _} ->
Logger.debug("Added event #{url} to the search") Logger.debug("Added event #{url} to the search")

View file

@ -11,7 +11,7 @@ defmodule Mobilizon.Actors do
alias Mobilizon.Actors.{Actor, Bot, Follower, Member} alias Mobilizon.Actors.{Actor, Bot, Follower, Member}
alias Mobilizon.{Crypto, Events} alias Mobilizon.{Crypto, Events}
alias Mobilizon.Media.File alias Mobilizon.Media.File
alias Mobilizon.Service.Workers.BackgroundWorker alias Mobilizon.Service.Workers
alias Mobilizon.Storage.{Page, Repo} alias Mobilizon.Storage.{Page, Repo}
alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.ActivityPub
@ -229,7 +229,7 @@ defmodule Mobilizon.Actors do
end end
def delete_actor(%Actor{} = actor) do def delete_actor(%Actor{} = actor) do
BackgroundWorker.enqueue("delete_actor", %{"actor_id" => actor.id}) Workers.Background.enqueue("delete_actor", %{"actor_id" => actor.id})
end end
@doc """ @doc """

View file

@ -13,7 +13,6 @@ defmodule Mobilizon.Events do
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor
alias Mobilizon.Addresses.Address alias Mobilizon.Addresses.Address
alias Mobilizon.Service.Workers.BuildSearchWorker
alias Mobilizon.Events.{ alias Mobilizon.Events.{
Comment, Comment,
@ -27,9 +26,12 @@ defmodule Mobilizon.Events do
Track Track
} }
alias Mobilizon.Service.Workers
alias Mobilizon.Storage.{Page, Repo} alias Mobilizon.Storage.{Page, Repo}
alias Mobilizon.Users.User alias Mobilizon.Users.User
alias MobilizonWeb.Email
defenum(EventVisibility, :event_visibility, [ defenum(EventVisibility, :event_visibility, [
:public, :public,
:unlisted, :unlisted,
@ -264,7 +266,7 @@ defmodule Mobilizon.Events do
with {:ok, %{insert: %Event{} = event}} <- do_create_event(attrs), with {:ok, %{insert: %Event{} = event}} <- do_create_event(attrs),
%Event{} = event <- Repo.preload(event, @event_preloads) do %Event{} = event <- Repo.preload(event, @event_preloads) do
unless event.draft, unless event.draft,
do: BuildSearchWorker.enqueue(:insert_search_event, %{"event_id" => event.id}) do: Workers.BuildSearch.enqueue(:insert_search_event, %{"event_id" => event.id})
{:ok, event} {:ok, event}
else else
@ -308,10 +310,7 @@ defmodule Mobilizon.Events do
Event.update_changeset(Repo.preload(old_event, :tags), attrs), Event.update_changeset(Repo.preload(old_event, :tags), attrs),
{:ok, %{update: %Event{} = new_event}} <- {:ok, %{update: %Event{} = new_event}} <-
Multi.new() Multi.new()
|> Multi.update( |> Multi.update(:update, changeset)
:update,
changeset
)
|> Multi.run(:write, fn _repo, %{update: %Event{draft: draft} = event} -> |> Multi.run(:write, fn _repo, %{update: %Event{draft: draft} = event} ->
with {:was_draft, true} <- {:was_draft, old_draft == true && draft == false}, with {:was_draft, true} <- {:was_draft, old_draft == true && draft == false},
{:ok, %Participant{} = participant} <- {:ok, %Participant{} = participant} <-
@ -332,14 +331,14 @@ defmodule Mobilizon.Events do
|> Repo.transaction() do |> Repo.transaction() do
Cachex.del(:ics, "event_#{new_event.uuid}") Cachex.del(:ics, "event_#{new_event.uuid}")
Mobilizon.Service.Events.Tool.calculate_event_diff_and_send_notifications( Email.Events.calculate_event_diff_and_send_notifications(
old_event, old_event,
new_event, new_event,
changes changes
) )
unless new_event.draft, unless new_event.draft,
do: BuildSearchWorker.enqueue(:update_search_event, %{"event_id" => new_event.id}) do: BuildSearch.enqueue(:update_search_event, %{"event_id" => new_event.id})
{:ok, Repo.preload(new_event, @event_preloads)} {:ok, Repo.preload(new_event, @event_preloads)}
end end

View file

@ -0,0 +1,9 @@
defmodule Mobilizon.Users.Guards do
@moduledoc """
Guards for users
"""
defguard is_admin(role) when is_atom(role) and role == :administrator
defguard is_moderator(role) when is_atom(role) and role in [:administrator, :moderator]
end

View file

@ -10,9 +10,10 @@ defmodule Mobilizon.Users.User do
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor
alias Mobilizon.Crypto alias Mobilizon.Crypto
alias Mobilizon.Events.FeedToken alias Mobilizon.Events.FeedToken
alias Mobilizon.Service.EmailChecker
alias Mobilizon.Users.UserRole alias Mobilizon.Users.UserRole
alias MobilizonWeb.Email
@type t :: %__MODULE__{ @type t :: %__MODULE__{
email: String.t(), email: String.t(),
password_hash: String.t(), password_hash: String.t(),
@ -176,7 +177,7 @@ defmodule Mobilizon.Users.User do
case changeset do case changeset do
%Ecto.Changeset{valid?: true, changes: %{email: email}} -> %Ecto.Changeset{valid?: true, changes: %{email: email}} ->
case EmailChecker.valid?(email) do case Email.Checker.valid?(email) do
false -> false ->
add_error(changeset, :email, "Email doesn't fit required format") add_error(changeset, :email, "Email doesn't fit required format")

View file

@ -3,7 +3,7 @@ defmodule MobilizonWeb.API.Reports do
API for Reports. API for Reports.
""" """
import Mobilizon.Service.Admin.ActionLogService import Mobilizon.Service.Admin.ActionLog
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor
alias Mobilizon.Reports, as: ReportsAction alias Mobilizon.Reports, as: ReportsAction

View file

@ -12,7 +12,7 @@ defmodule MobilizonWeb.WebFingerController do
alias Mobilizon.Federation.WebFinger alias Mobilizon.Federation.WebFinger
plug(MobilizonWeb.Plugs.Federating) plug(Mobilizon.Federation.Plugs.Federating)
@doc """ @doc """
Provides /.well-known/host-meta Provides /.well-known/host-meta

View file

@ -1,4 +1,4 @@
defmodule Mobilizon.Service.EmailChecker do defmodule MobilizonWeb.Email.Checker do
@moduledoc """ @moduledoc """
Provides a function to test emails against a "not so bad" regex. Provides a function to test emails against a "not so bad" regex.
""" """

View file

@ -9,11 +9,16 @@ defmodule MobilizonWeb.Email.Event do
import MobilizonWeb.Gettext import MobilizonWeb.Gettext
alias Mobilizon.Events.Event
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor
alias Mobilizon.Events
alias Mobilizon.Events.Event
alias Mobilizon.Storage.Repo
alias Mobilizon.Users.User alias Mobilizon.Users.User
alias MobilizonWeb.Email alias MobilizonWeb.Email
@important_changes [:title, :begins_on, :ends_on, :status]
@spec event_updated(User.t(), Actor.t(), Event.t(), Event.t(), list(), String.t()) :: @spec event_updated(User.t(), Actor.t(), Event.t(), Event.t(), list(), String.t()) ::
Bamboo.Email.t() Bamboo.Email.t()
def event_updated( def event_updated(
@ -40,4 +45,41 @@ defmodule MobilizonWeb.Email.Event do
|> assign(:subject, subject) |> assign(:subject, subject)
|> render(:event_updated) |> render(:event_updated)
end end
def calculate_event_diff_and_send_notifications(
%Event{} = old_event,
%Event{id: event_id} = event,
changes
) do
important = MapSet.new(@important_changes)
diff =
changes
|> Map.keys()
|> MapSet.new()
|> MapSet.intersection(important)
if MapSet.size(diff) > 0 do
Repo.transaction(fn ->
event_id
|> Events.list_local_emails_user_participants_for_event_query()
|> Repo.stream()
|> Enum.to_list()
|> Enum.each(
&send_notification_for_event_update_to_participant(&1, old_event, event, diff)
)
end)
end
end
defp send_notification_for_event_update_to_participant(
{%Actor{} = actor, %User{locale: locale} = user},
%Event{} = old_event,
%Event{} = event,
diff
) do
user
|> Email.Event.event_updated(actor, old_event, event, diff, locale)
|> Email.Mailer.deliver_later()
end
end end

View file

@ -9,11 +9,14 @@ defmodule MobilizonWeb.Email.User do
import MobilizonWeb.Gettext import MobilizonWeb.Gettext
alias Mobilizon.Config alias Mobilizon.{Config, Crypto, Users}
alias Mobilizon.Storage.Repo
alias Mobilizon.Users.User alias Mobilizon.Users.User
alias MobilizonWeb.Email alias MobilizonWeb.Email
require Logger
@spec confirmation_email(User.t(), String.t()) :: Bamboo.Email.t() @spec confirmation_email(User.t(), String.t()) :: Bamboo.Email.t()
def confirmation_email( def confirmation_email(
%User{email: email, confirmation_token: confirmation_token}, %User{email: email, confirmation_token: confirmation_token},
@ -53,4 +56,108 @@ defmodule MobilizonWeb.Email.User do
|> assign(:subject, subject) |> assign(:subject, subject)
|> render(:password_reset) |> render(:password_reset)
end end
def check_confirmation_token(token) when is_binary(token) do
with %User{} = user <- Users.get_user_by_activation_token(token),
{:ok, %User{} = user} <-
Users.update_user(user, %{
"confirmed_at" => DateTime.utc_now() |> DateTime.truncate(:second),
"confirmation_sent_at" => nil,
"confirmation_token" => nil
}) do
Logger.info("User #{user.email} has been confirmed")
{:ok, user}
else
_err ->
{:error, :invalid_token}
end
end
def resend_confirmation_email(%User{} = user, locale \\ "en") do
with :ok <- we_can_send_email(user, :confirmation_sent_at),
{:ok, user} <-
Users.update_user(user, %{
"confirmation_sent_at" => DateTime.utc_now() |> DateTime.truncate(:second)
}) do
send_confirmation_email(user, locale)
Logger.info("Sent confirmation email again to #{user.email}")
{:ok, user.email}
end
end
def send_confirmation_email(%User{} = user, locale \\ "en") do
user
|> Email.User.confirmation_email(locale)
|> Email.Mailer.deliver_later()
end
@doc """
Check that the provided token is correct and update provided password
"""
@spec check_reset_password_token(String.t(), String.t()) :: tuple
def check_reset_password_token(password, token) do
with %User{} = user <- Users.get_user_by_reset_password_token(token),
{:ok, %User{} = user} <-
Repo.update(
User.password_reset_changeset(user, %{
"password" => password,
"reset_password_sent_at" => nil,
"reset_password_token" => nil
})
) do
{:ok, user}
else
{:error, %Ecto.Changeset{errors: [password: {"registration.error.password_too_short", _}]}} ->
{:error,
"The password you have choosen is too short. Please make sure your password contains at least 6 charaters."}
_err ->
{:error,
"The token you provided is invalid. Make sure that the URL is exactly the one provided inside the email you got."}
end
end
@doc """
Send the email reset password, if it's not too soon since the last send
"""
@spec send_password_reset_email(User.t(), String.t()) :: tuple
def send_password_reset_email(%User{} = user, locale \\ "en") do
with :ok <- we_can_send_email(user, :reset_password_sent_at),
{:ok, %User{} = user_updated} <-
Repo.update(
User.send_password_reset_changeset(user, %{
"reset_password_token" => Crypto.random_string(30),
"reset_password_sent_at" => DateTime.utc_now() |> DateTime.truncate(:second)
})
) do
mail =
user_updated
|> Email.User.reset_password_email(locale)
|> Email.Mailer.deliver_later()
{:ok, mail}
else
{:error, reason} -> {:error, reason}
end
end
@spec we_can_send_email(User.t(), atom) :: :ok | {:error, :email_too_soon}
defp we_can_send_email(%User{} = user, key) do
case Map.get(user, key) do
nil ->
:ok
_ ->
case Timex.before?(
Timex.shift(Map.get(user, key), hours: 1),
DateTime.utc_now() |> DateTime.truncate(:second)
) do
true ->
:ok
false ->
{:error, :email_too_soon}
end
end
end
end end

View file

@ -35,8 +35,7 @@ defmodule MobilizonWeb.Plugs.UploadedMedia do
%{query_params: %{"name" => name}} = conn -> %{query_params: %{"name" => name}} = conn ->
name = String.replace(name, "\"", "\\\"") name = String.replace(name, "\"", "\\\"")
conn put_resp_header(conn, "content-disposition", "filename=\"#{name}\"")
|> put_resp_header("content-disposition", "filename=\"#{name}\"")
conn -> conn ->
conn conn
@ -77,11 +76,7 @@ defmodule MobilizonWeb.Plugs.UploadedMedia do
end end
defp get_media(conn, {:url, url}, true, _) do defp get_media(conn, {:url, url}, true, _) do
conn MobilizonWeb.ReverseProxy.call(conn, url, Config.get([Mobilizon.Upload, :proxy_opts], []))
|> MobilizonWeb.ReverseProxy.call(
url,
Config.get([Mobilizon.Upload, :proxy_opts], [])
)
end end
defp get_media(conn, {:url, url}, _, _) do defp get_media(conn, {:url, url}, _, _) do

View file

@ -3,7 +3,7 @@ defmodule MobilizonWeb.Resolvers.Comment do
Handles the comment-related GraphQL calls. Handles the comment-related GraphQL calls.
""" """
import Mobilizon.Service.Admin.ActionLogService import Mobilizon.Service.Admin.ActionLog
alias Mobilizon.Actors alias Mobilizon.Actors
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor

View file

@ -3,7 +3,7 @@ defmodule MobilizonWeb.Resolvers.Event do
Handles the event-related GraphQL calls. Handles the event-related GraphQL calls.
""" """
import Mobilizon.Service.Admin.ActionLogService import Mobilizon.Service.Admin.ActionLog
alias Mobilizon.Actors alias Mobilizon.Actors
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor

View file

@ -7,10 +7,11 @@ defmodule MobilizonWeb.Resolvers.User do
alias Mobilizon.{Actors, Config, Users, Events} alias Mobilizon.{Actors, Config, Users, Events}
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor
alias Mobilizon.Service.Users.{Activation, ResetPassword}
alias Mobilizon.Storage.Repo alias Mobilizon.Storage.Repo
alias Mobilizon.Users.User alias Mobilizon.Users.User
alias MobilizonWeb.Email
require Logger require Logger
@doc """ @doc """
@ -118,7 +119,7 @@ defmodule MobilizonWeb.Resolvers.User do
def create_user(_parent, args, _resolution) do def create_user(_parent, args, _resolution) do
with :registration_ok <- check_registration_config(args), with :registration_ok <- check_registration_config(args),
{:ok, %User{} = user} <- Users.register(args) do {:ok, %User{} = user} <- Users.register(args) do
Activation.send_confirmation_email(user, Map.get(args, :locale, "en")) Email.User.send_confirmation_email(user, Map.get(args, :locale, "en"))
{:ok, user} {:ok, user}
else else
:registration_closed -> :registration_closed ->
@ -161,7 +162,7 @@ defmodule MobilizonWeb.Resolvers.User do
""" """
def validate_user(_parent, %{token: token}, _resolution) do def validate_user(_parent, %{token: token}, _resolution) do
with {:check_confirmation_token, {:ok, %User{} = user}} <- with {:check_confirmation_token, {:ok, %User{} = user}} <-
{:check_confirmation_token, Activation.check_confirmation_token(token)}, {:check_confirmation_token, Email.User.check_confirmation_token(token)},
{:get_actor, actor} <- {:get_actor, Users.get_actor_for_user(user)}, {:get_actor, actor} <- {:get_actor, Users.get_actor_for_user(user)},
{:ok, %{access_token: access_token, refresh_token: refresh_token}} <- {:ok, %{access_token: access_token, refresh_token: refresh_token}} <-
Users.generate_tokens(user) do Users.generate_tokens(user) do
@ -187,7 +188,7 @@ defmodule MobilizonWeb.Resolvers.User do
with {:ok, %User{locale: locale} = user} <- with {:ok, %User{locale: locale} = user} <-
Users.get_user_by_email(Map.get(args, :email), false), Users.get_user_by_email(Map.get(args, :email), false),
{:ok, email} <- {:ok, email} <-
Activation.resend_confirmation_email(user, Map.get(args, :locale, locale)) do Email.User.resend_confirmation_email(user, Map.get(args, :locale, locale)) do
{:ok, email} {:ok, email}
else else
{:error, :user_not_found} -> {:error, :user_not_found} ->
@ -205,7 +206,7 @@ defmodule MobilizonWeb.Resolvers.User do
with email <- Map.get(args, :email), with email <- Map.get(args, :email),
{:ok, %User{locale: locale} = user} <- Users.get_user_by_email(email, true), {:ok, %User{locale: locale} = user} <- Users.get_user_by_email(email, true),
{:ok, %Bamboo.Email{} = _email_html} <- {:ok, %Bamboo.Email{} = _email_html} <-
ResetPassword.send_password_reset_email(user, Map.get(args, :locale, locale)) do Email.User.send_password_reset_email(user, Map.get(args, :locale, locale)) do
{:ok, email} {:ok, email}
else else
{:error, :user_not_found} -> {:error, :user_not_found} ->
@ -222,7 +223,7 @@ defmodule MobilizonWeb.Resolvers.User do
""" """
def reset_password(_parent, %{password: password, token: token}, _resolution) do def reset_password(_parent, %{password: password, token: token}, _resolution) do
with {:ok, %User{} = user} <- with {:ok, %User{} = user} <-
ResetPassword.check_reset_password_token(password, token), Email.User.check_reset_password_token(password, token),
{:ok, %{access_token: access_token, refresh_token: refresh_token}} <- {:ok, %{access_token: access_token, refresh_token: refresh_token}} <-
Users.authenticate(%{user: user, password: password}) do Users.authenticate(%{user: user, password: password}) do
{:ok, %{access_token: access_token, refresh_token: refresh_token, user: user}} {:ok, %{access_token: access_token, refresh_token: refresh_token, user: user}}
@ -233,11 +234,7 @@ defmodule MobilizonWeb.Resolvers.User do
def change_default_actor( def change_default_actor(
_parent, _parent,
%{preferred_username: username}, %{preferred_username: username},
%{ %{context: %{current_user: user}}
context: %{
current_user: user
}
}
) do ) do
with %Actor{id: actor_id} <- Actors.get_local_actor_by_name(username), with %Actor{id: actor_id} <- Actors.get_local_actor_by_name(username),
{:user_actor, true} <- {:user_actor, true} <-

View file

@ -14,13 +14,13 @@ defmodule MobilizonWeb.Router do
end end
pipeline :activity_pub_signature do pipeline :activity_pub_signature do
plug(MobilizonWeb.HTTPSignaturePlug) plug(Mobilizon.Federation.Plugs.HTTPSignatures)
plug(MobilizonWeb.Plugs.MappedSignatureToIdentity) plug(Mobilizon.Federation.Plugs.MappedSignatureToIdentity)
end end
pipeline :relay do pipeline :relay do
plug(MobilizonWeb.HTTPSignaturePlug) plug(Mobilizon.Federation.Plugs.HTTPSignatures)
plug(MobilizonWeb.Plugs.MappedSignatureToIdentity) plug(Mobilizon.Federation.Plugs.MappedSignatureToIdentity)
plug(:accepts, ["activity-json", "json"]) plug(:accepts, ["activity-json", "json"])
end end

View file

@ -1,12 +1,11 @@
defmodule Mobilizon.Service.Admin.ActionLogService do defmodule Mobilizon.Service.Admin.ActionLog do
@moduledoc """ @moduledoc """
Module to handle action log creations. Module to handle action log creations.
""" """
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor
alias Mobilizon.Admin alias Mobilizon.{Admin, Users}
alias Mobilizon.Admin.ActionLog alias Mobilizon.Admin.ActionLog
alias Mobilizon.Users
alias Mobilizon.Users.User alias Mobilizon.Users.User
@doc """ @doc """

View file

@ -1,50 +0,0 @@
defmodule Mobilizon.Service.Events.Tool do
@moduledoc """
Event-related tools
"""
alias Mobilizon.Events
alias Mobilizon.Events.Event
alias Mobilizon.Actors.Actor
alias Mobilizon.Users.User
alias MobilizonWeb.Email
alias Mobilizon.Storage.Repo
@important_changes [:title, :begins_on, :ends_on, :status]
def calculate_event_diff_and_send_notifications(
%Event{} = old_event,
%Event{id: event_id} = event,
changes
) do
important = MapSet.new(@important_changes)
diff =
changes
|> Map.keys()
|> MapSet.new()
|> MapSet.intersection(important)
if MapSet.size(diff) > 0 do
Repo.transaction(fn ->
event_id
|> Events.list_local_emails_user_participants_for_event_query()
|> Repo.stream()
|> Enum.to_list()
|> Enum.each(
&send_notification_for_event_update_to_participant(&1, old_event, event, diff)
)
end)
end
end
defp send_notification_for_event_update_to_participant(
{%Actor{} = actor, %User{locale: locale} = user},
%Event{} = old_event,
%Event{} = event,
diff
) do
user
|> Email.Event.event_updated(actor, old_event, event, diff, locale)
|> Email.Mailer.deliver_later()
end
end

View file

@ -2,8 +2,8 @@ defmodule Mobilizon.Service.Statistics do
@moduledoc """ @moduledoc """
A module that provides cached statistics A module that provides cached statistics
""" """
alias Mobilizon.Events
alias Mobilizon.Users alias Mobilizon.{Events, Users}
def get_cached_value(key) do def get_cached_value(key) do
case Cachex.fetch(:statistics, key, fn key -> case Cachex.fetch(:statistics, key, fn key ->

View file

@ -1,46 +0,0 @@
defmodule Mobilizon.Service.Users.Activation do
@moduledoc false
alias Mobilizon.Service.Users.Tools
alias Mobilizon.Users
alias Mobilizon.Users.User
alias MobilizonWeb.Email
require Logger
@doc false
def check_confirmation_token(token) when is_binary(token) do
with %User{} = user <- Users.get_user_by_activation_token(token),
{:ok, %User{} = user} <-
Users.update_user(user, %{
"confirmed_at" => DateTime.utc_now() |> DateTime.truncate(:second),
"confirmation_sent_at" => nil,
"confirmation_token" => nil
}) do
Logger.info("User #{user.email} has been confirmed")
{:ok, user}
else
_err ->
{:error, :invalid_token}
end
end
def resend_confirmation_email(%User{} = user, locale \\ "en") do
with :ok <- Tools.we_can_send_email(user, :confirmation_sent_at),
{:ok, user} <-
Users.update_user(user, %{
"confirmation_sent_at" => DateTime.utc_now() |> DateTime.truncate(:second)
}) do
send_confirmation_email(user, locale)
Logger.info("Sent confirmation email again to #{user.email}")
{:ok, user.email}
end
end
def send_confirmation_email(%User{} = user, locale \\ "en") do
user
|> Email.User.confirmation_email(locale)
|> Email.Mailer.deliver_later()
end
end

View file

@ -1,62 +0,0 @@
defmodule Mobilizon.Service.Users.ResetPassword do
@moduledoc false
alias Mobilizon.Service.Users.Tools
alias Mobilizon.Storage.Repo
alias Mobilizon.Users
alias Mobilizon.Users.User
alias MobilizonWeb.Email
require Logger
@doc """
Check that the provided token is correct and update provided password
"""
@spec check_reset_password_token(String.t(), String.t()) :: tuple
def check_reset_password_token(password, token) do
with %User{} = user <- Users.get_user_by_reset_password_token(token),
{:ok, %User{} = user} <-
Repo.update(
User.password_reset_changeset(user, %{
"password" => password,
"reset_password_sent_at" => nil,
"reset_password_token" => nil
})
) do
{:ok, user}
else
{:error, %Ecto.Changeset{errors: [password: {"registration.error.password_too_short", _}]}} ->
{:error,
"The password you have choosen is too short. Please make sure your password contains at least 6 charaters."}
_err ->
{:error,
"The token you provided is invalid. Make sure that the URL is exactly the one provided inside the email you got."}
end
end
@doc """
Send the email reset password, if it's not too soon since the last send
"""
@spec send_password_reset_email(User.t(), String.t()) :: tuple
def send_password_reset_email(%User{} = user, locale \\ "en") do
with :ok <- Tools.we_can_send_email(user, :reset_password_sent_at),
{:ok, %User{} = user_updated} <-
Repo.update(
User.send_password_reset_changeset(user, %{
"reset_password_token" => Tools.random_string(30),
"reset_password_sent_at" => DateTime.utc_now() |> DateTime.truncate(:second)
})
) do
mail =
user_updated
|> Email.User.reset_password_email(locale)
|> Email.Mailer.deliver_later()
{:ok, mail}
else
{:error, reason} -> {:error, reason}
end
end
end

View file

@ -1,43 +0,0 @@
defmodule Mobilizon.Service.Users.Tools do
@moduledoc """
Common functions for actors services
"""
alias Mobilizon.Users.User
@spec we_can_send_email(User.t(), atom()) :: :ok | {:error, :email_too_soon}
def we_can_send_email(%User{} = user, key \\ :reset_password_sent_at) do
case Map.get(user, key) do
nil ->
:ok
_ ->
case Timex.before?(
Timex.shift(Map.get(user, key), hours: 1),
DateTime.utc_now() |> DateTime.truncate(:second)
) do
true ->
:ok
false ->
{:error, :email_too_soon}
end
end
end
@spec random_string(integer) :: String.t()
def random_string(length) do
length
|> :crypto.strong_rand_bytes()
|> Base.url_encode64()
end
end
defmodule Mobilizon.Users.Guards do
@moduledoc """
Guards for users
"""
defguard is_admin(role) when is_atom(role) and role == :administrator
defguard is_moderator(role) when is_atom(role) and role in [:administrator, :moderator]
end

View file

@ -1,4 +1,4 @@
defmodule Mobilizon.Service.Workers.BackgroundWorker do defmodule Mobilizon.Service.Workers.Background do
@moduledoc """ @moduledoc """
Worker to build search results Worker to build search results
""" """
@ -6,7 +6,7 @@ defmodule Mobilizon.Service.Workers.BackgroundWorker do
alias Mobilizon.Actors alias Mobilizon.Actors
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor
use Mobilizon.Service.Workers.WorkerHelper, queue: "background" use Mobilizon.Service.Workers.Helper, queue: "background"
@impl Oban.Worker @impl Oban.Worker
def perform(%{"op" => "delete_actor", "actor_id" => actor_id}, _job) do def perform(%{"op" => "delete_actor", "actor_id" => actor_id}, _job) do

View file

@ -1,4 +1,4 @@
defmodule Mobilizon.Service.Workers.BuildSearchWorker do defmodule Mobilizon.Service.Workers.BuildSearch do
@moduledoc """ @moduledoc """
Worker to build search results Worker to build search results
""" """
@ -8,7 +8,7 @@ defmodule Mobilizon.Service.Workers.BuildSearchWorker do
alias Mobilizon.Storage.Repo alias Mobilizon.Storage.Repo
alias Ecto.Adapters.SQL alias Ecto.Adapters.SQL
use Mobilizon.Service.Workers.WorkerHelper, queue: "search" use Mobilizon.Service.Workers.Helper, queue: "search"
@impl Oban.Worker @impl Oban.Worker
def perform(%{"op" => "insert_search_event", "event_id" => event_id}, _job) do def perform(%{"op" => "insert_search_event", "event_id" => event_id}, _job) do

View file

@ -3,12 +3,13 @@
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only
# Upstream: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/workers/worker_helper.ex # Upstream: https://git.pleroma.social/pleroma/pleroma/blob/develop/lib/pleroma/workers/worker_helper.ex
defmodule Mobilizon.Service.Workers.WorkerHelper do defmodule Mobilizon.Service.Workers.Helper do
@moduledoc """ @moduledoc """
Tools to ease dealing with workers Tools to ease dealing with workers
""" """
alias Mobilizon.Config alias Mobilizon.Config
alias Mobilizon.Service.Workers.WorkerHelper alias Mobilizon.Storage.Repo
def worker_args(queue) do def worker_args(queue) do
case Config.get([:workers, :retries, queue]) do case Config.get([:workers, :retries, queue]) do
@ -39,11 +40,11 @@ defmodule Mobilizon.Service.Workers.WorkerHelper do
def enqueue(operation, params, worker_args \\ []) do def enqueue(operation, params, worker_args \\ []) do
params = Map.merge(%{"op" => operation}, params) params = Map.merge(%{"op" => operation}, params)
queue_atom = String.to_existing_atom(unquote(queue)) queue_atom = String.to_existing_atom(unquote(queue))
worker_args = worker_args ++ WorkerHelper.worker_args(queue_atom) worker_args = worker_args ++ __MODULE__.worker_args(queue_atom)
unquote(caller_module) unquote(caller_module)
|> apply(:new, [params, worker_args]) |> apply(:new, [params, worker_args])
|> Mobilizon.Storage.Repo.insert() |> Repo.insert()
end end
end end
end end

View file

@ -283,10 +283,10 @@ defmodule Mobilizon.Mixfile do
Mobilizon.Federation.HTTPSignatures.Signature, Mobilizon.Federation.HTTPSignatures.Signature,
Mobilizon.Federation.WebFinger, Mobilizon.Federation.WebFinger,
Mobilizon.Federation.WebFinger.XmlBuilder, Mobilizon.Federation.WebFinger.XmlBuilder,
Mobilizon.Federation.Plugs.HTTPSignatures,
MobilizonWeb.ActivityPub.ActorView, MobilizonWeb.ActivityPub.ActorView,
MobilizonWeb.ActivityPub.ObjectView, MobilizonWeb.ActivityPub.ObjectView,
MobilizonWeb.ActivityPubController, MobilizonWeb.ActivityPubController,
MobilizonWeb.HTTPSignaturePlug,
MobilizonWeb.WebFingerController, MobilizonWeb.WebFingerController,
MobilizonWeb.NodeInfoController MobilizonWeb.NodeInfoController
], ],

View file

@ -3,15 +3,15 @@
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only
defmodule MobilizonWeb.Plug.FederatingTest do defmodule Mobilizon.Federation.Plug.FederatingTest do
use MobilizonWeb.ConnCase use MobilizonWeb.ConnCase
alias Mobilizon.Federation.Plugs.Federating
test "returns and halt the conn when federating is disabled" do test "returns and halt the conn when federating is disabled" do
Mobilizon.Config.put([:instance, :federating], false) Mobilizon.Config.put([:instance, :federating], false)
conn = conn = Federating.call(build_conn(), %{})
build_conn()
|> MobilizonWeb.Plugs.Federating.call(%{})
assert conn.status == 404 assert conn.status == 404
assert conn.halted assert conn.halted
@ -20,9 +20,7 @@ defmodule MobilizonWeb.Plug.FederatingTest do
test "does nothing when federating is enabled" do test "does nothing when federating is enabled" do
Mobilizon.Config.put([:instance, :federating], true) Mobilizon.Config.put([:instance, :federating], true)
conn = conn = Federating.call(build_conn(), %{})
build_conn()
|> MobilizonWeb.Plugs.Federating.call(%{})
refute conn.status refute conn.status
refute conn.halted refute conn.halted

View file

@ -3,9 +3,10 @@
# Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/> # Copyright © 2017-2019 Pleroma Authors <https://pleroma.social/>
# SPDX-License-Identifier: AGPL-3.0-only # SPDX-License-Identifier: AGPL-3.0-only
defmodule MobilizonWeb.Plugs.MappedSignatureToIdentityPlugTest do defmodule Mobilizon.Federation.Plugs.MappedSignatureToIdentityTest do
use MobilizonWeb.ConnCase use MobilizonWeb.ConnCase
use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney use ExVCR.Mock, adapter: ExVCR.Adapter.Hackney
alias MobilizonWeb.Plugs.MappedSignatureToIdentity alias MobilizonWeb.Plugs.MappedSignatureToIdentity
defp set_signature(conn, key_id) do defp set_signature(conn, key_id) do

View file

@ -9,6 +9,7 @@ defmodule Mobilizon.ActorsTest do
alias Mobilizon.Actors.{Actor, Bot, Follower, Member} alias Mobilizon.Actors.{Actor, Bot, Follower, Member}
alias Mobilizon.Events.{Event, Comment} alias Mobilizon.Events.{Event, Comment}
alias Mobilizon.Media.File, as: FileModel alias Mobilizon.Media.File, as: FileModel
alias Mobilizon.Service.Workers
alias Mobilizon.Storage.Page alias Mobilizon.Storage.Page
alias Mobilizon.Federation.ActivityPub alias Mobilizon.Federation.ActivityPub
@ -311,7 +312,7 @@ defmodule Mobilizon.ActorsTest do
assert {:ok, %Oban.Job{}} = Actors.delete_actor(actor) assert {:ok, %Oban.Job{}} = Actors.delete_actor(actor)
assert_enqueued( assert_enqueued(
worker: Mobilizon.Service.Workers.BackgroundWorker, worker: Workers.Background,
args: %{"actor_id" => actor.id, "op" => "delete_actor"} args: %{"actor_id" => actor.id, "op" => "delete_actor"}
) )

View file

@ -6,8 +6,8 @@ defmodule Mobilizon.EventsTest do
alias Mobilizon.Actors.Actor alias Mobilizon.Actors.Actor
alias Mobilizon.Events alias Mobilizon.Events
alias Mobilizon.Events.{Comment, Event, Participant, Session, Tag, TagRelation, Track} alias Mobilizon.Events.{Comment, Event, Participant, Session, Tag, TagRelation, Track}
alias Mobilizon.Service.Workers
alias Mobilizon.Storage.Page alias Mobilizon.Storage.Page
alias Mobilizon.Service.Workers.BuildSearchWorker
@event_valid_attrs %{ @event_valid_attrs %{
begins_on: "2010-04-17 14:00:00Z", begins_on: "2010-04-17 14:00:00Z",
@ -23,7 +23,7 @@ defmodule Mobilizon.EventsTest do
setup do setup do
actor = insert(:actor) actor = insert(:actor)
event = insert(:event, organizer_actor: actor, visibility: :public) event = insert(:event, organizer_actor: actor, visibility: :public)
BuildSearchWorker.insert_search_event(event) Workers.BuildSearch.insert_search_event(event)
{:ok, actor: actor, event: event} {:ok, actor: actor, event: event}
end end
@ -63,7 +63,7 @@ defmodule Mobilizon.EventsTest do
assert title == hd(Events.build_events_for_search(event.title).elements).title assert title == hd(Events.build_events_for_search(event.title).elements).title
%Event{} = event2 = insert(:event, title: "Special event") %Event{} = event2 = insert(:event, title: "Special event")
BuildSearchWorker.insert_search_event(event2) Workers.BuildSearch.insert_search_event(event2)
assert event2.title == assert event2.title ==
Events.build_events_for_search("Special").elements |> hd() |> Map.get(:title) Events.build_events_for_search("Special").elements |> hd() |> Map.get(:title)
@ -76,7 +76,7 @@ defmodule Mobilizon.EventsTest do
tag1 = insert(:tag, title: "coucou") tag1 = insert(:tag, title: "coucou")
tag2 = insert(:tag, title: "hola") tag2 = insert(:tag, title: "hola")
%Event{} = event3 = insert(:event, title: "Nothing like it", tags: [tag1, tag2]) %Event{} = event3 = insert(:event, title: "Nothing like it", tags: [tag1, tag2])
BuildSearchWorker.insert_search_event(event3) Workers.BuildSearch.insert_search_event(event3)
assert event3.title == assert event3.title ==
Events.build_events_for_search("hola").elements |> hd() |> Map.get(:title) Events.build_events_for_search("hola").elements |> hd() |> Map.get(:title)

View file

@ -1,4 +1,4 @@
defmodule Mobilizon.Service.Users.ToolsTest do defmodule Mobilizon.Users.GuardsTest do
use Mobilizon.DataCase use Mobilizon.DataCase
import Mobilizon.Factory import Mobilizon.Factory

View file

@ -2,11 +2,14 @@ defmodule MobilizonWeb.Resolvers.EventResolverTest do
use MobilizonWeb.ConnCase use MobilizonWeb.ConnCase
use Bamboo.Test use Bamboo.Test
use Oban.Testing, repo: Mobilizon.Storage.Repo use Oban.Testing, repo: Mobilizon.Storage.Repo
alias Mobilizon.Events
alias MobilizonWeb.{AbsintheHelpers, Email}
alias Mobilizon.Service.Workers.BuildSearchWorker
import Mobilizon.Factory import Mobilizon.Factory
alias Mobilizon.Events
alias Mobilizon.Service.Workers
alias MobilizonWeb.{AbsintheHelpers, Email}
@event %{ @event %{
description: "some body", description: "some body",
title: "some title", title: "some title",
@ -155,7 +158,7 @@ defmodule MobilizonWeb.Resolvers.EventResolverTest do
assert json_response(res, 200)["data"]["createEvent"]["title"] == "come to my event" assert json_response(res, 200)["data"]["createEvent"]["title"] == "come to my event"
{id, ""} = json_response(res, 200)["data"]["createEvent"]["id"] |> Integer.parse() {id, ""} = json_response(res, 200)["data"]["createEvent"]["id"] |> Integer.parse()
assert_enqueued(worker: BuildSearchWorker, args: %{event_id: id, op: :insert_search_event}) assert_enqueued(worker: Workers.BuildSearch, args: %{event_id: id, op: :insert_search_event})
end end
test "create_event/3 creates an event and escapes title and description", %{ test "create_event/3 creates an event and escapes title and description", %{
@ -201,7 +204,7 @@ defmodule MobilizonWeb.Resolvers.EventResolverTest do
"<b>My description</b> <img src=\"http://placekitten.com/g/200/300\" />" "<b>My description</b> <img src=\"http://placekitten.com/g/200/300\" />"
{id, ""} = res["data"]["createEvent"]["id"] |> Integer.parse() {id, ""} = res["data"]["createEvent"]["id"] |> Integer.parse()
assert_enqueued(worker: BuildSearchWorker, args: %{event_id: id, op: :insert_search_event}) assert_enqueued(worker: Workers.BuildSearch, args: %{event_id: id, op: :insert_search_event})
end end
test "create_event/3 creates an event as a draft", %{conn: conn, actor: actor, user: user} do test "create_event/3 creates an event as a draft", %{conn: conn, actor: actor, user: user} do
@ -238,7 +241,7 @@ defmodule MobilizonWeb.Resolvers.EventResolverTest do
{event_id_int, ""} = Integer.parse(event_id) {event_id_int, ""} = Integer.parse(event_id)
refute_enqueued( refute_enqueued(
worker: BuildSearchWorker, worker: Workers.BuildSearch,
args: %{event_id: event_id_int, op: :insert_search_event} args: %{event_id: event_id_int, op: :insert_search_event}
) )
@ -371,7 +374,7 @@ defmodule MobilizonWeb.Resolvers.EventResolverTest do
{event_id_int, ""} = Integer.parse(event["id"]) {event_id_int, ""} = Integer.parse(event["id"])
assert_enqueued( assert_enqueued(
worker: BuildSearchWorker, worker: Workers.BuildSearch,
args: %{event_id: event_id_int, op: :insert_search_event} args: %{event_id: event_id_int, op: :insert_search_event}
) )
end end
@ -827,7 +830,7 @@ defmodule MobilizonWeb.Resolvers.EventResolverTest do
{event_id_int, ""} = Integer.parse(event_res["id"]) {event_id_int, ""} = Integer.parse(event_res["id"])
assert_enqueued( assert_enqueued(
worker: BuildSearchWorker, worker: Workers.BuildSearch,
args: %{event_id: event_id_int, op: :update_search_event} args: %{event_id: event_id_int, op: :update_search_event}
) )

View file

@ -1,10 +1,14 @@
defmodule MobilizonWeb.Resolvers.PersonResolverTest do defmodule MobilizonWeb.Resolvers.PersonResolverTest do
use MobilizonWeb.ConnCase use MobilizonWeb.ConnCase
alias MobilizonWeb.AbsintheHelpers
alias Mobilizon.Actors.Actor
import Mobilizon.Factory
use Oban.Testing, repo: Mobilizon.Storage.Repo use Oban.Testing, repo: Mobilizon.Storage.Repo
import Mobilizon.Factory
alias Mobilizon.Actors.Actor
alias Mobilizon.Service.Workers
alias MobilizonWeb.AbsintheHelpers
@non_existent_username "nonexistent" @non_existent_username "nonexistent"
describe "Person Resolver" do describe "Person Resolver" do
@ -500,7 +504,7 @@ defmodule MobilizonWeb.Resolvers.PersonResolverTest do
assert json_response(res, 200)["errors"] == nil assert json_response(res, 200)["errors"] == nil
assert_enqueued( assert_enqueued(
worker: Mobilizon.Service.Workers.BackgroundWorker, worker: Workers.Background,
args: %{"actor_id" => person_id, "op" => "delete_actor"} args: %{"actor_id" => person_id, "op" => "delete_actor"}
) )

View file

@ -1,8 +1,10 @@
defmodule MobilizonWeb.Resolvers.SearchResolverTest do defmodule MobilizonWeb.Resolvers.SearchResolverTest do
use MobilizonWeb.ConnCase use MobilizonWeb.ConnCase
alias MobilizonWeb.AbsintheHelpers
import Mobilizon.Factory import Mobilizon.Factory
alias Mobilizon.Service.Workers.BuildSearchWorker
alias Mobilizon.Service.Workers
alias MobilizonWeb.AbsintheHelpers
setup %{conn: conn} do setup %{conn: conn} do
user = insert(:user) user = insert(:user)
@ -17,7 +19,7 @@ defmodule MobilizonWeb.Resolvers.SearchResolverTest do
insert(:actor, user: user, preferred_username: "test_person") insert(:actor, user: user, preferred_username: "test_person")
insert(:actor, type: :Group, preferred_username: "test_group") insert(:actor, type: :Group, preferred_username: "test_group")
event = insert(:event, title: "test_event") event = insert(:event, title: "test_event")
BuildSearchWorker.insert_search_event(event) Workers.BuildSearch.insert_search_event(event)
query = """ query = """
{ {
@ -51,7 +53,7 @@ defmodule MobilizonWeb.Resolvers.SearchResolverTest do
actor = insert(:actor, user: user, preferred_username: "test_person") actor = insert(:actor, user: user, preferred_username: "test_person")
insert(:actor, type: :Group, preferred_username: "test_group") insert(:actor, type: :Group, preferred_username: "test_group")
event = insert(:event, title: "test_event") event = insert(:event, title: "test_event")
BuildSearchWorker.insert_search_event(event) Workers.BuildSearch.insert_search_event(event)
query = """ query = """
{ {
@ -84,7 +86,7 @@ defmodule MobilizonWeb.Resolvers.SearchResolverTest do
insert(:actor, user: user, preferred_username: "test_person") insert(:actor, user: user, preferred_username: "test_person")
group = insert(:actor, type: :Group, preferred_username: "test_group") group = insert(:actor, type: :Group, preferred_username: "test_group")
event = insert(:event, title: "test_event") event = insert(:event, title: "test_event")
BuildSearchWorker.insert_search_event(event) Workers.BuildSearch.insert_search_event(event)
query = """ query = """
{ {
@ -118,9 +120,9 @@ defmodule MobilizonWeb.Resolvers.SearchResolverTest do
event1 = insert(:event, title: "Pineapple fashion week") event1 = insert(:event, title: "Pineapple fashion week")
event2 = insert(:event, title: "I love pineAPPLE") event2 = insert(:event, title: "I love pineAPPLE")
event3 = insert(:event, title: "Hello") event3 = insert(:event, title: "Hello")
BuildSearchWorker.insert_search_event(event1) Workers.BuildSearch.insert_search_event(event1)
BuildSearchWorker.insert_search_event(event2) Workers.BuildSearch.insert_search_event(event2)
BuildSearchWorker.insert_search_event(event3) Workers.BuildSearch.insert_search_event(event3)
query = """ query = """
{ {
@ -161,9 +163,9 @@ defmodule MobilizonWeb.Resolvers.SearchResolverTest do
event1 = insert(:event, title: "Pineapple fashion week") event1 = insert(:event, title: "Pineapple fashion week")
event2 = insert(:event, title: "I love pineAPPLE") event2 = insert(:event, title: "I love pineAPPLE")
event3 = insert(:event, title: "Hello") event3 = insert(:event, title: "Hello")
BuildSearchWorker.insert_search_event(event1) Workers.BuildSearch.insert_search_event(event1)
BuildSearchWorker.insert_search_event(event2) Workers.BuildSearch.insert_search_event(event2)
BuildSearchWorker.insert_search_event(event3) Workers.BuildSearch.insert_search_event(event3)
query = """ query = """
{ {
@ -198,7 +200,7 @@ defmodule MobilizonWeb.Resolvers.SearchResolverTest do
insert(:actor, user: user, preferred_username: "person", name: "Torréfaction du Kafé") insert(:actor, user: user, preferred_username: "person", name: "Torréfaction du Kafé")
insert(:actor, type: :Group, preferred_username: "group", name: "Kafé group") insert(:actor, type: :Group, preferred_username: "group", name: "Kafé group")
event = insert(:event, title: "Tour du monde des Kafés") event = insert(:event, title: "Tour du monde des Kafés")
BuildSearchWorker.insert_search_event(event) Workers.BuildSearch.insert_search_event(event)
# Elaborate query # Elaborate query
query = """ query = """
@ -230,7 +232,7 @@ defmodule MobilizonWeb.Resolvers.SearchResolverTest do
insert(:actor, user: user, preferred_username: "person", name: "Torréfaction du Kafé") insert(:actor, user: user, preferred_username: "person", name: "Torréfaction du Kafé")
group = insert(:actor, type: :Group, preferred_username: "group", name: "Kafé group") group = insert(:actor, type: :Group, preferred_username: "group", name: "Kafé group")
event = insert(:event, title: "Tour du monde des Kafés") event = insert(:event, title: "Tour du monde des Kafés")
BuildSearchWorker.insert_search_event(event) Workers.BuildSearch.insert_search_event(event)
# Elaborate query # Elaborate query
query = """ query = """

View file

@ -1,12 +1,12 @@
defmodule Mobilizon.Service.Admin.ActionLogServiceTest do defmodule Mobilizon.Service.Admin.ActionLogTest do
@moduledoc """ @moduledoc """
Test the ActionLogService module. Test the ActionLog module.
""" """
use Mobilizon.DataCase use Mobilizon.DataCase
import Mobilizon.Factory import Mobilizon.Factory
import Mobilizon.Service.Admin.ActionLogService import Mobilizon.Service.Admin.ActionLog
alias Mobilizon.Admin.ActionLog alias Mobilizon.Admin.ActionLog
alias Mobilizon.Reports.{Note, Report} alias Mobilizon.Reports.{Note, Report}