Packages

phoenix_kit

1.7.66
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
phoenix_kit lib phoenix_kit migrations postgres v30.ex
Raw

lib/phoenix_kit/migrations/postgres/v30.ex

defmodule PhoenixKit.Migrations.Postgres.V30 do
@moduledoc """
Migration V30: Move preferred_locale from column to custom_fields JSONB.
This migration removes the dedicated `preferred_locale` column and stores
the value in the existing `custom_fields` JSONB column instead. This reduces
schema complexity by leveraging the flexible JSONB storage for user preferences.
## Changes
- Migrates existing `preferred_locale` values into `custom_fields` JSONB
- Drops the `preferred_locale` index
- Drops the `preferred_locale` column
## Requirements
- PostgreSQL database
- PhoenixKit V29 or higher
- The `custom_fields` JSONB column must exist (added in V18)
## Data Migration
Existing preferred_locale values are preserved by copying them into custom_fields:
- `user.preferred_locale = "en-GB"` becomes `user.custom_fields["preferred_locale"] = "en-GB"`
- NULL values are not migrated (same behavior: use system default)
## Backward Compatibility
- Reading: `get_in(user.custom_fields, ["preferred_locale"])` or `user.custom_fields["preferred_locale"]`
- Writing: Merge into custom_fields map
- NULL handling: Missing key = use system default (same as before)
## Rollback
The down migration restores the column and migrates data back from custom_fields.
"""
use Ecto.Migration
def up(%{prefix: prefix} = _opts) do
# Only migrate and remove if preferred_locale column exists
# (column may not exist if V28 was skipped or fresh install)
if column_exists?(:phoenix_kit_users, :preferred_locale, prefix) do
# Step 1: Migrate existing preferred_locale data to custom_fields
execute """
UPDATE #{prefix_table_name("phoenix_kit_users", prefix)}
SET custom_fields = COALESCE(custom_fields, '{}'::jsonb) || jsonb_build_object('preferred_locale', preferred_locale)
WHERE preferred_locale IS NOT NULL
"""
# Step 2: Drop the index on preferred_locale
drop_if_exists index(:phoenix_kit_users, [:preferred_locale], prefix: prefix)
# Step 3: Drop the preferred_locale column
alter table(:phoenix_kit_users, prefix: prefix) do
remove :preferred_locale
end
end
# Update version comment on phoenix_kit table for version tracking (always run)
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '30'"
end
def down(%{prefix: prefix} = _opts) do
# Step 1: Add the column back
alter table(:phoenix_kit_users, prefix: prefix) do
add :preferred_locale, :string, size: 10
end
# Step 2: Create the index
create index(:phoenix_kit_users, [:preferred_locale], prefix: prefix)
# Step 3: Migrate data from custom_fields back to the column
execute """
UPDATE #{prefix_table_name("phoenix_kit_users", prefix)}
SET preferred_locale = custom_fields->>'preferred_locale'
WHERE custom_fields->>'preferred_locale' IS NOT NULL
"""
# Step 4: Remove the key from custom_fields
execute """
UPDATE #{prefix_table_name("phoenix_kit_users", prefix)}
SET custom_fields = custom_fields - 'preferred_locale'
WHERE custom_fields ? 'preferred_locale'
"""
# Update version comment on phoenix_kit table to previous version
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '29'"
end
# Helper functions
defp prefix_table_name(table_name, nil), do: table_name
defp prefix_table_name(table_name, prefix), do: "#{prefix}.#{table_name}"
defp column_exists?(table, column, prefix) do
schema = prefix || "public"
query = """
SELECT EXISTS (
SELECT 1 FROM information_schema.columns
WHERE table_schema = '#{schema}'
AND table_name = '#{table}'
AND column_name = '#{column}'
)
"""
%{rows: [[exists]]} = get_repo().query!(query)
exists
end
defp get_repo do
Application.get_env(:phoenix_kit, :repo) || raise "PhoenixKit repo not configured"
end
end