Packages
phoenix_kit
1.7.155
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/v75.ex
defmodule PhoenixKit.Migrations.Postgres.V75 do
@moduledoc """
V75: Fix missing/wrong DEFAULT on `uuid` PK columns, drop orphaned sequence.
V72 renamed `id` → `uuid` on 30 Category A tables, but the old `id` column's
DEFAULT was a `nextval()` sequence — that got dropped during the rename.
This left 27 tables with no DEFAULT on `uuid`. Additionally, 4 tables
(comments module + role_permissions) had `gen_random_uuid()` (UUIDv4) instead
of `uuid_generate_v7()` (UUIDv7).
While Ecto generates UUIDs in the app layer (`autogenerate: true`), a DB-level
DEFAULT is important for:
- Raw SQL inserts (e.g. migration scripts, manual fixes)
- Defensive safety if Ecto doesn't provide a value
## Changes
1. **Set DEFAULT uuid_generate_v7()** on 27 tables missing it (Category A)
2. **Fix DEFAULT** on 4 tables using gen_random_uuid() → uuid_generate_v7()
3. **Drop orphaned sequence** `phoenix_kit_id_seq` (CASCADE — also drops the DEFAULT
on `phoenix_kit.id` meta table column that references it)
"""
use Ecto.Migration
# Tables where uuid column has NO DEFAULT (Category A — V72 renamed id→uuid)
@missing_default_tables ~w(
phoenix_kit_buckets
phoenix_kit_comment_dislikes
phoenix_kit_comment_likes
phoenix_kit_file_instances
phoenix_kit_file_locations
phoenix_kit_files
phoenix_kit_post_comments
phoenix_kit_post_dislikes
phoenix_kit_post_groups
phoenix_kit_post_likes
phoenix_kit_post_media
phoenix_kit_post_mentions
phoenix_kit_post_tags
phoenix_kit_post_views
phoenix_kit_posts
phoenix_kit_scheduled_jobs
phoenix_kit_storage_dimensions
phoenix_kit_ticket_attachments
phoenix_kit_ticket_comments
phoenix_kit_ticket_status_history
phoenix_kit_tickets
phoenix_kit_user_blocks
phoenix_kit_user_blocks_history
phoenix_kit_user_connections
phoenix_kit_user_connections_history
phoenix_kit_user_follows
phoenix_kit_user_follows_history
)
# Tables where uuid DEFAULT is gen_random_uuid() (wrong — should be uuid_generate_v7())
@wrong_default_tables ~w(
phoenix_kit_comments
phoenix_kit_comments_dislikes
phoenix_kit_comments_likes
phoenix_kit_role_permissions
)
def up(%{prefix: prefix} = opts) do
escaped_prefix = Map.get(opts, :escaped_prefix, prefix)
flush()
# Step 1: Set DEFAULT on tables missing it
for table <- @missing_default_tables do
if table_exists?(table, escaped_prefix) do
execute(
"ALTER TABLE #{prefix_table(table, prefix)} ALTER COLUMN uuid SET DEFAULT uuid_generate_v7()"
)
end
end
# Step 2: Fix wrong DEFAULT (gen_random_uuid → uuid_generate_v7)
for table <- @wrong_default_tables do
if table_exists?(table, escaped_prefix) do
execute(
"ALTER TABLE #{prefix_table(table, prefix)} ALTER COLUMN uuid SET DEFAULT uuid_generate_v7()"
)
end
end
# Step 3: Drop orphaned sequence (CASCADE needed — phoenix_kit meta table's
# id column DEFAULT still references it; dropping the default is safe since
# the meta table is empty and version is tracked via table COMMENT)
execute("DROP SEQUENCE IF EXISTS #{prefix_table("phoenix_kit_id_seq", prefix)} CASCADE")
execute("COMMENT ON TABLE #{prefix_table("phoenix_kit", prefix)} IS '75'")
end
def down(%{prefix: prefix} = _opts) do
# Reversing defaults is not meaningful — just restore version comment
execute("COMMENT ON TABLE #{prefix_table("phoenix_kit", prefix)} IS '74'")
end
# ---------------------------------------------------------------------------
# Introspection Helpers
# ---------------------------------------------------------------------------
defp table_exists?(table, escaped_prefix) do
case repo().query(
"""
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_name = '#{table}'
AND table_schema = '#{escaped_prefix}'
)
""",
[],
log: false
) do
{:ok, %{rows: [[true]]}} -> true
_ -> false
end
end
defp prefix_table(table_name, nil), do: table_name
defp prefix_table(table_name, "public"), do: "public.#{table_name}"
defp prefix_table(table_name, prefix), do: "#{prefix}.#{table_name}"
end