aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlex Gleason <alex@alexgleason.me>2021-12-28 23:14:18 -0600
committerAlex Gleason <alex@alexgleason.me>2021-12-28 23:14:18 -0600
commite8ad88fded9d72f8fd0ff59de5c0808fb987d5d0 (patch)
tree641d0f56a59eb08de2f080acd140897fd0798e09 /lib
parentb075de066bb2bd105c56e535511dcf3c374f2ee1 (diff)
downloadpleroma-e8ad88fded9d72f8fd0ff59de5c0808fb987d5d0.tar.gz
Add ObjectId migration helper module
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/migrators/support/object_id.ex49
1 files changed, 49 insertions, 0 deletions
diff --git a/lib/pleroma/migrators/support/object_id.ex b/lib/pleroma/migrators/support/object_id.ex
new file mode 100644
index 000000000..dc300116a
--- /dev/null
+++ b/lib/pleroma/migrators/support/object_id.ex
@@ -0,0 +1,49 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Migrators.Support.ObjectId do
+ @moduledoc """
+ Functions for migrating Object IDs.
+ """
+ alias Pleroma.Chat.MessageReference
+ alias Pleroma.DataMigrationFailedId
+ alias Pleroma.Delivery
+ alias Pleroma.HashtagObject
+ alias Pleroma.Object
+ alias Pleroma.Repo
+
+ import Ecto.Changeset
+ import Ecto.Query
+
+ @doc "Change an object's ID including all references."
+ def change_id(%Object{id: old_id} = object, new_id) do
+ Repo.transaction(fn ->
+ with {:ok, object} <- Repo.update(change(object, id: new_id)),
+ {:ok, _} <- update_object_fk(MessageReference, old_id, new_id),
+ {:ok, _} <- update_object_fk(Delivery, old_id, new_id),
+ {:ok, _} <- update_object_fk(HashtagObject, old_id, new_id),
+ {:ok, _} <- update_object_fk(DataMigrationFailedId, old_id, new_id, :record_id) do
+ {:ok, object}
+ end
+ end)
+ end
+
+ defp update_object_fk(schema, old_id, new_id, field \\ :object_id) do
+ binding = [{field, old_id}]
+
+ schema
+ |> where(^binding)
+ |> Repo.update_all(set: [{field, new_id}])
+ end
+
+ @doc "Shift a FlakeId by N places."
+ def shift_id(flake_id, n) when is_integer(n) do
+ flake_id
+ |> FlakeId.from_string()
+ |> FlakeId.to_integer()
+ |> Kernel.+(n)
+ |> FlakeId.from_integer()
+ |> FlakeId.to_string()
+ end
+end