use Ecto.Migration
def change do
- create table(:users) do
+ create_if_not_exists table(:users) do
add :email, :string
add :password_hash, :string
add :name, :string
use Ecto.Migration
def change do
- create table(:activities) do
+ create_if_not_exists table(:activities) do
add :data, :map
timestamps()
end
- create index(:activities, [:data], using: :gin)
+ create_if_not_exists index(:activities, [:data], using: :gin)
end
end
use Ecto.Migration
def change do
- create table(:objects) do
+ create_if_not_exists table(:objects) do
add :data, :map
timestamps()
use Ecto.Migration
def change do
- create index(:objects, [:data], using: :gin)
+ create_if_not_exists index(:objects, [:data], using: :gin)
end
end
use Ecto.Migration
def change do
- create unique_index(:users, [:email])
- create unique_index(:users, [:nickname])
+ create_if_not_exists unique_index(:users, [:email])
+ create_if_not_exists unique_index(:users, [:nickname])
end
end
use Ecto.Migration
def change do
- create table(:websub_server_subscriptions) do
+ create_if_not_exists table(:websub_server_subscriptions) do
add :topic, :string
add :callback, :string
add :secret, :string
use Ecto.Migration
def change do
- create table(:websub_client_subscriptions) do
+ create_if_not_exists table(:websub_client_subscriptions) do
add :topic, :string
add :secret, :string
add :valid_until, :naive_datetime_usec
defmodule Pleroma.Repo.Migrations.AddIdContraintsToActivitiesAndObjectsPartTwo do
use Ecto.Migration
- def change do
+ def up do
drop_if_exists index(:objects, ["(data->>\"id\")"], name: :objects_unique_apid_index)
drop_if_exists index(:activities, ["(data->>\"id\")"], name: :activities_unique_apid_index)
- create unique_index(:objects, ["(data->>'id')"], name: :objects_unique_apid_index)
- create unique_index(:activities, ["(data->>'id')"], name: :activities_unique_apid_index)
+ create_if_not_exists unique_index(:objects, ["(data->>'id')"], name: :objects_unique_apid_index)
+ create_if_not_exists unique_index(:activities, ["(data->>'id')"], name: :activities_unique_apid_index)
end
+
+ def down, do: :ok
end
add :local, :boolean, default: true
end
- create index(:activities, [:local])
+ create_if_not_exists index(:activities, [:local])
end
end
use Ecto.Migration
def change do
- create unique_index(:users, [:ap_id])
+ create_if_not_exists unique_index(:users, [:ap_id])
end
end
defmodule Pleroma.Repo.Migrations.LongerBios do
use Ecto.Migration
- def change do
+ def up do
alter table(:users) do
modify :bio, :text
end
end
+
+ def down do
+ alter table(:users) do
+ modify :bio, :string
+ end
+ end
+
end
use Ecto.Migration
def change do
- drop index(:activities, [:data])
+ drop_if_exists index(:activities, [:data])
end
end
def change do
# This was wrong, now a noop
- # create index(:objects, ["(data->'object'->>'id')", "(data->>'type')"], name: :activities_create_objects_index)
+ # create_if_not_exists index(:objects, ["(data->'object'->>'id')", "(data->>'type')"], name: :activities_create_objects_index)
end
end
def change do
drop_if_exists index(:objects, ["(data->'object'->>'id')", "(data->>'type')"], name: :activities_create_objects_index)
- create index(:activities, ["(data->'object'->>'id')", "(data->>'type')"], name: :activities_create_objects_index)
+ create_if_not_exists index(:activities, ["(data->'object'->>'id')", "(data->>'type')"], name: :activities_create_objects_index)
end
end
use Ecto.Migration
def change do
- create index(:activities, ["(data->>'actor')", "inserted_at desc"], name: :activities_actor_index)
+ create_if_not_exists index(:activities, ["(data->>'actor')", "inserted_at desc"], name: :activities_actor_index)
end
end
use Ecto.Migration
def change do
- create table(:apps) do
+ create_if_not_exists table(:apps) do
add :client_name, :string
add :redirect_uris, :string
add :scopes, :string
use Ecto.Migration
def change do
- create table(:oauth_authorizations) do
+ create_if_not_exists table(:oauth_authorizations) do
add :app_id, references(:apps)
add :user_id, references(:users)
add :token, :string
use Ecto.Migration
def change do
- create table(:oauth_tokens) do
+ create_if_not_exists table(:oauth_tokens) do
add :app_id, references(:apps)
add :user_id, references(:users)
add :token, :string
use Ecto.Migration
def change do
- create table(:notifications) do
+ create_if_not_exists table(:notifications) do
add :user_id, references(:users, on_delete: :delete_all)
add :activity_id, references(:activities, on_delete: :delete_all)
add :seen, :boolean, default: false
timestamps()
end
- create index(:notifications, [:user_id])
+ create_if_not_exists index(:notifications, [:user_id])
end
end
use Ecto.Migration
def change do
- create table(:password_reset_tokens) do
+ create_if_not_exists table(:password_reset_tokens) do
add :token, :string
add :user_id, references(:users)
add :used, :boolean, default: false
end
def down do
- drop index(:activities, [:actor, "id DESC NULLS LAST"])
+ drop_if_exists index(:activities, [:actor, "id DESC NULLS LAST"])
alter table(:activities) do
remove :actor
end
use Ecto.Migration
def change do
- create index(:users, [:local])
+ create_if_not_exists index(:users, [:local])
end
end
add :recipients, {:array, :string}
end
- create index(:activities, [:recipients], using: :gin)
+ create_if_not_exists index(:activities, [:recipients], using: :gin)
end
end
end)
end
end
+
+ def down, do: :ok
end
defmodule Pleroma.Repo.Migrations.MakeFollowingPostgresArray do
use Ecto.Migration
- def change do
+ def up do
alter table(:users) do
add :following_temp, {:array, :string}
end
end
rename table(:users), :following_temp, to: :following
end
+
+ def down, do: :ok
end
use Ecto.Migration
def change do
- drop index(:users, [:local])
+ drop_if_exists index(:users, [:local])
end
end
use Ecto.Migration
def change do
- create index(:users, [:local])
+ create_if_not_exists index(:users, [:local])
drop_if_exists index("activities", :local)
end
end
use Ecto.Migration
def change do
- create table(:lists) do
+ create_if_not_exists table(:lists) do
add :user_id, references(:users, on_delete: :delete_all)
add :title, :string
add :following, {:array, :string}
timestamps()
end
- create index(:lists, [:user_id])
+ create_if_not_exists index(:lists, [:user_id])
end
end
use Ecto.Migration
def change do
- create index(:users, ["(nickname || name) gist_trgm_ops"], name: :users_trigram_index, using: :gist)
+ create_if_not_exists index(:users, ["(nickname || name) gist_trgm_ops"], name: :users_trigram_index, using: :gist)
end
end
use Ecto.Migration
def change do
- create index(:lists, [:following])
+ create_if_not_exists index(:lists, [:following])
end
end
use Ecto.Migration
def change do
- create table(:user_invite_tokens) do
+ create_if_not_exists table(:user_invite_tokens) do
add :token, :string
add :used, :boolean, default: false
use Ecto.Migration
def change do
- create table(:filters) do
+ create_if_not_exists table(:filters) do
add :user_id, references(:users, on_delete: :delete_all)
add :filter_id, :integer
add :hide, :boolean
timestamps()
end
- create index(:filters, [:user_id])
- create index(:filters, [:phrase], where: "hide = true", name: :hided_phrases_index)
+ create_if_not_exists index(:filters, [:user_id])
+ create_if_not_exists index(:filters, [:phrase], where: "hide = true", name: :hided_phrases_index)
end
end
add :recipients_cc, {:array, :string}
end
- create index(:activities, [:recipients_to], using: :gin)
- create index(:activities, [:recipients_cc], using: :gin)
+ create_if_not_exists index(:activities, [:recipients_to], using: :gin)
+ create_if_not_exists index(:activities, [:recipients_cc], using: :gin)
end
end
use Ecto.Migration
def change do
- create index(:activities, ["(data->'to')"], name: :activities_to_index, using: :gin)
- create index(:activities, ["(data->'cc')"], name: :activities_cc_index, using: :gin)
+ create_if_not_exists index(:activities, ["(data->'to')"], name: :activities_to_index, using: :gin)
+ create_if_not_exists index(:activities, ["(data->'cc')"], name: :activities_cc_index, using: :gin)
end
end
defmodule Pleroma.Repo.Migrations.RemoveRecipientsToAndCcFieldsFromActivities do
use Ecto.Migration
- def change do
+ def up do
alter table(:activities) do
remove :recipients_to
remove :recipients_cc
end
end
+
+ def down do
+ alter table(:activities) do
+ add :recipients_to, {:array, :string}
+ add :recipients_cc, {:array, :string}
+ end
+ end
end
use Ecto.Migration
def change do
- create index(:users, ["(info->'is_moderator')"], name: :users_is_moderator_index, using: :gin)
+ create_if_not_exists index(:users, ["(info->'is_moderator')"], name: :users_is_moderator_index, using: :gin)
end
end
use Ecto.Migration
def change do
- create table("push_subscriptions") do
+ create_if_not_exists table("push_subscriptions") do
add :user_id, references("users", on_delete: :delete_all)
add :token_id, references("oauth_tokens", on_delete: :delete_all)
add :endpoint, :string
timestamps()
end
- create index("push_subscriptions", [:user_id, :token_id], unique: true)
+ create_if_not_exists index("push_subscriptions", [:user_id, :token_id], unique: true)
end
end
defmodule Pleroma.Repo.Migrations.AddUUIDExtension do
use Ecto.Migration
- def change do
+ def up do
execute("create extension if not exists \"uuid-ossp\"")
end
+
+ def down, do: :ok
end
defmodule Pleroma.Repo.Migrations.AddUUIDsToUserInfo do
use Ecto.Migration
- def change do
+ def up do
execute("update users set info = jsonb_set(info, '{\"id\"}', to_jsonb(uuid_generate_v4()))")
end
+
+ def down, do: :ok
end
add :tags, {:array, :string}
end
- create index(:users, [:tags], using: :gin)
+ create_if_not_exists index(:users, [:tags], using: :gin)
end
end
# 4- update relation pkeys with the new ids
# 5- rename the temporary column to id
# 6- re-create the constraints
- def change do
+ def up do
# Old serial int ids are transformed to 128bits with extra padding.
# The application (in `Pleroma.FlakeId`) handles theses IDs properly as integers; to keep compatibility
# with previously issued ids.
stop_clippy_heartbeats(clippy)
end
+ def down, do: :ok
+
defp start_clippy_heartbeats() do
count = from(a in "activities", select: count(a.id)) |> Repo.one!
end
def down do
- drop(
+ drop_if_exists(
index(:activities, ["activity_visibility(actor, recipients, data)"],
name: :activities_visibility_index
)
)
- execute("drop function activity_visibility(actor varchar, recipients varchar[], data jsonb)")
+ execute("drop function if exists activity_visibility(actor varchar, recipients varchar[], data jsonb)")
end
end
use Ecto.Migration
def change do
- create index(
+ create_if_not_exists index(
:users,
[
"""
def up do
drop_if_exists(index(:users, [], name: :users_trigram_index))
- create(
+ create_if_not_exists(
index(:users, ["(trim(nickname || ' ' || coalesce(name, ''))) gist_trgm_ops"],
name: :users_trigram_index,
using: :gist
def down do
drop_if_exists(index(:users, [], name: :users_trigram_index))
- create(
+ create_if_not_exists(
index(:users, ["(nickname || name) gist_trgm_ops"], name: :users_trigram_index, using: :gist)
)
end
use Ecto.Migration
def change do
- create(index(:users, ["(info->'is_admin')"], name: :users_is_admin_index, using: :gin))
+ create_if_not_exists(index(:users, ["(info->'is_admin')"], name: :users_is_admin_index, using: :gin))
end
end
use Ecto.Migration
def change do
- create table(:instances) do
+ create_if_not_exists table(:instances) do
add :host, :string
add :unreachable_since, :naive_datetime_usec
timestamps()
end
- create unique_index(:instances, [:host])
- create index(:instances, [:unreachable_since])
+ create_if_not_exists unique_index(:instances, [:host])
+ create_if_not_exists index(:instances, [:unreachable_since])
end
end
defmodule Pleroma.Repo.Migrations.FixInfoIds do
use Ecto.Migration
- def change do
+ def up do
execute(
"update users set info = jsonb_set(info, '{id}', to_jsonb(uuid_generate_v4())) where info->'id' is null;"
)
end
+
+ def down, do: :ok
end
defmodule Pleroma.Repo.Migrations.ChangePushSubscriptionsVarchar do
use Ecto.Migration
- def change do
+ def up do
alter table(:push_subscriptions) do
modify(:endpoint, :varchar)
end
end
+
+ def down do
+ alter table(:push_subscriptions) do
+ modify(:endpoint, :string)
+ end
+ end
end
end
def down do
- drop(
+ drop_if_exists(
index(:activities, ["activity_visibility(actor, recipients, data)", "id DESC"],
name: :activities_visibility_index,
concurrently: true,
use Ecto.Migration
def change do
- create table(:thread_mutes) do
+ create_if_not_exists table(:thread_mutes) do
add :user_id, references(:users, type: :uuid, on_delete: :delete_all)
add :context, :string
end
- create unique_index(:thread_mutes, [:user_id, :context], name: :unique_index)
+ create_if_not_exists unique_index(:thread_mutes, [:user_id, :context], name: :unique_index)
end
end
use Ecto.Migration
def change do
- create table(:registrations, primary_key: false) do
+ create_if_not_exists table(:registrations, primary_key: false) do
add :id, :uuid, primary_key: true
add :user_id, references(:users, type: :uuid, on_delete: :delete_all)
add :provider, :string
timestamps()
end
- create unique_index(:registrations, [:provider, :uid])
- create unique_index(:registrations, [:user_id, :provider, :uid])
+ create_if_not_exists unique_index(:registrations, [:provider, :uid])
+ create_if_not_exists unique_index(:registrations, [:user_id, :provider, :uid])
end
end
use Ecto.Migration
def change do
- create index(:notifications, ["id desc nulls last"])
+ create_if_not_exists index(:notifications, ["id desc nulls last"])
end
end
use Ecto.Migration
def change do
- create table(:scheduled_activities) do
+ create_if_not_exists table(:scheduled_activities) do
add(:user_id, references(:users, type: :uuid, on_delete: :delete_all))
add(:scheduled_at, :naive_datetime, null: false)
add(:params, :map, null: false)
timestamps()
end
- create(index(:scheduled_activities, [:scheduled_at]))
- create(index(:scheduled_activities, [:user_id]))
+ create_if_not_exists(index(:scheduled_activities, [:scheduled_at]))
+ create_if_not_exists(index(:scheduled_activities, [:user_id]))
end
end
use Ecto.Migration
def change do
- create(unique_index(:oauth_tokens, [:token]))
- create(index(:oauth_tokens, [:app_id]))
- create(index(:oauth_tokens, [:user_id]))
+ create_if_not_exists(unique_index(:oauth_tokens, [:token]))
+ create_if_not_exists(index(:oauth_tokens, [:app_id]))
+ create_if_not_exists(index(:oauth_tokens, [:user_id]))
end
end
defmodule Pleroma.Repo.Migrations.AddIndexOnSubscribers do
use Ecto.Migration
-
+
@disable_ddl_transaction true
def change do
create index(:users, ["(info->'subscribers')"], name: :users_subscribers_index, using: :gin, concurrently: true)
use Ecto.Migration
def change do
- create table(:conversations) do
+ create_if_not_exists table(:conversations) do
add(:ap_id, :string, null: false)
timestamps()
end
- create table(:conversation_participations) do
+ create_if_not_exists table(:conversation_participations) do
add(:user_id, references(:users, type: :uuid, on_delete: :delete_all))
add(:conversation_id, references(:conversations, on_delete: :delete_all))
add(:read, :boolean, default: false)
timestamps()
end
- create index(:conversation_participations, [:conversation_id])
- create unique_index(:conversation_participations, [:user_id, :conversation_id])
- create unique_index(:conversations, [:ap_id])
+ create_if_not_exists index(:conversation_participations, [:conversation_id])
+ create_if_not_exists unique_index(:conversation_participations, [:user_id, :conversation_id])
+ create_if_not_exists unique_index(:conversations, [:ap_id])
end
end
use Ecto.Migration
def change do
- create index(:conversation_participations, ["updated_at desc"])
+ create_if_not_exists index(:conversation_participations, ["updated_at desc"])
end
end
use Ecto.Migration
def change do
- create(index(:users, ["(info->'deactivated')"], name: :users_deactivated_index, using: :gin))
+ create_if_not_exists(index(:users, ["(info->'deactivated')"], name: :users_deactivated_index, using: :gin))
end
end
use Ecto.Migration
def change do
- create table(:bookmarks) do
+ create_if_not_exists table(:bookmarks) do
add(:user_id, references(:users, type: :uuid, on_delete: :delete_all))
add(:activity_id, references(:activities, type: :uuid, on_delete: :delete_all))
timestamps()
end
- create(unique_index(:bookmarks, [:user_id, :activity_id]))
+ create_if_not_exists(unique_index(:bookmarks, [:user_id, :activity_id]))
end
end
alias Pleroma.User
alias Pleroma.Repo
- def change do
+ def up do
query =
from(u in User,
where: u.local == true,
|> Enum.each(fn %{id: user_id, bookmarks: bookmarks} ->
Enum.each(bookmarks, fn ap_id ->
activity = Activity.get_create_by_object_ap_id(ap_id)
- unless is_nil(activity), do: {:ok, _} = Bookmark.create(user_id, activity.id)
+ unless is_nil(activity), do: {:ok, _} = Bookmark.create(user_id, activity.id)
end)
end)
remove(:bookmarks)
end
end
+
+ def down do
+ alter table(:users) do
+ add :bookmarks, {:array, :string}, null: false, default: []
+ end
+ end
end
def change do
drop_if_exists index(:activities, ["(to_tsvector('english', data->'object'->>'content'))"], using: :gin, name: :activities_fts)
- create index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts)
+ create_if_not_exists index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts)
end
end
use Ecto.Migration
def change do
- create(unique_index(:oauth_tokens, [:refresh_token]))
+ create_if_not_exists(unique_index(:oauth_tokens, [:refresh_token]))
end
end
defmodule Pleroma.Repo.Migrations.ChangeHideColumnInFilterTable do
use Ecto.Migration
- def change do
+ def up do
alter table(:filters) do
modify :hide, :boolean, default: false
end
end
+
+ def down do
+ alter table(:filters) do
+ modify :hide, :boolean
+ end
+ end
end
end
def down do
- execute("drop function thread_visibility(actor varchar, activity_id varchar)")
+ execute("drop function if exists thread_visibility(actor varchar, activity_id varchar)")
end
end
use Ecto.Migration
def change do
- create table(:config) do
+ create_if_not_exists table(:config) do
add(:key, :string)
add(:value, :binary)
timestamps()
end
- create(unique_index(:config, :key))
+ create_if_not_exists(unique_index(:config, :key))
end
end
defmodule Pleroma.Repo.Migrations.AddNonFollowsAndNonFollowersFieldsToNotificationSettings do
use Ecto.Migration
- def change do
+ def up do
execute("""
update users set info = jsonb_set(info, '{notification_settings}', '{"local": true, "remote": true, "follows": true, "followers": true, "non_follows": true, "non_followers": true}')
where local=true
""")
end
+
+ def down, do: :ok
end
use Ecto.Migration
def change do
- create(index("activities", [:local]))
+ create_if_not_exists(index("activities", [:local]))
end
end
def change do
drop_if_exists index(:activities, ["(data #> '{\"object\",\"tag\"}')"], using: :gin, name: :activities_tags)
- create index(:objects, ["(data->'tag')"], using: :gin, name: :objects_tags)
+ create_if_not_exists index(:objects, ["(data->'tag')"], using: :gin, name: :objects_tags)
end
end
add(:group, :string)
end
- drop(unique_index("config", :key))
- create(unique_index("config", [:group, :key]))
+ drop_if_exists(unique_index("config", :key))
+ create_if_not_exists(unique_index("config", [:group, :key]))
end
end
return new;
end
$$ LANGUAGE plpgsql")
- execute("create index objects_fts on objects using RUM (fts_content rum_tsvector_addon_ops, inserted_at) with (attach = 'inserted_at', to = 'fts_content');")
+ execute("create index if not exists objects_fts on objects using RUM (fts_content rum_tsvector_addon_ops, inserted_at) with (attach = 'inserted_at', to = 'fts_content');")
execute("CREATE TRIGGER tsvectorupdate BEFORE INSERT OR UPDATE ON objects
FOR EACH ROW EXECUTE PROCEDURE objects_fts_update()")
end
def down do
- execute "drop index objects_fts"
- execute "drop trigger tsvectorupdate on objects"
- execute "drop function objects_fts_update()"
+ execute "drop index if exists objects_fts"
+ execute "drop trigger if exists tsvectorupdate on objects"
+ execute "drop function if exists objects_fts_update()"
alter table(:objects) do
remove(:fts_content, :tsvector)
end
- create index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts)
+ create_if_not_exists index(:objects, ["(to_tsvector('english', data->>'content'))"], using: :gin, name: :objects_fts)
end
end