X-Git-Url: http://git.squeep.com/?a=blobdiff_plain;ds=inline;f=lib%2Fpleroma%2Fobject.ex;fp=lib%2Fpleroma%2Fobject.ex;h=dabb495364277fdd0299a5e185db8947f26fd8bc;hb=6c8d15da110e86f799052c82df8b7b2404f8f722;hp=5f1fc801b592d70da0534fdb9defd34e99880758;hpb=6ca633ddd30e8330e47f6456fe16fa72506e2e13;p=akkoma diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index 5f1fc801b..dabb49536 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -20,9 +20,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