Packages

phoenix_kit

1.7.56
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 v02.ex
Raw

lib/phoenix_kit/migrations/postgres/v02.ex

defmodule PhoenixKit.Migrations.Postgres.V02 do
@moduledoc """
PhoenixKit Migration V02: Remove is_active column from role assignments.
This migration removes the is_active column from role assignments table,
simplifying the role system to use direct deletion instead of soft deletion.
## Changes
- Remove is_active column from phoenix_kit_user_role_assignments table
- Remove performance indexes that used is_active column
- Clean up existing inactive role assignments (convert to actual deletions)
## Migration Strategy
1. Remove inactive assignments (where is_active = false)
2. Drop indexes that reference is_active column
3. Drop is_active column from role assignments table
## Rollback Strategy
- Adds back is_active column with default true
- Recreates performance indexes
- All existing assignments become active by default
**Note**: This migration cannot preserve inactive assignment history.
Consider backing up inactive assignments if audit trail is required.
"""
use Ecto.Migration
@doc """
Run the V02 migration to remove is_active column.
"""
def up(%{prefix: prefix} = _opts) do
# Step 1: Clean up inactive role assignments
# This permanently removes assignments that were marked as inactive
execute("""
DELETE FROM #{prefix_table("phoenix_kit_user_role_assignments", prefix)}
WHERE is_active = false
""")
# Step 2: Drop performance indexes that reference is_active
drop_if_exists index(:phoenix_kit_user_role_assignments, [:user_id, :is_active],
prefix: prefix,
name: :idx_user_role_assignments_user_active
)
drop_if_exists index(:phoenix_kit_user_role_assignments, [:role_id, :is_active],
prefix: prefix,
name: :idx_user_role_assignments_role_active
)
# Step 3: Remove is_active column from role assignments table
alter table(:phoenix_kit_user_role_assignments, prefix: prefix) do
remove :is_active
end
# Update version comment on phoenix_kit table
execute "COMMENT ON TABLE #{prefix_table("phoenix_kit", prefix)} IS '2'"
end
@doc """
Rollback V02 migration by restoring is_active column.
**Warning**: This cannot restore previously deleted inactive assignments.
"""
def down(%{prefix: prefix} = _opts) do
# Step 1: Add back is_active column (all existing assignments become active)
alter table(:phoenix_kit_user_role_assignments, prefix: prefix) do
add :is_active, :boolean, default: true, null: false
end
# Step 2: Update all existing assignments to be active
execute("""
UPDATE #{prefix_table("phoenix_kit_user_role_assignments", prefix)}
SET is_active = true
""")
# Step 3: Recreate performance indexes
create_if_not_exists index(:phoenix_kit_user_role_assignments, [:user_id, :is_active],
prefix: prefix,
name: :idx_user_role_assignments_user_active
)
create_if_not_exists index(:phoenix_kit_user_role_assignments, [:role_id, :is_active],
prefix: prefix,
name: :idx_user_role_assignments_role_active
)
# Update version comment back to V01
execute "COMMENT ON TABLE #{prefix_table("phoenix_kit", prefix)} IS '1'"
end
# Helper function to build table name with optional prefix
defp prefix_table(table_name, nil), do: table_name
defp prefix_table(table_name, prefix) when is_binary(prefix), do: "#{prefix}.#{table_name}"
@doc """
Returns the migration version.
"""
def version, do: 2
@doc """
Returns migration description for logging and status display.
"""
def description do
"Remove is_active column from role assignments - simplify role system to use direct deletion"
end
@doc """
Returns whether this migration is destructive (cannot be safely rolled back).
"""
def destructive?, do: true
@doc """
Returns estimated migration time for progress tracking.
"""
def estimated_time, do: "< 1 minute"
@doc """
Validates prerequisites before running migration.
Ensures V01 migration has been applied.
"""
def validate_prerequisites(repo, prefix \\ nil) do
# Check if phoenix_kit_user_role_assignments table exists
table_exists_query = """
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_name = 'phoenix_kit_user_role_assignments'
#{if prefix, do: "AND table_schema = '#{prefix}'", else: ""}
)
"""
case repo.query(table_exists_query, []) do
{:ok, %{rows: [[true]]}} -> :ok
{:ok, %{rows: [[false]]}} -> {:error, "V01 migration must be applied first"}
{:error, reason} -> {:error, "Failed to check prerequisites: #{inspect(reason)}"}
end
end
@doc """
Pre-migration checks and warnings.
Counts inactive assignments that will be permanently deleted.
"""
def pre_migration_report(repo, prefix \\ nil) do
inactive_count_query = """
SELECT COUNT(*) FROM #{prefix_table("phoenix_kit_user_role_assignments", prefix)}
WHERE is_active = false
"""
case repo.query(inactive_count_query, []) do
{:ok, %{rows: [[count]]}} when count > 0 ->
{:warning, "#{count} inactive role assignments will be permanently deleted"}
{:ok, %{rows: [[0]]}} ->
{:ok, "No inactive assignments to clean up"}
{:error, reason} ->
{:error, "Failed to generate pre-migration report: #{inspect(reason)}"}
end
end
end