Separate Web modules related to Federation
This commit is contained in:
@@ -1,12 +1,11 @@
|
||||
defmodule Mobilizon.Service.Admin.ActionLogService do
|
||||
defmodule Mobilizon.Service.Admin.ActionLog do
|
||||
@moduledoc """
|
||||
Module to handle action log creations.
|
||||
"""
|
||||
|
||||
alias Mobilizon.Actors.Actor
|
||||
alias Mobilizon.Admin
|
||||
alias Mobilizon.{Admin, Users}
|
||||
alias Mobilizon.Admin.ActionLog
|
||||
alias Mobilizon.Users
|
||||
alias Mobilizon.Users.User
|
||||
|
||||
@doc """
|
||||
@@ -1,14 +0,0 @@
|
||||
defmodule Mobilizon.Service.EmailChecker do
|
||||
@moduledoc """
|
||||
Provides a function to test emails against a "not so bad" regex.
|
||||
"""
|
||||
|
||||
# TODO: simplify me!
|
||||
@email_regex ~r/^(([^<>()\[\]\\.,;:\s@"]+(\.[^<>()\[\]\\.,;:\s@"]+)*)|(".+"))@((\[[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}])|(([a-zA-Z\-0-9]+\.)+[a-zA-Z]{2,}))$/
|
||||
|
||||
@doc """
|
||||
Returns whether the email is valid.
|
||||
"""
|
||||
@spec valid?(String.t()) :: boolean
|
||||
def valid?(email), do: email =~ @email_regex
|
||||
end
|
||||
@@ -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 """
|
||||
A module that provides cached statistics
|
||||
"""
|
||||
alias Mobilizon.Events
|
||||
alias Mobilizon.Users
|
||||
|
||||
alias Mobilizon.{Events, Users}
|
||||
|
||||
def get_cached_value(key) do
|
||||
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 """
|
||||
Worker to build search results
|
||||
"""
|
||||
@@ -6,7 +6,7 @@ defmodule Mobilizon.Service.Workers.BackgroundWorker do
|
||||
alias Mobilizon.Actors
|
||||
alias Mobilizon.Actors.Actor
|
||||
|
||||
use Mobilizon.Service.Workers.WorkerHelper, queue: "background"
|
||||
use Mobilizon.Service.Workers.Helper, queue: "background"
|
||||
|
||||
@impl Oban.Worker
|
||||
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 """
|
||||
Worker to build search results
|
||||
"""
|
||||
@@ -8,7 +8,7 @@ defmodule Mobilizon.Service.Workers.BuildSearchWorker do
|
||||
alias Mobilizon.Storage.Repo
|
||||
alias Ecto.Adapters.SQL
|
||||
|
||||
use Mobilizon.Service.Workers.WorkerHelper, queue: "search"
|
||||
use Mobilizon.Service.Workers.Helper, queue: "search"
|
||||
|
||||
@impl Oban.Worker
|
||||
def perform(%{"op" => "insert_search_event", "event_id" => event_id}, _job) do
|
||||
@@ -3,12 +3,13 @@
|
||||
# SPDX-License-Identifier: AGPL-3.0-only
|
||||
# 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 """
|
||||
Tools to ease dealing with workers
|
||||
"""
|
||||
|
||||
alias Mobilizon.Config
|
||||
alias Mobilizon.Service.Workers.WorkerHelper
|
||||
alias Mobilizon.Storage.Repo
|
||||
|
||||
def worker_args(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
|
||||
params = Map.merge(%{"op" => operation}, params)
|
||||
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)
|
||||
|> apply(:new, [params, worker_args])
|
||||
|> Mobilizon.Storage.Repo.insert()
|
||||
|> Repo.insert()
|
||||
end
|
||||
end
|
||||
end
|
||||
Reference in New Issue
Block a user