Packages
phoenix_kit
1.7.196
1.7.208
1.7.207
1.7.206
1.7.205
1.7.204
1.7.203
1.7.202
1.7.201
1.7.200
1.7.199
1.7.198
1.7.197
1.7.196
1.7.194
1.7.193
1.7.192
1.7.191
1.7.190
1.7.189
1.7.187
1.7.186
1.7.185
1.7.184
1.7.183
1.7.182
1.7.181
1.7.180
1.7.179
1.7.178
1.7.177
1.7.176
1.7.175
1.7.174
1.7.173
1.7.172
1.7.171
1.7.170
1.7.169
1.7.168
1.7.167
1.7.166
1.7.165
1.7.164
1.7.162
1.7.161
1.7.160
1.7.159
1.7.157
1.7.156
1.7.155
1.7.154
1.7.153
1.7.152
1.7.151
1.7.150
1.7.149
1.7.146
1.7.145
1.7.144
1.7.143
1.7.138
1.7.133
1.7.132
1.7.131
1.7.130
1.7.128
1.7.126
1.7.125
1.7.121
1.7.120
1.7.119
1.7.118
1.7.117
1.7.116
1.7.115
1.7.114
1.7.113
1.7.112
1.7.111
1.7.110
1.7.109
1.7.108
1.7.107
1.7.106
1.7.105
1.7.104
1.7.103
1.7.102
1.7.101
1.7.100
1.7.99
1.7.98
1.7.97
1.7.96
1.7.95
1.7.94
1.7.93
1.7.92
1.7.91
1.7.90
1.7.89
1.7.88
1.7.87
1.7.86
1.7.85
1.7.84
1.7.83
1.7.82
1.7.81
1.7.80
1.7.79
1.7.78
1.7.77
1.7.76
1.7.75
1.7.74
1.7.71
1.7.70
1.7.69
1.7.66
1.7.65
1.7.64
1.7.63
1.7.62
1.7.61
1.7.59
1.7.58
1.7.57
1.7.56
1.7.55
1.7.54
1.7.53
1.7.52
1.7.51
1.7.49
1.7.44
1.7.43
1.7.42
1.7.41
1.7.39
1.7.38
1.7.37
1.7.36
1.7.34
1.7.33
1.7.31
1.7.30
1.7.29
1.7.28
1.7.27
1.7.26
1.7.25
1.7.24
1.7.23
1.7.22
1.7.21
1.7.20
1.7.19
1.7.18
1.7.17
1.7.16
1.7.15
1.7.14
1.7.13
1.7.12
1.7.11
1.7.10
1.7.9
1.7.8
1.7.7
1.7.6
1.7.5
1.7.4
1.7.3
1.7.2
1.7.1
1.7.0
1.6.20
1.6.19
1.6.18
1.6.17
1.6.16
1.6.15
1.6.14
1.6.13
1.6.12
1.6.11
1.6.10
1.6.9
1.6.8
1.6.7
1.6.6
1.6.5
1.6.4
1.6.3
1.5.2
1.5.1
1.5.0
1.4.9
1.4.8
1.4.7
1.4.6
1.4.5
1.4.4
1.4.3
1.4.2
1.4.1
1.4.0
1.3.2
1.3.1
1.3.0
1.2.10
1.2.9
1.2.8
1.2.7
1.2.5
1.2.4
1.2.2
1.2.1
1.2.0
1.1.0
1.0.0
A foundation for building Elixir Phoenix apps — SaaS, social networks, ERP systems, marketplaces, and more
Current section
Files
Jump to
Current section
Files
lib/phoenix_kit/migrations/postgres/v57.ex
defmodule PhoenixKit.Migrations.Postgres.V57 do
@moduledoc """
V57: UUID FK Column Repair
Re-runs the idempotent UUID FK column operations from V56 to catch any
columns that were missed when V56 was applied with an earlier version of
the UUIDFKColumns module.
Specifically fixes `phoenix_kit_role_permissions` which may be missing
`role_uuid` and `granted_by_uuid` columns if V56 was applied before
those entries were added to UUIDFKColumns.
All operations are idempotent — this is a safe no-op on databases where
V56 already created everything correctly.
"""
use Ecto.Migration
alias PhoenixKit.Migrations.UUIDFKColumns
def up(%{prefix: prefix} = opts) do
# Re-run UUID FK column additions (all idempotent)
UUIDFKColumns.up(opts)
# Re-run constraints (NOT NULL + FK, all idempotent)
UUIDFKColumns.add_constraints(opts)
# Re-run unique indexes for ON CONFLICT support (all idempotent)
add_uuid_unique_indexes(prefix, opts)
execute("COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '57'")
end
def down(%{prefix: prefix} = _opts) do
# No-op: don't undo V56's work on rollback
execute("COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '56'")
end
# Same unique indexes as V56 — idempotent
defp add_uuid_unique_indexes(prefix, opts) do
escaped_prefix = Map.get(opts, :escaped_prefix, prefix)
indexes = [
{:phoenix_kit_user_role_assignments, [:user_uuid, :role_uuid],
"phoenix_kit_role_assignments_user_uuid_role_uuid_idx"},
{:phoenix_kit_role_permissions, [:role_uuid, :module_key],
"phoenix_kit_role_permissions_role_uuid_module_key_idx"},
{:phoenix_kit_user_oauth_providers, [:user_uuid, :provider],
"phoenix_kit_oauth_providers_user_uuid_provider_idx"}
]
for {table, columns, index_name} <- indexes do
if table_exists?(table, escaped_prefix) do
table_name = prefix_table_name(Atom.to_string(table), prefix)
cols = Enum.join(columns, ", ")
# CREATE INDEX forbids a schema-qualified index name — the index
# always lands in the (qualified) table's schema.
execute("""
CREATE UNIQUE INDEX IF NOT EXISTS #{index_name}
ON #{table_name}(#{cols})
""")
end
end
end
defp table_exists?(table, escaped_prefix) do
table_name = Atom.to_string(table)
query = """
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_name = '#{table_name}'
AND table_schema = '#{escaped_prefix}'
)
"""
case repo().query(query, [], log: false) do
{:ok, %{rows: [[true]]}} -> true
_ -> false
end
end
defp prefix_table_name(table_name, nil), do: table_name
defp prefix_table_name(table_name, "public"), do: "public.#{table_name}"
defp prefix_table_name(table_name, prefix), do: "#{prefix}.#{table_name}"
end