aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorIvan Tashkinov <ivantashkinov@gmail.com>2020-04-14 20:10:02 +0300
committerIvan Tashkinov <ivantashkinov@gmail.com>2020-04-14 20:10:02 +0300
commit0cda80f266c03557b47112e52bfe748655b4321c (patch)
tree3066cf037c65cd8a19aa0228cb75ec6acc94d870 /lib
parent650853fc895fb2e21eac347e056eab98b842a3b7 (diff)
parent6c3e09fbce823fe1ddef96a4a1ec54d67ceeec50 (diff)
downloadpleroma-0cda80f266c03557b47112e52bfe748655b4321c.tar.gz
Merge remote-tracking branch 'remotes/origin/develop' into 1364-no-pushes-from-blocked-domains-users
# Conflicts: # lib/pleroma/notification.ex
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/config/transfer_task.ex100
-rw-r--r--lib/pleroma/marker.ex45
-rw-r--r--lib/pleroma/notification.ex46
-rw-r--r--lib/pleroma/plugs/mapped_signature_to_identity_plug.ex6
-rw-r--r--lib/pleroma/pool/connections.ex2
-rw-r--r--lib/pleroma/web/mastodon_api/views/marker_view.ex5
-rw-r--r--lib/pleroma/web/rich_media/helpers.ex5
7 files changed, 85 insertions, 124 deletions
diff --git a/lib/pleroma/config/transfer_task.ex b/lib/pleroma/config/transfer_task.ex
index 936bc9ab1..3871e1cbb 100644
--- a/lib/pleroma/config/transfer_task.ex
+++ b/lib/pleroma/config/transfer_task.ex
@@ -54,10 +54,19 @@ defmodule Pleroma.Config.TransferTask do
[:pleroma, nil, :prometheus]
end
+ {logger, other} =
+ (Repo.all(ConfigDB) ++ deleted_settings)
+ |> Enum.map(&transform_and_merge/1)
+ |> Enum.split_with(fn {group, _, _, _} -> group in [:logger, :quack] end)
+
+ logger
+ |> Enum.sort()
+ |> Enum.each(&configure/1)
+
started_applications = Application.started_applications()
- (Repo.all(ConfigDB) ++ deleted_settings)
- |> Enum.map(&merge_and_update/1)
+ other
+ |> Enum.map(&update/1)
|> Enum.uniq()
|> Enum.reject(&(&1 in reject_restart))
|> maybe_set_pleroma_last()
@@ -81,51 +90,66 @@ defmodule Pleroma.Config.TransferTask do
end
end
- defp group_for_restart(:logger, key, _, merged_value) do
- # change logger configuration in runtime, without restart
- if Keyword.keyword?(merged_value) and
- key not in [:compile_time_application, :backends, :compile_time_purge_matching] do
- Logger.configure_backend(key, merged_value)
- else
- Logger.configure([{key, merged_value}])
- end
+ defp transform_and_merge(%{group: group, key: key, value: value} = setting) do
+ group = ConfigDB.from_string(group)
+ key = ConfigDB.from_string(key)
+ value = ConfigDB.from_binary(value)
- nil
- end
+ default = Config.Holder.default_config(group, key)
- defp group_for_restart(group, _, _, _) when group != :pleroma, do: group
+ merged =
+ cond do
+ Ecto.get_meta(setting, :state) == :deleted -> default
+ can_be_merged?(default, value) -> ConfigDB.merge_group(group, key, default, value)
+ true -> value
+ end
- defp group_for_restart(group, key, value, _) do
- if pleroma_need_restart?(group, key, value), do: group
+ {group, key, value, merged}
end
- defp merge_and_update(setting) do
- try do
- key = ConfigDB.from_string(setting.key)
- group = ConfigDB.from_string(setting.group)
+ # change logger configuration in runtime, without restart
+ defp configure({:quack, key, _, merged}) do
+ Logger.configure_backend(Quack.Logger, [{key, merged}])
+ :ok = update_env(:quack, key, merged)
+ end
- default = Config.Holder.default_config(group, key)
- value = ConfigDB.from_binary(setting.value)
+ defp configure({_, :backends, _, merged}) do
+ # removing current backends
+ Enum.each(Application.get_env(:logger, :backends), &Logger.remove_backend/1)
- merged_value =
- cond do
- Ecto.get_meta(setting, :state) == :deleted -> default
- can_be_merged?(default, value) -> ConfigDB.merge_group(group, key, default, value)
- true -> value
- end
+ Enum.each(merged, &Logger.add_backend/1)
- :ok = update_env(group, key, merged_value)
+ :ok = update_env(:logger, :backends, merged)
+ end
- group_for_restart(group, key, value, merged_value)
+ defp configure({group, key, _, merged}) do
+ merged =
+ if key == :console do
+ put_in(merged[:format], merged[:format] <> "\n")
+ else
+ merged
+ end
+
+ backend =
+ if key == :ex_syslogger,
+ do: {ExSyslogger, :ex_syslogger},
+ else: key
+
+ Logger.configure_backend(backend, merged)
+ :ok = update_env(:logger, group, merged)
+ end
+
+ defp update({group, key, value, merged}) do
+ try do
+ :ok = update_env(group, key, merged)
+
+ if group != :pleroma or pleroma_need_restart?(group, key, value), do: group
rescue
error ->
error_msg =
- "updating env causes error, group: " <>
- inspect(setting.group) <>
- " key: " <>
- inspect(setting.key) <>
- " value: " <>
- inspect(ConfigDB.from_binary(setting.value)) <> " error: " <> inspect(error)
+ "updating env causes error, group: #{inspect(group)}, key: #{inspect(key)}, value: #{
+ inspect(value)
+ } error: #{inspect(error)}"
Logger.warn(error_msg)
@@ -133,6 +157,9 @@ defmodule Pleroma.Config.TransferTask do
end
end
+ defp update_env(group, key, nil), do: Application.delete_env(group, key)
+ defp update_env(group, key, value), do: Application.put_env(group, key, value)
+
@spec pleroma_need_restart?(atom(), atom(), any()) :: boolean()
def pleroma_need_restart?(group, key, value) do
group_and_key_need_reboot?(group, key) or group_and_subkey_need_reboot?(group, key, value)
@@ -150,9 +177,6 @@ defmodule Pleroma.Config.TransferTask do
end)
end
- defp update_env(group, key, nil), do: Application.delete_env(group, key)
- defp update_env(group, key, value), do: Application.put_env(group, key, value)
-
defp restart(_, :pleroma, env), do: Restarter.Pleroma.restart_after_boot(env)
defp restart(started_applications, app, _) do
diff --git a/lib/pleroma/marker.ex b/lib/pleroma/marker.ex
index 4d82860f5..443927392 100644
--- a/lib/pleroma/marker.ex
+++ b/lib/pleroma/marker.ex
@@ -9,34 +9,24 @@ defmodule Pleroma.Marker do
import Ecto.Query
alias Ecto.Multi
- alias Pleroma.Notification
alias Pleroma.Repo
alias Pleroma.User
- alias __MODULE__
@timelines ["notifications"]
- @type t :: %__MODULE__{}
schema "markers" do
field(:last_read_id, :string, default: "")
field(:timeline, :string, default: "")
field(:lock_version, :integer, default: 0)
- field(:unread_count, :integer, default: 0, virtual: true)
belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
timestamps()
end
- @doc "Gets markers by user and timeline."
- @spec get_markers(User.t(), list(String)) :: list(t())
def get_markers(user, timelines \\ []) do
- user
- |> get_query(timelines)
- |> unread_count_query()
- |> Repo.all()
+ Repo.all(get_query(user, timelines))
end
- @spec upsert(User.t(), map()) :: {:ok | :error, any()}
def upsert(%User{} = user, attrs) do
attrs
|> Map.take(@timelines)
@@ -55,27 +45,6 @@ defmodule Pleroma.Marker do
|> Repo.transaction()
end
- @spec multi_set_last_read_id(Multi.t(), User.t(), String.t()) :: Multi.t()
- def multi_set_last_read_id(multi, %User{} = user, "notifications") do
- multi
- |> Multi.run(:counters, fn _repo, _changes ->
- {:ok, %{last_read_id: Repo.one(Notification.last_read_query(user))}}
- end)
- |> Multi.insert(
- :marker,
- fn %{counters: attrs} ->
- %Marker{timeline: "notifications", user_id: user.id}
- |> struct(attrs)
- |> Ecto.Changeset.change()
- end,
- returning: true,
- on_conflict: {:replace, [:last_read_id]},
- conflict_target: [:user_id, :timeline]
- )
- end
-
- def multi_set_last_read_id(multi, _, _), do: multi
-
defp get_marker(user, timeline) do
case Repo.find_resource(get_query(user, timeline)) do
{:ok, marker} -> %__MODULE__{marker | user: user}
@@ -102,16 +71,4 @@ defmodule Pleroma.Marker do
|> by_user_id(user.id)
|> by_timeline(timelines)
end
-
- defp unread_count_query(query) do
- from(
- q in query,
- left_join: n in "notifications",
- on: n.user_id == q.user_id and n.seen == false,
- group_by: [:id],
- select_merge: %{
- unread_count: fragment("count(?)", n.id)
- }
- )
- end
end
diff --git a/lib/pleroma/notification.ex b/lib/pleroma/notification.ex
index ca492c1ad..f517282f7 100644
--- a/lib/pleroma/notification.ex
+++ b/lib/pleroma/notification.ex
@@ -5,7 +5,6 @@
defmodule Pleroma.Notification do
use Ecto.Schema
- alias Ecto.Multi
alias Pleroma.Activity
alias Pleroma.FollowingRelationship
alias Pleroma.Marker
@@ -41,17 +40,6 @@ defmodule Pleroma.Notification do
|> cast(attrs, [:seen])
end
- @spec last_read_query(User.t()) :: Ecto.Queryable.t()
- def last_read_query(user) do
- from(q in Pleroma.Notification,
- where: q.user_id == ^user.id,
- where: q.seen == true,
- select: type(q.id, :string),
- limit: 1,
- order_by: [desc: :id]
- )
- end
-
defp for_user_query_ap_id_opts(user, opts) do
ap_id_relationships =
[:block] ++
@@ -198,23 +186,25 @@ defmodule Pleroma.Notification do
|> Repo.all()
end
- def set_read_up_to(%{id: user_id} = user, id) do
+ def set_read_up_to(%{id: user_id} = _user, id) do
query =
from(
n in Notification,
where: n.user_id == ^user_id,
where: n.id <= ^id,
where: n.seen == false,
+ update: [
+ set: [
+ seen: true,
+ updated_at: ^NaiveDateTime.utc_now()
+ ]
+ ],
# Ideally we would preload object and activities here
# but Ecto does not support preloads in update_all
select: n.id
)
- {:ok, %{ids: {_, notification_ids}}} =
- Multi.new()
- |> Multi.update_all(:ids, query, set: [seen: true, updated_at: NaiveDateTime.utc_now()])
- |> Marker.multi_set_last_read_id(user, "notifications")
- |> Repo.transaction()
+ {_, notification_ids} = Repo.update_all(query, [])
Notification
|> where([n], n.id in ^notification_ids)
@@ -231,18 +221,11 @@ defmodule Pleroma.Notification do
|> Repo.all()
end
- @spec read_one(User.t(), String.t()) ::
- {:ok, Notification.t()} | {:error, Ecto.Changeset.t()} | nil
def read_one(%User{} = user, notification_id) do
with {:ok, %Notification{} = notification} <- get(user, notification_id) do
- Multi.new()
- |> Multi.update(:update, changeset(notification, %{seen: true}))
- |> Marker.multi_set_last_read_id(user, "notifications")
- |> Repo.transaction()
- |> case do
- {:ok, %{update: notification}} -> {:ok, notification}
- {:error, :update, changeset, _} -> {:error, changeset}
- end
+ notification
+ |> changeset(%{seen: true})
+ |> Repo.update()
end
end
@@ -324,11 +307,8 @@ defmodule Pleroma.Notification do
# TODO move to sql, too.
def create_notification(%Activity{} = activity, %User{} = user, do_send \\ true) do
unless skip?(activity, user) do
- {:ok, %{notification: notification}} =
- Multi.new()
- |> Multi.insert(:notification, %Notification{user_id: user.id, activity: activity})
- |> Marker.multi_set_last_read_id(user, "notifications")
- |> Repo.transaction()
+ notification = %Notification{user_id: user.id, activity: activity}
+ {:ok, notification} = Repo.insert(notification)
if do_send do
Streamer.stream(["user", "user:notification"], notification)
diff --git a/lib/pleroma/plugs/mapped_signature_to_identity_plug.ex b/lib/pleroma/plugs/mapped_signature_to_identity_plug.ex
index 4f124ed4d..84b7c5d83 100644
--- a/lib/pleroma/plugs/mapped_signature_to_identity_plug.ex
+++ b/lib/pleroma/plugs/mapped_signature_to_identity_plug.ex
@@ -42,13 +42,13 @@ defmodule Pleroma.Web.Plugs.MappedSignatureToIdentityPlug do
else
{:user_match, false} ->
Logger.debug("Failed to map identity from signature (payload actor mismatch)")
- Logger.debug("key_id=#{key_id_from_conn(conn)}, actor=#{actor}")
+ Logger.debug("key_id=#{inspect(key_id_from_conn(conn))}, actor=#{inspect(actor)}")
assign(conn, :valid_signature, false)
# remove me once testsuite uses mapped capabilities instead of what we do now
{:user, nil} ->
Logger.debug("Failed to map identity from signature (lookup failure)")
- Logger.debug("key_id=#{key_id_from_conn(conn)}, actor=#{actor}")
+ Logger.debug("key_id=#{inspect(key_id_from_conn(conn))}, actor=#{actor}")
conn
end
end
@@ -60,7 +60,7 @@ defmodule Pleroma.Web.Plugs.MappedSignatureToIdentityPlug do
else
_ ->
Logger.debug("Failed to map identity from signature (no payload actor mismatch)")
- Logger.debug("key_id=#{key_id_from_conn(conn)}")
+ Logger.debug("key_id=#{inspect(key_id_from_conn(conn))}")
assign(conn, :valid_signature, false)
end
end
diff --git a/lib/pleroma/pool/connections.ex b/lib/pleroma/pool/connections.ex
index 4d4ba913c..acafe1bea 100644
--- a/lib/pleroma/pool/connections.ex
+++ b/lib/pleroma/pool/connections.ex
@@ -243,7 +243,7 @@ defmodule Pleroma.Pool.Connections do
@impl true
def handle_info({:DOWN, _ref, :process, conn_pid, reason}, state) do
- Logger.debug("received DOWM message for #{inspect(conn_pid)} reason -> #{inspect(reason)}")
+ Logger.debug("received DOWN message for #{inspect(conn_pid)} reason -> #{inspect(reason)}")
state =
with {key, conn} <- find_conn(state.conns, conn_pid) do
diff --git a/lib/pleroma/web/mastodon_api/views/marker_view.ex b/lib/pleroma/web/mastodon_api/views/marker_view.ex
index 415dae93b..985368fe5 100644
--- a/lib/pleroma/web/mastodon_api/views/marker_view.ex
+++ b/lib/pleroma/web/mastodon_api/views/marker_view.ex
@@ -10,10 +10,7 @@ defmodule Pleroma.Web.MastodonAPI.MarkerView do
Map.put_new(acc, m.timeline, %{
last_read_id: m.last_read_id,
version: m.lock_version,
- updated_at: NaiveDateTime.to_iso8601(m.updated_at),
- pleroma: %{
- unread_count: m.unread_count
- }
+ updated_at: NaiveDateTime.to_iso8601(m.updated_at)
})
end)
end
diff --git a/lib/pleroma/web/rich_media/helpers.ex b/lib/pleroma/web/rich_media/helpers.ex
index 0314535d2..9d3d7f978 100644
--- a/lib/pleroma/web/rich_media/helpers.ex
+++ b/lib/pleroma/web/rich_media/helpers.ex
@@ -64,5 +64,8 @@ defmodule Pleroma.Web.RichMedia.Helpers do
def fetch_data_for_activity(_), do: %{}
- def perform(:fetch, %Activity{} = activity), do: fetch_data_for_activity(activity)
+ def perform(:fetch, %Activity{} = activity) do
+ fetch_data_for_activity(activity)
+ :ok
+ end
end