Packages
phoenix_kit
1.7.174
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/v134.ex
defmodule PhoenixKit.Migrations.Postgres.V134 do
@moduledoc """
V134: folder-header customization columns on `phoenix_kit_media_folders`.
Adds the fields backing the Media browser's folder hero header / "Edit header"
panel:
* `cover_file_uuid UUID` — background image (a normal uploaded file living in
the folder, excluded from its visible listing). FK to `phoenix_kit_files`
with `ON DELETE SET NULL` so deleting the file self-heals the reference.
* `logo_file_uuid UUID` — icon/logo shown in the header (same FK).
* `header_size TEXT NOT NULL DEFAULT 'medium'` — header height: small /
medium / large.
* `header_show_title`, `header_show_icon`, `header_show_creator`,
`header_show_date`, `header_show_file_count`, `header_show_description`,
`header_show_background` BOOLEAN — per-folder visibility toggles for each
header element (default on). Creator / date / file-count are independent
so users can show just the pieces they want.
All nullable / defaulted, so existing folders render the header as before.
Idempotent: `ADD COLUMN IF NOT EXISTS` plus guarded `ADD CONSTRAINT`, safe to
re-run.
"""
use Ecto.Migration
def up(opts) do
prefix = Map.get(opts, :prefix, "public")
p = prefix_str(prefix)
t = "#{p}phoenix_kit_media_folders"
files = "#{p}phoenix_kit_files"
execute("ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS cover_file_uuid UUID")
execute("ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS logo_file_uuid UUID")
execute(
"ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS header_size TEXT NOT NULL DEFAULT 'medium'"
)
execute(
"ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS header_show_title BOOLEAN NOT NULL DEFAULT TRUE"
)
execute(
"ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS header_show_icon BOOLEAN NOT NULL DEFAULT TRUE"
)
execute(
"ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS header_show_creator BOOLEAN NOT NULL DEFAULT TRUE"
)
execute(
"ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS header_show_date BOOLEAN NOT NULL DEFAULT TRUE"
)
execute(
"ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS header_show_file_count BOOLEAN NOT NULL DEFAULT TRUE"
)
execute(
"ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS header_show_description BOOLEAN NOT NULL DEFAULT TRUE"
)
execute(
"ALTER TABLE #{t} ADD COLUMN IF NOT EXISTS header_show_background BOOLEAN NOT NULL DEFAULT TRUE"
)
# FK cover_file_uuid / logo_file_uuid → phoenix_kit_files(uuid),
# ON DELETE SET NULL so deleting a file the header points at self-heals the
# reference instead of leaving it dangling. Null out any pre-existing
# dangling values first (a dev may have set a cover then deleted the file),
# then add the constraint only if it's missing (ADD CONSTRAINT has no
# IF NOT EXISTS, so guard via pg_constraint scoped to this table).
add_header_asset_fk(t, files, "cover_file_uuid")
add_header_asset_fk(t, files, "logo_file_uuid")
execute("COMMENT ON TABLE #{p}phoenix_kit IS '134'")
end
defp add_header_asset_fk(table, files, column) do
constraint = "phoenix_kit_media_folders_#{column}_fkey"
execute("""
UPDATE #{table} SET #{column} = NULL
WHERE #{column} IS NOT NULL
AND #{column} NOT IN (SELECT uuid FROM #{files})
""")
execute("""
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conname = '#{constraint}' AND conrelid = '#{table}'::regclass
) THEN
ALTER TABLE #{table}
ADD CONSTRAINT #{constraint}
FOREIGN KEY (#{column}) REFERENCES #{files}(uuid) ON DELETE SET NULL;
END IF;
END $$;
""")
end
def down(opts) do
prefix = Map.get(opts, :prefix, "public")
p = prefix_str(prefix)
t = "#{p}phoenix_kit_media_folders"
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS header_show_background")
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS header_show_description")
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS header_show_file_count")
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS header_show_date")
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS header_show_creator")
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS header_show_icon")
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS header_show_title")
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS header_size")
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS logo_file_uuid")
execute("ALTER TABLE #{t} DROP COLUMN IF EXISTS cover_file_uuid")
execute("COMMENT ON TABLE #{p}phoenix_kit IS '133'")
end
defp prefix_str("public"), do: "public."
defp prefix_str(prefix), do: "#{prefix}."
end