Merge branch 'fix/credo-issues' into 'develop'
[akkoma] / lib / pleroma / object.ex
index 5f1fc801b592d70da0534fdb9defd34e99880758..dabb495364277fdd0299a5e185db8947f26fd8bc 100644 (file)
@@ -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