Packages
phoenix_kit
1.7.197
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/v04.ex
defmodule PhoenixKit.Migrations.Postgres.V04 do
@moduledoc """
PhoenixKit V04 Migration: Settings Module Column + Referral System
This migration adds modular settings support and implements the referral system
for enhanced user management and feature organization.
## Changes
### Settings Table Enhancement
- Adds module column to phoenix_kit_settings table for feature-specific settings
- Updates existing settings with appropriate module associations
- Maintains backward compatibility with existing settings
### Referral System
- Adds phoenix_kit_referral_codes table for managing referral codes
- Adds phoenix_kit_referral_code_usage table for tracking code usage
- Supports referral code creation, validation, and usage tracking
- Integrates with settings system for referral-specific configuration
## PostgreSQL Support
- Supports PostgreSQL prefix for schema isolation
- Proper foreign key relationships and constraints
- Optimized indexes for performance
"""
use Ecto.Migration
@doc """
Run the V04 migration to add module column and referral system.
"""
def up(%{prefix: prefix} = _opts) do
# Add module column to existing settings table
alter table(:phoenix_kit_settings, prefix: prefix) do
add :module, :string, null: true
end
# Create referral codes table
create_if_not_exists table(:phoenix_kit_referral_codes, prefix: prefix) do
add :code, :string, null: false
add :description, :string, null: false
add :status, :boolean, null: false, default: true
add :number_of_uses, :integer, null: false, default: 0
add :max_uses, :integer, null: false
add :created_by, :integer, null: false
add :date_created, :utc_datetime_usec, null: false, default: fragment("NOW()")
add :expiration_date, :utc_datetime_usec, null: false
end
# Create referral code usage tracking table
create_if_not_exists table(:phoenix_kit_referral_code_usage, prefix: prefix) do
add :code_id, :integer, null: false
add :used_by, :integer, null: false
add :date_used, :utc_datetime_usec, null: false, default: fragment("NOW()")
end
# Add unique constraint on referral code string
create_if_not_exists unique_index(:phoenix_kit_referral_codes, [:code],
prefix: prefix,
name: :phoenix_kit_referral_codes_code_uidx
)
# Add foreign key constraint for referral code usage
create_if_not_exists index(:phoenix_kit_referral_code_usage, [:code_id],
prefix: prefix,
name: :phoenix_kit_referral_code_usage_code_id_idx
)
create_if_not_exists index(:phoenix_kit_referral_code_usage, [:used_by],
prefix: prefix,
name: :phoenix_kit_referral_code_usage_used_by_idx
)
create_if_not_exists index(:phoenix_kit_referral_code_usage, [:date_used],
prefix: prefix,
name: :phoenix_kit_referral_code_usage_date_used_idx
)
# Add foreign key constraint for referral code usage to referral codes
alter table(:phoenix_kit_referral_code_usage, prefix: prefix) do
modify :code_id,
references(:phoenix_kit_referral_codes, on_delete: :delete_all, prefix: prefix)
end
# Update existing settings to assign them to core system module
execute """
UPDATE #{prefix_table_name("phoenix_kit_settings", prefix)}
SET module = 'system'
WHERE key IN ('time_zone', 'date_format', 'time_format', 'project_title')
"""
# Set version comment on phoenix_kit table for version tracking
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '4'"
end
# Helper function to build table name with prefix
defp prefix_table_name(table_name, nil), do: table_name
defp prefix_table_name(table_name, prefix), do: "#{prefix}.#{table_name}"
def down(%{prefix: prefix} = _opts) do
# Drop indexes and constraints first
drop_if_exists index(:phoenix_kit_referral_code_usage, [:date_used],
prefix: prefix,
name: :phoenix_kit_referral_code_usage_date_used_idx
)
drop_if_exists index(:phoenix_kit_referral_code_usage, [:used_by],
prefix: prefix,
name: :phoenix_kit_referral_code_usage_used_by_idx
)
drop_if_exists index(:phoenix_kit_referral_code_usage, [:code_id],
prefix: prefix,
name: :phoenix_kit_referral_code_usage_code_id_idx
)
drop_if_exists index(:phoenix_kit_referral_codes, [:code],
prefix: prefix,
name: :phoenix_kit_referral_codes_code_uidx
)
# Drop referral system tables
drop_if_exists table(:phoenix_kit_referral_code_usage, prefix: prefix)
drop_if_exists table(:phoenix_kit_referral_codes, prefix: prefix)
# Remove module column from settings table
alter table(:phoenix_kit_settings, prefix: prefix) do
remove :module
end
# Set version comment back to V03
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '3'"
end
end