diff options
author | Egor Kislitsyn <egor@kislitsyn.com> | 2019-02-11 13:54:21 +0700 |
---|---|---|
committer | Egor Kislitsyn <egor@kislitsyn.com> | 2019-02-11 13:54:21 +0700 |
commit | 305d2194136d4560e02c110d528164034d3727b2 (patch) | |
tree | 40510e1c4dc0140ff16e2fdc483da64c83b7077c /lib/pleroma/object.ex | |
parent | 5b1d7c3c5672af065af503891d156b6e0cf5a8c1 (diff) | |
parent | 06c4935c11fc58f5ede18706bc46dcc502e64052 (diff) | |
download | pleroma-305d2194136d4560e02c110d528164034d3727b2.tar.gz |
Merge branch 'develop' of git.pleroma.social:pleroma/pleroma into feature/jobs
# Conflicts:
# lib/pleroma/web/federator/federator.ex
# lib/pleroma/web/websub/websub.ex
Diffstat (limited to 'lib/pleroma/object.ex')
-rw-r--r-- | lib/pleroma/object.ex | 33 |
1 files changed, 30 insertions, 3 deletions
diff --git a/lib/pleroma/object.ex b/lib/pleroma/object.ex index 7b46a3b05..dabb49536 100644 --- a/lib/pleroma/object.ex +++ b/lib/pleroma/object.ex @@ -4,8 +4,15 @@ defmodule Pleroma.Object do use Ecto.Schema - alias Pleroma.{Repo, Object, User, Activity, ObjectTombstone} - import Ecto.{Query, Changeset} + + alias Pleroma.Repo + alias Pleroma.Object + alias Pleroma.User + alias Pleroma.Activity + alias Pleroma.ObjectTombstone + + import Ecto.Query + import Ecto.Changeset schema "objects" do field(:data, :map) @@ -13,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 |