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)
end
def get_or_create_actor(actor_json) do
ap_id = actor_json["id"]
case __MODULE__.get_actor(ap_id: ap_id) do
def get_or_create_actor(%{"id" => ap_id} = actor_json) when is_binary(ap_id) do
case get_actor(ap_id: ap_id) do
nil ->
params =
actor_json
@ -146,13 +144,21 @@ defmodule Nulla.Models.Actor do
|> Map.delete("id")
|> Map.put("domain", URI.parse(ap_id).host)
case __MODULE__.create_actor(params) do
case create_actor(params) do
{:ok, actor} -> {:ok, actor}
{:error, changeset} -> {:error, {:actor_creation_failed, changeset}}
end
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

View file

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

View file

@ -107,7 +107,8 @@ defmodule NullaWeb.InboxController do
actor: local_actor.ap_id,
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)}
body = Jason.encode!(ActivityPub.activity(activity))
headers = HTTPSignature.make_headers(body, remote_actor_json["inbox"], local_actor)