Separate Web modules related to Federation
This commit is contained in:
parent
d1251280c5
commit
8ca5c0b320
|
@ -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),
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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 """
|
||||||
|
|
|
@ -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
|
||||||
|
|
9
lib/mobilizon/users/guards.ex
Normal file
9
lib/mobilizon/users/guards.ex
Normal 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
|
|
@ -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")
|
||||||
|
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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.
|
||||||
"""
|
"""
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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} <-
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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 """
|
|
@ -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
|
|
|
@ -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 ->
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
|
@ -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
|
|
@ -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
|
|
@ -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
|
2
mix.exs
2
mix.exs
|
@ -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
|
||||||
],
|
],
|
||||||
|
|
|
@ -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
|
|
@ -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
|
|
@ -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"}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
|
@ -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}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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"}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
|
@ -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 = """
|
||||||
|
|
|
@ -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}
|
Loading…
Reference in a new issue