113 lines
3.8 KiB
JavaScript
113 lines
3.8 KiB
JavaScript
/**
|
|
* POS-002 — Add `store_id` to `inventory_stock` and `inventory_movements`.
|
|
*
|
|
* Steps in `up()`:
|
|
* 1. Add `store_id` as a NULLABLE column (so the backfill doesn't fail).
|
|
* 2. Backfill every existing row with the well-known default store UUID.
|
|
* 3. Make `store_id` NOT NULL and add the FK to `pos_stores`.
|
|
* 4. Drop the old single-column unique constraint on `inventory_stock.variant_id`.
|
|
* 5. Add the new composite unique constraint `(variant_id, store_id)`.
|
|
* 6. Mirror the same 5-step pattern for `inventory_movements` (without the
|
|
* unique constraint, since movements don't have a UNIQUE invariant).
|
|
*
|
|
* Idempotent: every ALTER uses `IF NOT EXISTS` / `IF EXISTS` / `DO` blocks
|
|
* so re-running is a no-op.
|
|
*
|
|
* @param {import('node-pg-migrate').MigrationBuilder} pgm
|
|
*/
|
|
|
|
const DEFAULT_STORE_ID = '00000000-0000-0000-0000-000000000001';
|
|
|
|
export const up = async (pgm) => {
|
|
// ── inventory_stock ───────────────────────────────────────────────────────
|
|
pgm.sql(`
|
|
ALTER TABLE inventory_stock
|
|
ADD COLUMN IF NOT EXISTS store_id uuid
|
|
`);
|
|
pgm.sql(`
|
|
UPDATE inventory_stock
|
|
SET store_id = '${DEFAULT_STORE_ID}'
|
|
WHERE store_id IS NULL
|
|
`);
|
|
pgm.sql(`
|
|
ALTER TABLE inventory_stock
|
|
ALTER COLUMN store_id SET NOT NULL
|
|
`);
|
|
pgm.sql(`
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_constraint
|
|
WHERE conname = 'inventory_stock_store_id_fkey'
|
|
) THEN
|
|
ALTER TABLE inventory_stock
|
|
ADD CONSTRAINT inventory_stock_store_id_fkey
|
|
FOREIGN KEY (store_id) REFERENCES pos_stores(id) ON DELETE RESTRICT;
|
|
END IF;
|
|
END $$
|
|
`);
|
|
pgm.sql(`ALTER TABLE inventory_stock DROP CONSTRAINT IF EXISTS inventory_stock_variant_id_key`);
|
|
pgm.sql(`
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_constraint
|
|
WHERE conname = 'inventory_stock_variant_store_unique'
|
|
) THEN
|
|
ALTER TABLE inventory_stock
|
|
ADD CONSTRAINT inventory_stock_variant_store_unique
|
|
UNIQUE (variant_id, store_id);
|
|
END IF;
|
|
END $$
|
|
`);
|
|
|
|
// ── inventory_movements ──────────────────────────────────────────────────
|
|
pgm.sql(`
|
|
ALTER TABLE inventory_movements
|
|
ADD COLUMN IF NOT EXISTS store_id uuid
|
|
`);
|
|
pgm.sql(`
|
|
UPDATE inventory_movements
|
|
SET store_id = '${DEFAULT_STORE_ID}'
|
|
WHERE store_id IS NULL
|
|
`);
|
|
pgm.sql(`
|
|
ALTER TABLE inventory_movements
|
|
ALTER COLUMN store_id SET NOT NULL
|
|
`);
|
|
pgm.sql(`
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_constraint
|
|
WHERE conname = 'inventory_movements_store_id_fkey'
|
|
) THEN
|
|
ALTER TABLE inventory_movements
|
|
ADD CONSTRAINT inventory_movements_store_id_fkey
|
|
FOREIGN KEY (store_id) REFERENCES pos_stores(id) ON DELETE RESTRICT;
|
|
END IF;
|
|
END $$
|
|
`);
|
|
};
|
|
|
|
export const down = (pgm) => {
|
|
pgm.sql(`ALTER TABLE inventory_movements DROP CONSTRAINT IF EXISTS inventory_movements_store_id_fkey`);
|
|
pgm.sql(`ALTER TABLE inventory_movements DROP COLUMN IF EXISTS store_id`);
|
|
|
|
pgm.sql(`ALTER TABLE inventory_stock DROP CONSTRAINT IF EXISTS inventory_stock_variant_store_unique`);
|
|
pgm.sql(`
|
|
DO $$
|
|
BEGIN
|
|
IF NOT EXISTS (
|
|
SELECT 1 FROM pg_constraint
|
|
WHERE conname = 'inventory_stock_variant_id_key'
|
|
) THEN
|
|
ALTER TABLE inventory_stock
|
|
ADD CONSTRAINT inventory_stock_variant_id_key UNIQUE (variant_id);
|
|
END IF;
|
|
END $$
|
|
`);
|
|
pgm.sql(`ALTER TABLE inventory_stock DROP CONSTRAINT IF EXISTS inventory_stock_store_id_fkey`);
|
|
pgm.sql(`ALTER TABLE inventory_stock DROP COLUMN IF EXISTS store_id`);
|
|
};
|