Packages

phoenix_kit

1.7.212
1.7.213 1.7.212 1.7.211 1.7.210 1.7.209 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 v146.ex
Raw

lib/phoenix_kit/migrations/postgres/v146.ex

defmodule PhoenixKit.Migrations.Postgres.V146 do
@moduledoc """
V146: `primary_supplier_uuid` on catalogue items.
Backs `phoenix_kit_catalogue`'s per-item default supplier (upstream
catalogue commit 2e47cdf): lets an item specify a supplier directly,
independent of manufacturer — needed for generic/unbranded materials
that have no brand to resolve a supplier through, and to break ties
when a manufacturer has more than one linked supplier.
- Nullable `primary_supplier_uuid` FK → `phoenix_kit_cat_suppliers(uuid)`
with `ON DELETE SET NULL` — the pointer is an optional default; the
item must survive its supplier (mirrors `category_uuid`'s nilify
semantics, deliberately NOT `manufacturer_uuid`'s delete_all).
- Partial index on `(primary_supplier_uuid) WHERE NOT NULL` for the
"items defaulting to this supplier" reverse lookup.
Idempotent + prefix-safe: bare index name on CREATE, all existence
checks schema-anchored, FK constraint checked via `pg_constraint`
anchored to the prefixed table (the V51 idiom).
"""
use Ecto.Migration
def up(%{prefix: prefix} = opts) do
escaped_prefix = Map.get(opts, :escaped_prefix, prefix)
p = prefix_str(prefix)
# Flush queued commands so the immediate pg_constraint check below sees
# phoenix_kit_cat_items — on a fresh chain V87's CREATE TABLE is still
# queued at this point, and an immediate query touching a missing
# relation would abort the whole migration transaction.
flush()
execute("""
ALTER TABLE #{p}phoenix_kit_cat_items
ADD COLUMN IF NOT EXISTS primary_supplier_uuid UUID
""")
unless constraint_exists?(escaped_prefix, p) do
execute("""
ALTER TABLE #{p}phoenix_kit_cat_items
ADD CONSTRAINT phoenix_kit_cat_items_primary_supplier_uuid_fkey
FOREIGN KEY (primary_supplier_uuid)
REFERENCES #{p}phoenix_kit_cat_suppliers(uuid)
ON DELETE SET NULL
""")
end
execute("""
CREATE INDEX IF NOT EXISTS phoenix_kit_cat_items_primary_supplier_uuid_index
ON #{p}phoenix_kit_cat_items (primary_supplier_uuid)
WHERE primary_supplier_uuid IS NOT NULL
""")
execute("COMMENT ON TABLE #{p}phoenix_kit IS '146'")
end
def down(%{prefix: prefix} = _opts) do
p = prefix_str(prefix)
execute("DROP INDEX IF EXISTS #{p}phoenix_kit_cat_items_primary_supplier_uuid_index")
execute("""
ALTER TABLE #{p}phoenix_kit_cat_items
DROP CONSTRAINT IF EXISTS phoenix_kit_cat_items_primary_supplier_uuid_fkey
""")
execute("""
ALTER TABLE #{p}phoenix_kit_cat_items
DROP COLUMN IF EXISTS primary_supplier_uuid
""")
execute("COMMENT ON TABLE #{p}phoenix_kit IS '145'")
end
# Immediate check; anchored to the prefixed table so a public install's
# constraint can't satisfy the check for a prefixed one. Deliberately a
# name-based JOIN rather than the `'table'::regclass` idiom: a regclass
# cast RAISES when the relation doesn't exist yet, which aborts the whole
# migration transaction (and a rescue can't unpoison it).
defp constraint_exists?(escaped_prefix, _p) do
query = """
SELECT EXISTS (
SELECT FROM pg_constraint c
JOIN pg_class t ON t.oid = c.conrelid
JOIN pg_namespace n ON n.oid = t.relnamespace
WHERE c.conname = 'phoenix_kit_cat_items_primary_supplier_uuid_fkey'
AND t.relname = 'phoenix_kit_cat_items'
AND n.nspname = $1
)
"""
case repo().query(query, [escaped_prefix], log: false) do
{:ok, %{rows: [[true]]}} -> true
_ -> false
end
end
defp prefix_str("public"), do: "public."
defp prefix_str(prefix), do: "#{prefix}."
end