diff --git a/lib/nulla/models/actor.ex b/lib/nulla/models/actor.ex index 5c78142..5ffc15f 100644 --- a/lib/nulla/models/actor.ex +++ b/lib/nulla/models/actor.ex @@ -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 diff --git a/lib/nulla/models/relation.ex b/lib/nulla/models/relation.ex index 506b283..3271d5d 100644 --- a/lib/nulla/models/relation.ex +++ b/lib/nulla/models/relation.ex @@ -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 diff --git a/lib/nulla_web/controllers/inbox_controller.ex b/lib/nulla_web/controllers/inbox_controller.ex index 0323657..cbec289 100644 --- a/lib/nulla_web/controllers/inbox_controller.ex +++ b/lib/nulla_web/controllers/inbox_controller.ex @@ -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)