Object: Automatically set ap_id from the data.
This commit is contained in:
parent
51c1578780
commit
8785ad8d90
@ -19,14 +19,21 @@ defmodule Pleroma.Object do
|
||||
|
||||
schema "objects" do
|
||||
field(:data, :map)
|
||||
# This is set by a database side trigger on insert and update
|
||||
field(:ap_id, :string)
|
||||
|
||||
timestamps()
|
||||
end
|
||||
|
||||
# Add the default 'returning' options, so we get the generated ap_id column
|
||||
def insert(cng, options \\ []) do
|
||||
cng
|
||||
|> Repo.insert(Keyword.put(options, :returning, true))
|
||||
end
|
||||
|
||||
def create(data) do
|
||||
Object.change(%Object{}, %{data: data})
|
||||
|> Repo.insert()
|
||||
|> insert()
|
||||
end
|
||||
|
||||
def change(struct, params \\ %{}) do
|
||||
|
@ -1013,7 +1013,7 @@ defmodule Pleroma.Web.ActivityPub.ActivityPub do
|
||||
data
|
||||
end
|
||||
|
||||
Repo.insert(%Object{data: obj_data})
|
||||
Object.insert(%Object{data: obj_data})
|
||||
end
|
||||
end
|
||||
|
||||
|
@ -143,7 +143,7 @@ defmodule Pleroma.Web.ActivityPub.Utils do
|
||||
|
||||
with true <- is_nil(object),
|
||||
changeset <- Object.context_mapping(context),
|
||||
{:ok, inserted_object} <- Repo.insert(changeset) do
|
||||
{:ok, inserted_object} <- Object.insert(changeset) do
|
||||
inserted_object
|
||||
else
|
||||
_ ->
|
||||
|
@ -6,6 +6,6 @@ defmodule Pleroma.Repo.Migrations.AddApIdColumnToObjects do
|
||||
add :ap_id, :string
|
||||
end
|
||||
|
||||
create unique_index(:objects, [:ap_id], concurrently: true)
|
||||
create unique_index(:objects, [:ap_id])
|
||||
end
|
||||
end
|
||||
|
@ -0,0 +1,7 @@
|
||||
defmodule Pleroma.Repo.Migrations.FillObjectApIdField do
|
||||
use Ecto.Migration
|
||||
|
||||
def change do
|
||||
execute("update objects set ap_id = data->>'id'")
|
||||
end
|
||||
end
|
@ -0,0 +1,25 @@
|
||||
defmodule Pleroma.Repo.Migrations.AddObjectApIdTrigger do
|
||||
use Ecto.Migration
|
||||
|
||||
def change do
|
||||
execute("""
|
||||
CREATE OR REPLACE FUNCTION set_ap_id()
|
||||
RETURNS trigger
|
||||
LANGUAGE plpgsql
|
||||
AS $BODY$
|
||||
BEGIN
|
||||
NEW.ap_id = NEW.data->>'id';
|
||||
RETURN NEW;
|
||||
END
|
||||
$BODY$;
|
||||
""")
|
||||
|
||||
execute("""
|
||||
CREATE TRIGGER object_ap_id_extraction
|
||||
BEFORE INSERT OR UPDATE
|
||||
ON objects
|
||||
FOR EACH ROW
|
||||
EXECUTE PROCEDURE set_ap_id();
|
||||
""")
|
||||
end
|
||||
end
|
@ -19,6 +19,7 @@ defmodule Pleroma.ObjectTest do
|
||||
|
||||
test "returns an object by it's AP id" do
|
||||
object = insert(:note)
|
||||
object = Object.get_by_id(object.id)
|
||||
found_object = Object.get_by_ap_id(object.data["id"])
|
||||
|
||||
assert object == found_object
|
||||
@ -32,11 +33,21 @@ defmodule Pleroma.ObjectTest do
|
||||
|
||||
{:error, _result} = Repo.insert(cs)
|
||||
end
|
||||
|
||||
test "it automatically sets the ap_id field" do
|
||||
{:ok, object} =
|
||||
%Object{}
|
||||
|> Object.change(%{data: %{id: "myid"}})
|
||||
|> Object.insert()
|
||||
|
||||
assert object.ap_id == "myid"
|
||||
end
|
||||
end
|
||||
|
||||
describe "deletion function" do
|
||||
test "deletes an object" do
|
||||
object = insert(:note)
|
||||
object = Object.get_by_id(object.id)
|
||||
found_object = Object.get_by_ap_id(object.data["id"])
|
||||
|
||||
assert object == found_object
|
||||
@ -52,6 +63,7 @@ defmodule Pleroma.ObjectTest do
|
||||
|
||||
test "ensures cache is cleared for the object" do
|
||||
object = insert(:note)
|
||||
object = Object.get_by_id(object.id)
|
||||
cached_object = Object.get_cached_by_ap_id(object.data["id"])
|
||||
|
||||
assert object == cached_object
|
||||
|
Loading…
Reference in New Issue
Block a user