Packages
phoenix_kit
1.7.57
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/v12.ex
defmodule PhoenixKit.Migrations.Postgres.V12 do
@moduledoc """
PhoenixKit V12 Migration: JSON Settings Support
This migration adds JSONB support to the settings system, enabling storage
of complex structured data alongside traditional string-based settings.
## Changes
### Settings Table Enhancement
- Adds value_json column to phoenix_kit_settings table
- Uses PostgreSQL JSONB type for optimal performance and indexing
- Nullable field maintains backward compatibility
- Supports complex configuration objects and arrays
### New Features
- **JSON Data Storage**: Store complex objects, arrays, and nested data
- **Native JSONB Performance**: PostgreSQL's optimized JSONB operations
- **Backward Compatible**: Existing string settings continue to work
- **Dual Storage Model**: Settings can use either string OR JSON values
- **Cache Integration**: JSON data cached efficiently with existing system
## PostgreSQL Support
- Leverages PostgreSQL's native JSONB data type
- Supports prefix for schema isolation
- Optimal storage and query performance for JSON data
- Safe nullable field addition (no data migration required)
## Usage Examples
# Traditional string setting (unchanged)
PhoenixKit.Settings.update_setting("theme", "dark")
# New JSON setting
config = %{
"colors" => %{"primary" => "#3b82f6", "secondary" => "#64748b"},
"features" => ["dark_mode", "notifications"],
"limits" => %{"max_users" => 1000, "storage_gb" => 100}
}
PhoenixKit.Settings.update_json_setting("app_config", config)
"""
use Ecto.Migration
@doc """
Run the V12 migration to add JSON support to settings.
"""
def up(%{prefix: prefix} = _opts) do
# Add value_json column to existing phoenix_kit_settings table
alter table(:phoenix_kit_settings, prefix: prefix) do
# JSON/JSONB storage for complex configuration data
# Using :map type which maps to JSONB in PostgreSQL
# Null means this setting uses the traditional string value field
add :value_json, :map, null: true
end
# Remove NOT NULL constraint from value column to support JSON-only settings
execute """
ALTER TABLE #{prefix_table_name("phoenix_kit_settings", prefix)}
ALTER COLUMN value DROP NOT NULL
"""
# Add comments to document the new capabilities
execute """
COMMENT ON COLUMN #{prefix_table_name("phoenix_kit_settings", prefix)}.value_json IS
'JSONB storage for complex settings data. When present, takes precedence over value field.'
"""
execute """
COMMENT ON COLUMN #{prefix_table_name("phoenix_kit_settings", prefix)}.value IS
'String value for simple settings. Can be NULL when using value_json for complex data.'
"""
# Set version comment on phoenix_kit table for version tracking
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '12'"
end
@doc """
Rollback the V12 migration.
"""
def down(%{prefix: prefix} = _opts) do
# First, clean up any NULL values in the value column by setting them to empty strings
execute """
UPDATE #{prefix_table_name("phoenix_kit_settings", prefix)}
SET value = ''
WHERE value IS NULL AND value_json IS NOT NULL
"""
# Restore NOT NULL constraint on value column
execute """
ALTER TABLE #{prefix_table_name("phoenix_kit_settings", prefix)}
ALTER COLUMN value SET NOT NULL
"""
# Remove value_json column from settings table
alter table(:phoenix_kit_settings, prefix: prefix) do
remove :value_json
end
# Restore original comment
execute """
COMMENT ON COLUMN #{prefix_table_name("phoenix_kit_settings", prefix)}.value IS
'String value for settings (required).'
"""
# Update version comment on phoenix_kit table
execute "COMMENT ON TABLE #{prefix_table_name("phoenix_kit", prefix)} IS '11'"
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}"
end