manicanldes-backend/prisma/migrations/20260909141622_commerce_int.../migration.sql

28 lines
1.3 KiB
PL/PgSQL

-- Positive prices, valid stock arithmetic and private-address defaults are
-- enforced in PostgreSQL in addition to request validation.
ALTER TABLE product_variants ADD CONSTRAINT variant_positive_price CHECK (price > 0);
ALTER TABLE stock_items ADD CONSTRAINT stock_nonnegative CHECK (on_hand >= 0);
ALTER TABLE stock_ledger ADD CONSTRAINT ledger_nonzero_delta CHECK (delta <> 0);
ALTER TABLE stock_reservations ADD CONSTRAINT reservation_positive_quantity CHECK (quantity > 0);
CREATE UNIQUE INDEX addresses_one_default ON addresses (user_id) WHERE is_default = true;
CREATE FUNCTION reject_stock_ledger_mutation() RETURNS trigger LANGUAGE plpgsql AS $$
BEGIN
RAISE EXCEPTION 'Stock ledger entries are append-only';
END;
$$;
CREATE TRIGGER stock_ledger_append_only
BEFORE UPDATE OR DELETE ON stock_ledger
FOR EACH ROW EXECUTE FUNCTION reject_stock_ledger_mutation();
-- Existing system-owner roles need the new permissions. Custom roles retain
-- their explicit grants and must be updated through the authorized API.
UPDATE roles SET permissions = ARRAY(
SELECT DISTINCT permission FROM unnest(permissions || ARRAY[
'catalog.read', 'catalog.manage', 'catalog.publish',
'inventory.read', 'inventory.manage', 'inventory.adjust',
'inventory.reserve', 'inventory.commit'
]::text[]) AS permission ORDER BY permission
) WHERE is_system = true;