aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--lib/pleroma/migrators/support/object_id.ex23
-rw-r--r--priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs4
-rw-r--r--test/pleroma/migrators/support/object_id_test.exs7
3 files changed, 34 insertions, 0 deletions
diff --git a/lib/pleroma/migrators/support/object_id.ex b/lib/pleroma/migrators/support/object_id.ex
index dc300116a..e4425492e 100644
--- a/lib/pleroma/migrators/support/object_id.ex
+++ b/lib/pleroma/migrators/support/object_id.ex
@@ -46,4 +46,27 @@ defmodule Pleroma.Migrators.Support.ObjectId do
|> FlakeId.from_integer()
|> FlakeId.to_string()
end
+
+ @doc "Generate a FlakeId from a datetime."
+ @spec flake_from_time(NaiveDateTime.t()) :: flake_id :: String.t()
+ def flake_from_time(%NaiveDateTime{} = dt) do
+ dt
+ |> build_worker()
+ |> FlakeId.Worker.gen_flake()
+ |> FlakeId.to_string()
+ end
+
+ # Build a one-off FlakeId worker.
+ defp build_worker(%NaiveDateTime{} = dt) do
+ %FlakeId.Worker{
+ node: FlakeId.Worker.worker_id(),
+ time: get_timestamp(dt, :millisecond)
+ }
+ end
+
+ # Convert a NaiveDateTime into a Unix timestamp.
+ @epoch ~N[1970-01-01 00:00:00]
+ defp get_timestamp(%NaiveDateTime{} = dt, unit) do
+ NaiveDateTime.diff(dt, @epoch, unit)
+ end
end
diff --git a/priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs b/priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs
index 229d6fa28..6ed5fab2a 100644
--- a/priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs
+++ b/priv/repo/migrations/20211218181640_resolve_activity_object_conflicts.exs
@@ -1,6 +1,7 @@
defmodule Pleroma.Repo.Migrations.ResolveActivityObjectConflicts do
@moduledoc """
Find objects with a conflicting activity ID, and update them.
+ This should only happen on servers that existed before "20181218172826_users_and_activities_flake_id".
"""
use Ecto.Migration
@@ -8,12 +9,15 @@ defmodule Pleroma.Repo.Migrations.ResolveActivityObjectConflicts do
alias Pleroma.Migrators.Support.ObjectId
alias Pleroma.Repo
+ import Ecto.Query
+
def up do
Object
|> join(:inner, [o], a in "activities", on: a.id == o.id)
|> Repo.stream()
|> Stream.each(fn object ->
# TODO
+ :error
end)
end
diff --git a/test/pleroma/migrators/support/object_id_test.exs b/test/pleroma/migrators/support/object_id_test.exs
index 9359d8ecf..f0cdefc32 100644
--- a/test/pleroma/migrators/support/object_id_test.exs
+++ b/test/pleroma/migrators/support/object_id_test.exs
@@ -11,4 +11,11 @@ defmodule Pleroma.Migrators.Support.ObjectIdTest do
assert ObjectId.shift_id(id, 1) == "AEma8DXGjGtUDO6Qev"
assert ObjectId.shift_id(id, -1) == "AEma8DXGjGtUDO6Qet"
end
+
+ test "flake_from_time/1" do
+ now = NaiveDateTime.utc_now()
+ id = ObjectId.flake_from_time(now)
+
+ assert FlakeId.flake_id?(id)
+ end
end