This commit is contained in:
Mirai Kumiko 2025-06-29 19:29:13 +02:00
parent 1faafeee26
commit ecc3953bf1
Signed by: miraikumiko
GPG key ID: 3F178B1B5E0CB278
3 changed files with 27 additions and 16 deletions

View file

@ -135,10 +135,8 @@ defmodule Nulla.Models.Actor do
Repo.get_by(__MODULE__, by) Repo.get_by(__MODULE__, by)
end end
def get_or_create_actor(actor_json) do def get_or_create_actor(%{"id" => ap_id} = actor_json) when is_binary(ap_id) do
ap_id = actor_json["id"] case get_actor(ap_id: ap_id) do
case __MODULE__.get_actor(ap_id: ap_id) do
nil -> nil ->
params = params =
actor_json actor_json
@ -146,13 +144,21 @@ defmodule Nulla.Models.Actor do
|> Map.delete("id") |> Map.delete("id")
|> Map.put("domain", URI.parse(ap_id).host) |> Map.put("domain", URI.parse(ap_id).host)
case __MODULE__.create_actor(params) do case create_actor(params) do
{:ok, actor} -> {:ok, actor} {:ok, actor} -> {:ok, actor}
{:error, changeset} -> {:error, {:actor_creation_failed, changeset}} {:error, changeset} -> {:error, {:actor_creation_failed, changeset}}
end end
actor -> actor ->
{:ok, actor} updates =
actor_json
|> Map.delete("id")
|> Map.put("domain", URI.parse(ap_id).host)
case changeset(actor, updates) |> Repo.update() do
{:ok, updated_actor} -> {:ok, updated_actor}
{:error, changeset} -> {:error, {:actor_update_failed, changeset}}
end
end end
end end
end end

View file

@ -65,20 +65,24 @@ defmodule Nulla.Models.Relation do
Repo.get_by(__MODULE__, by) Repo.get_by(__MODULE__, by)
end end
def get_or_create_relation(local_actor_id, remote_actor_id) do def get_or_create_relation(local_actor_id, remote_actor_id, opts \\ []) do
case __MODULE__.get_relation(local_actor_id: local_actor_id, remote_actor_id: remote_actor_id) do case get_relation(local_actor_id: local_actor_id, remote_actor_id: remote_actor_id) do
nil -> nil ->
case __MODULE__.create_relation(%{ attrs =
followed_by: true, Keyword.merge([local_actor_id: local_actor_id, remote_actor_id: remote_actor_id], opts)
local_actor_id: local_actor_id,
remote_actor_id: remote_actor_id case create_relation(attrs) do
}) do
{:ok, relation} -> {:ok, relation} {:ok, relation} -> {:ok, relation}
{:error, changeset} -> {:error, {:actor_creation_failed, changeset}} {:error, changeset} -> {:error, {:relation_creation_failed, changeset}}
end end
relation -> relation ->
{:ok, relation} updates = Enum.into(opts, %{})
case changeset(relation, updates) |> Repo.update() do
{:ok, updated_relation} -> {:ok, updated_relation}
{:error, changeset} -> {:error, {:relation_update_failed, changeset}}
end
end end
end end

View file

@ -107,7 +107,8 @@ defmodule NullaWeb.InboxController do
actor: local_actor.ap_id, actor: local_actor.ap_id,
object: Jason.encode!(follow_activity) object: Jason.encode!(follow_activity)
}), }),
{:ok, _relation} <- Relation.get_or_create_relation(local_actor.id, remote_actor.id) do {:ok, _relation} <-
Relation.get_or_create_relation(local_actor.id, remote_actor.id, followed_by: true) do
activity = %Activity{accept_activity | object: Jason.decode!(accept_activity.object)} activity = %Activity{accept_activity | object: Jason.decode!(accept_activity.object)}
body = Jason.encode!(ActivityPub.activity(activity)) body = Jason.encode!(ActivityPub.activity(activity))
headers = HTTPSignature.make_headers(body, remote_actor_json["inbox"], local_actor) headers = HTTPSignature.make_headers(body, remote_actor_json["inbox"], local_actor)