summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/object.ex22
-rw-r--r--lib/pleroma/user.ex17
-rw-r--r--lib/pleroma/web/activity_pub/utils.ex10
-rw-r--r--lib/pleroma/web/twitter_api/twitter_api.ex12
4 files changed, 32 insertions, 29 deletions
diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex
index 7b46a3b05..96079cf22 100644
--- a/lib/pleroma/object.ex
+++ b/lib/pleroma/object.ex
@@ -13,9 +13,29 @@ defmodule Pleroma.Object do
timestamps()
end
+ def insert_or_get(cng) do
+ {_, data} = fetch_field(cng, :data)
+ id = data["id"] || data[:id]
+ key = "object:#{id}"
+
+ fetcher = fn _ ->
+ with nil <- get_by_ap_id(id),
+ {:ok, object} <- Repo.insert(cng) do
+ {:commit, object}
+ else
+ %Object{} = object -> {:commit, object}
+ e -> {:ignore, e}
+ end
+ end
+
+ with {state, object} when state in [:commit, :ok] <- Cachex.fetch(:object_cache, key, fetcher) do
+ {:ok, object}
+ end
+ end
+
def create(data) do
Object.change(%Object{}, %{data: data})
- |> Repo.insert()
+ |> insert_or_get()
end
def change(struct, params \\ %{}) do
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 33630ac7c..361034887 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -96,12 +96,6 @@ defmodule Pleroma.User do
"#{ap_id(user)}/followers"
end
- def follow_changeset(struct, params \\ %{}) do
- struct
- |> cast(params, [:following])
- |> validate_required([:following])
- end
-
def user_info(%User{} = user) do
oneself = if user.local, do: 1, else: 0
@@ -256,8 +250,8 @@ defmodule Pleroma.User do
@doc "Inserts provided changeset, performs post-registration actions (confirmation email sending etc.)"
def register(%Ecto.Changeset{} = changeset) do
with {:ok, user} <- Repo.insert(changeset),
- {:ok, _} <- try_send_confirmation_email(user),
- {:ok, user} <- autofollow_users(user) do
+ {:ok, user} <- autofollow_users(user),
+ {:ok, _} <- try_send_confirmation_email(user) do
{:ok, user}
end
end
@@ -307,10 +301,13 @@ defmodule Pleroma.User do
end
end
- @doc "A mass follow for local users. Ignores blocks and has no side effects"
+ @doc "A mass follow for local users. Respects blocks but does not create activities."
@spec follow_all(User.t(), list(User.t())) :: {atom(), User.t()}
def follow_all(follower, followeds) do
- followed_addresses = Enum.map(followeds, fn %{follower_address: fa} -> fa end)
+ followed_addresses =
+ followeds
+ |> Enum.reject(fn %{ap_id: ap_id} -> ap_id in follower.info.blocks end)
+ |> Enum.map(fn %{follower_address: fa} -> fa end)
q =
from(u in User,
diff --git a/lib/pleroma/web/activity_pub/utils.ex b/lib/pleroma/web/activity_pub/utils.ex
index 4a2cc6738..134701e80 100644
--- a/lib/pleroma/web/activity_pub/utils.ex
+++ b/lib/pleroma/web/activity_pub/utils.ex
@@ -134,14 +134,8 @@ defmodule Pleroma.Web.ActivityPub.Utils do
context = context || generate_id("contexts")
changeset = Object.context_mapping(context)
- case Repo.insert(changeset) do
- {:ok, object} ->
- object
-
- # This should be solved by an upsert, but it seems ecto
- # has problems accessing the constraint inside the jsonb.
- {:error, _} ->
- Object.get_cached_by_ap_id(context)
+ with {:ok, object} <- Object.insert_or_get(changeset) do
+ object
end
end
diff --git a/lib/pleroma/web/twitter_api/twitter_api.ex b/lib/pleroma/web/twitter_api/twitter_api.ex
index 7d00c01a1..ddd5c5cfb 100644
--- a/lib/pleroma/web/twitter_api/twitter_api.ex
+++ b/lib/pleroma/web/twitter_api/twitter_api.ex
@@ -305,16 +305,8 @@ defmodule Pleroma.Web.TwitterAPI.TwitterAPI do
else
_e ->
changeset = Object.context_mapping(context)
-
- case Repo.insert(changeset) do
- {:ok, %{id: id}} ->
- id
-
- # This should be solved by an upsert, but it seems ecto
- # has problems accessing the constraint inside the jsonb.
- {:error, _} ->
- Object.get_cached_by_ap_id(context).id
- end
+ {:ok, object} = Object.insert_or_get(changeset)
+ object.id
end
end