Packages

phoenix_kit

1.7.93
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 v54.ex
Raw

lib/phoenix_kit/migrations/postgres/v54.ex

defmodule PhoenixKit.Migrations.Postgres.V54 do
@moduledoc """
V54: Category Featured Product + Import Config download_images
Categories currently have two image fields: image_id (Storage upload) and
image_url (external URL fallback). This migration replaces image_url with
featured_product_id — a FK to products — so the category image automatically
comes from a representative product.
Also adds the missing download_images column to import_configs that was
present in the Ecto schema but never added via migration.
## Changes
- Adds featured_product_id BIGINT column to categories with FK to products
- Creates index on featured_product_id
- Auto-populates featured_product_id for categories without image_id
(picks first active product with featured_image_id)
- Drops image_url column
- Adds download_images BOOLEAN column to import_configs (default: false)
## Image Resolution Priority (new)
1. image_id — direct Storage upload (unchanged)
2. featured_product_id → product's featured_image_id
"""
use Ecto.Migration
def up(%{prefix: prefix} = _opts) do
prefix_str = if prefix && prefix != "public", do: "#{prefix}.", else: ""
# Step 1: Add featured_product_id column with FK (IF NOT EXISTS for idempotency)
execute """
ALTER TABLE #{prefix_str}phoenix_kit_shop_categories
ADD COLUMN IF NOT EXISTS featured_product_id BIGINT
REFERENCES #{prefix_str}phoenix_kit_shop_products(id) ON DELETE SET NULL
"""
# Step 2: Create index
execute """
CREATE INDEX IF NOT EXISTS idx_shop_categories_featured_product
ON #{prefix_str}phoenix_kit_shop_categories(featured_product_id)
"""
# Step 3: Auto-populate for categories without image_id
# Pick first active product with featured_image_id per category
execute """
UPDATE #{prefix_str}phoenix_kit_shop_categories c
SET featured_product_id = sub.product_id
FROM (
SELECT DISTINCT ON (p.category_id) p.category_id, p.id AS product_id
FROM #{prefix_str}phoenix_kit_shop_products p
WHERE p.status = 'active' AND p.featured_image_id IS NOT NULL
ORDER BY p.category_id, p.id
) sub
WHERE c.id = sub.category_id AND c.image_id IS NULL
"""
# Step 4: Drop image_url column
execute """
ALTER TABLE #{prefix_str}phoenix_kit_shop_categories
DROP COLUMN IF EXISTS image_url
"""
# Step 5: Add download_images to import_configs (was in schema but missing from DB)
execute """
ALTER TABLE #{prefix_str}phoenix_kit_shop_import_configs
ADD COLUMN IF NOT EXISTS download_images BOOLEAN DEFAULT false
"""
# Record migration version
execute "COMMENT ON TABLE #{prefix_str}phoenix_kit IS '54'"
end
def down(%{prefix: prefix} = _opts) do
prefix_str = if prefix && prefix != "public", do: "#{prefix}.", else: ""
# Drop download_images from import_configs
execute """
ALTER TABLE #{prefix_str}phoenix_kit_shop_import_configs
DROP COLUMN IF EXISTS download_images
"""
# Restore image_url column
execute """
ALTER TABLE #{prefix_str}phoenix_kit_shop_categories
ADD COLUMN image_url TEXT
"""
# Drop index
execute """
DROP INDEX IF EXISTS #{prefix_str}idx_shop_categories_featured_product
"""
# Drop featured_product_id column
execute """
ALTER TABLE #{prefix_str}phoenix_kit_shop_categories
DROP COLUMN IF EXISTS featured_product_id
"""
# Record migration version
execute "COMMENT ON TABLE #{prefix_str}phoenix_kit IS '53'"
end
end