Packages

phoenix_kit

1.7.112
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 v78.ex
Raw

lib/phoenix_kit/migrations/postgres/v78.ex

defmodule PhoenixKit.Migrations.Postgres.V78 do
@moduledoc """
V78: Add missing columns to AI tables from V41.
V41 conditionally added columns to AI tables (reasoning columns on endpoints,
prompt tracking on requests), but only if the tables existed at the time.
If the AI module was enabled after V41 ran, these columns were never created.
This migration ensures they exist. All operations are idempotent.
"""
use Ecto.Migration
def up(opts) do
prefix = Map.get(opts, :prefix, "public")
# Reasoning columns on endpoints (from V41)
if table_exists?(:phoenix_kit_ai_endpoints, prefix) do
alter table(:phoenix_kit_ai_endpoints, prefix: prefix) do
add_if_not_exists :reasoning_enabled, :boolean
add_if_not_exists :reasoning_effort, :string, size: 20
add_if_not_exists :reasoning_max_tokens, :integer
add_if_not_exists :reasoning_exclude, :boolean
end
end
# Prompt tracking columns on requests (from V41)
if table_exists?(:phoenix_kit_ai_requests, prefix) do
alter table(:phoenix_kit_ai_requests, prefix: prefix) do
add_if_not_exists :prompt_uuid, :uuid
add_if_not_exists :prompt_name, :string, size: 255
end
create_if_not_exists index(:phoenix_kit_ai_requests, [:prompt_uuid],
name: :phoenix_kit_ai_requests_prompt_uuid_idx,
prefix: prefix
)
if table_exists?(:phoenix_kit_ai_prompts, prefix) do
# V56 skips tables that don't exist yet, so ai_prompts may lack a uuid
# column if the AI module was enabled after V56 ran. Ensure it exists.
ensure_uuid_column(:phoenix_kit_ai_prompts, prefix)
execute """
DO $$
BEGIN
IF NOT EXISTS (
SELECT 1 FROM pg_constraint
WHERE conname = 'phoenix_kit_ai_requests_prompt_uuid_fkey'
AND conrelid = '#{prefix_str(prefix)}phoenix_kit_ai_requests'::regclass
) THEN
ALTER TABLE #{prefix_str(prefix)}phoenix_kit_ai_requests
ADD CONSTRAINT phoenix_kit_ai_requests_prompt_uuid_fkey
FOREIGN KEY (prompt_uuid)
REFERENCES #{prefix_str(prefix)}phoenix_kit_ai_prompts(uuid)
ON DELETE SET NULL;
END IF;
END $$;
"""
end
end
execute "COMMENT ON TABLE #{prefix_str(prefix)}phoenix_kit IS '78'"
end
def down(opts) do
prefix = Map.get(opts, :prefix, "public")
if table_exists?(:phoenix_kit_ai_endpoints, prefix) do
alter table(:phoenix_kit_ai_endpoints, prefix: prefix) do
remove_if_exists :reasoning_enabled, :boolean
remove_if_exists :reasoning_effort, :string
remove_if_exists :reasoning_max_tokens, :integer
remove_if_exists :reasoning_exclude, :boolean
end
end
if table_exists?(:phoenix_kit_ai_requests, prefix) do
execute """
DO $$
BEGIN
IF EXISTS (
SELECT 1 FROM pg_constraint
WHERE conname = 'phoenix_kit_ai_requests_prompt_uuid_fkey'
AND conrelid = '#{prefix_str(prefix)}phoenix_kit_ai_requests'::regclass
) THEN
ALTER TABLE #{prefix_str(prefix)}phoenix_kit_ai_requests
DROP CONSTRAINT phoenix_kit_ai_requests_prompt_uuid_fkey;
END IF;
END $$;
"""
drop_if_exists index(:phoenix_kit_ai_requests, [:prompt_uuid],
name: :phoenix_kit_ai_requests_prompt_uuid_idx,
prefix: prefix
)
alter table(:phoenix_kit_ai_requests, prefix: prefix) do
remove_if_exists :prompt_uuid, :uuid
remove_if_exists :prompt_name, :string
end
end
execute "COMMENT ON TABLE #{prefix_str(prefix)}phoenix_kit IS '77'"
end
defp table_exists?(table_name, prefix) do
query = """
SELECT EXISTS (
SELECT FROM information_schema.tables
WHERE table_schema = '#{prefix}'
AND table_name = '#{table_name}'
)
"""
%{rows: [[exists]]} = PhoenixKit.RepoHelper.repo().query!(query)
exists
end
# Idempotently adds uuid column + backfill + NOT NULL + unique index.
# All statements use IF NOT EXISTS / IF NULL guards, safe to run on tables
# that already have the column.
defp ensure_uuid_column(table_name, prefix) do
full_table = "#{prefix_str(prefix)}#{table_name}"
execute("""
ALTER TABLE #{full_table}
ADD COLUMN IF NOT EXISTS uuid UUID DEFAULT uuid_generate_v7()
""")
execute("UPDATE #{full_table} SET uuid = uuid_generate_v7() WHERE uuid IS NULL")
execute("ALTER TABLE #{full_table} ALTER COLUMN uuid SET NOT NULL")
execute("""
CREATE UNIQUE INDEX IF NOT EXISTS #{table_name}_uuid_index ON #{full_table}(uuid)
""")
end
defp prefix_str("public"), do: "public."
defp prefix_str(prefix), do: "#{prefix}."
end